Jlm
bitoperation-classes.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2014 Helge Bahmann <hcb@chaoticmind.net>
3  * Copyright 2011 2012 2013 2014 Nico Reißmann <nico.reissmann@gmail.com>
4  * See COPYING for terms of redistribution.
5  */
6 
9 #include <jlm/rvsdg/Trace.hpp>
10 
11 namespace jlm::rvsdg
12 {
13 
14 BitUnaryOperation::~BitUnaryOperation() noexcept = default;
15 
17 BitUnaryOperation::can_reduce_operand(const jlm::rvsdg::Output * arg) const noexcept
18 {
19  auto & tracedOperand = traceOutputIntraProcedurally(*arg);
20  if (rvsdg::IsOwnerNodeOperation<BitConstantOperation>(tracedOperand))
22 
23  return unop_reduction_none;
24 }
25 
28 {
29  if (path == unop_reduction_constant)
30  {
31  auto & tracedOperand = traceOutputIntraProcedurally(*arg);
32  auto [constantNode, constantOperation] =
33  rvsdg::TryGetSimpleNodeAndOptionalOp<BitConstantOperation>(tracedOperand);
35  *constantNode->region(),
36  reduce_constant(constantOperation->value()));
37  }
38 
39  return nullptr;
40 }
41 
42 BitBinaryOperation::~BitBinaryOperation() noexcept = default;
43 
45 BitBinaryOperation::can_reduce_operand_pair(
46  const jlm::rvsdg::Output * arg1,
47  const jlm::rvsdg::Output * arg2) const noexcept
48 {
49  auto & tracedOperand1 = traceOutputIntraProcedurally(*arg1);
50  auto & tracedOperand2 = traceOutputIntraProcedurally(*arg2);
51 
52  if (rvsdg::IsOwnerNodeOperation<BitConstantOperation>(tracedOperand1)
53  && rvsdg::IsOwnerNodeOperation<BitConstantOperation>(tracedOperand2))
55 
56  return binop_reduction_none;
57 }
58 
62  jlm::rvsdg::Output * arg1,
63  jlm::rvsdg::Output * arg2) const
64 {
65  if (path == binop_reduction_constants)
66  {
67  auto & tracedOperand1 = traceOutputIntraProcedurally(*arg1);
68  auto [constantNode1, constantOperation1] =
69  rvsdg::TryGetSimpleNodeAndOptionalOp<BitConstantOperation>(tracedOperand1);
70 
71  auto & tracedOperand2 = traceOutputIntraProcedurally(*arg2);
72  auto [constantNode2, constantOperation2] =
73  rvsdg::TryGetSimpleNodeAndOptionalOp<BitConstantOperation>(tracedOperand2);
74 
76  *arg1->region(),
77  reduce_constants(constantOperation1->value(), constantOperation2->value()));
78  }
79 
80  return nullptr;
81 }
82 
84 
86 BitCompareOperation::can_reduce_operand_pair(
87  const jlm::rvsdg::Output * arg1,
88  const jlm::rvsdg::Output * arg2) const noexcept
89 {
90  auto & tracedOperand1 = traceOutputIntraProcedurally(*arg1);
91  auto [constantNode1, constantOperation1] =
92  rvsdg::TryGetSimpleNodeAndOptionalOp<BitConstantOperation>(tracedOperand1);
93  auto & tracedOperand2 = traceOutputIntraProcedurally(*arg2);
94  auto [constantNode2, constantOperation2] =
95  rvsdg::TryGetSimpleNodeAndOptionalOp<BitConstantOperation>(tracedOperand2);
96 
97  BitValueRepresentation arg1_repr = constantOperation1
98  ? constantOperation1->value()
99  : BitValueRepresentation::repeat(type().nbits(), 'D');
100  BitValueRepresentation arg2_repr = constantOperation2
101  ? constantOperation2->value()
102  : BitValueRepresentation::repeat(type().nbits(), 'D');
103 
104  switch (reduce_constants(arg1_repr, arg2_repr))
105  {
107  return 1;
109  return 2;
111  return binop_reduction_none;
112  }
113 
114  return binop_reduction_none;
115 }
116 
120  jlm::rvsdg::Output * arg1,
121  jlm::rvsdg::Output *) const
122 {
123  if (path == 1)
124  {
126  }
127  if (path == 2)
128  {
130  }
131 
132  return nullptr;
133 }
134 
135 }
~BitBinaryOperation() noexcept override
virtual BitValueRepresentation reduce_constants(const BitValueRepresentation &arg1, const BitValueRepresentation &arg2) const =0
jlm::rvsdg::Output * reduce_operand_pair(binop_reduction_path_t path, jlm::rvsdg::Output *arg1, jlm::rvsdg::Output *arg2) const override
jlm::rvsdg::Output * reduce_operand_pair(binop_reduction_path_t path, jlm::rvsdg::Output *arg1, jlm::rvsdg::Output *arg2) const override
~BitCompareOperation() noexcept override
static Output & create(Region &region, BitValueRepresentation value)
Definition: constant.hpp:44
~BitUnaryOperation() noexcept override
jlm::rvsdg::Output * reduce_operand(unop_reduction_path_t path, jlm::rvsdg::Output *arg) const override
virtual BitValueRepresentation reduce_constant(const BitValueRepresentation &arg) const =0
static BitValueRepresentation repeat(size_t nbits, char bit)
rvsdg::Region * region() const noexcept
Definition: node.cpp:151
size_t unop_reduction_path_t
Definition: unary.hpp:18
static const binop_reduction_path_t binop_reduction_constants
Definition: binary.hpp:205
static std::string type(const Node *n)
Definition: view.cpp:255
size_t binop_reduction_path_t
Definition: binary.hpp:19
static const unop_reduction_path_t unop_reduction_constant
Definition: unary.hpp:45
static const unop_reduction_path_t unop_reduction_none
Definition: unary.hpp:43
Output & traceOutputIntraProcedurally(Output &output)
Definition: Trace.cpp:223
static const binop_reduction_path_t binop_reduction_none
Definition: binary.hpp:203