Jlm
sext.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
8 #include <jlm/llvm/ir/Trace.hpp>
9 
10 namespace jlm::llvm
11 {
12 
15 
16 static bool
18 {
19  return rvsdg::is<rvsdg::BitUnaryOperation>(rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*operand));
20 }
21 
22 static bool
24 {
25  return rvsdg::is<rvsdg::BitBinaryOperation>(rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*operand));
26 }
27 
28 static bool
29 is_inverse_reducible(const SExtOperation & op, const rvsdg::Output * operand)
30 {
31  const auto node = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*operand);
32  if (!node)
33  return false;
34 
35  const auto top = dynamic_cast<const TruncOperation *>(&node->GetOperation());
36  return top && top->nsrcbits() == op.ndstbits();
37 }
38 
39 static rvsdg::Output *
41 {
43  const auto unaryNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*operand);
44  auto region = operand->region();
45  auto uop = static_cast<const rvsdg::BitUnaryOperation *>(&unaryNode->GetOperation());
46 
47  auto output = SExtOperation::create(op.ndstbits(), unaryNode->input(0)->origin());
48  std::unique_ptr<rvsdg::SimpleOperation> simpleOperation(
49  util::assertedCast<rvsdg::SimpleOperation>(uop->create(op.ndstbits()).release()));
50  return rvsdg::SimpleNode::Create(*region, std::move(simpleOperation), { output }).output(0);
51 }
52 
53 static rvsdg::Output *
55 {
57  const auto binaryNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*operand);
58  auto region = operand->region();
59  auto bop = static_cast<const rvsdg::BitBinaryOperation *>(&binaryNode->GetOperation());
60 
61  JLM_ASSERT(binaryNode->ninputs() == 2);
62  auto op1 = SExtOperation::create(op.ndstbits(), binaryNode->input(0)->origin());
63  auto op2 = SExtOperation::create(op.ndstbits(), binaryNode->input(1)->origin());
64 
65  std::unique_ptr<rvsdg::SimpleOperation> simpleOperation(
66  util::assertedCast<rvsdg::SimpleOperation>(bop->create(op.ndstbits()).release()));
67  return rvsdg::SimpleNode::Create(*region, std::move(simpleOperation), { op1, op2 }).output(0);
68 }
69 
70 static rvsdg::Output *
72 {
73  JLM_ASSERT(is_inverse_reducible(op, operand));
74  return rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*operand)->input(0)->origin();
75 }
76 
77 SExtOperation::~SExtOperation() noexcept = default;
78 
79 bool
80 SExtOperation::operator==(const Operation & other) const noexcept
81 {
82  auto op = dynamic_cast<const SExtOperation *>(&other);
83  return op && op->argument(0) == argument(0) && op->result(0) == result(0);
84 }
85 
86 std::string
88 {
89  return util::strfmt("SEXT[", nsrcbits(), " -> ", ndstbits(), "]");
90 }
91 
92 std::unique_ptr<rvsdg::Operation>
94 {
95  return std::make_unique<SExtOperation>(*this);
96 }
97 
99 SExtOperation::can_reduce_operand(const rvsdg::Output * operand) const noexcept
100 {
101  auto & tracedOutput = llvm::traceOutput(*operand);
102  if (rvsdg::IsOwnerNodeOperation<rvsdg::BitConstantOperation>(tracedOutput))
104 
105  if (is_bitunary_reducible(operand))
107 
108  if (is_bitbinary_reducible(operand))
110 
111  if (is_inverse_reducible(*this, operand))
113 
115 }
116 
119 {
120  if (path == rvsdg::unop_reduction_constant)
121  {
122  auto & tracedOutput = llvm::traceOutput(*operand);
123  auto [constantNode, constantOperation] =
124  rvsdg::TryGetSimpleNodeAndOptionalOp<rvsdg::BitConstantOperation>(tracedOutput);
125  JLM_ASSERT(constantNode && constantOperation);
127  *operand->region(),
128  constantOperation->value().sext(ndstbits() - nsrcbits()));
129  }
130 
131  if (path == sext_reduction_bitunary)
132  return perform_bitunary_reduction(*this, operand);
133 
134  if (path == sext_reduction_bitbinary)
135  return perform_bitbinary_reduction(*this, operand);
136 
137  if (path == rvsdg::unop_reduction_inverse)
138  return perform_inverse_reduction(*this, operand);
139 
140  return nullptr;
141 }
142 
143 }
static std::unique_ptr< llvm::ThreeAddressCode > create(const Variable *operand, const std::shared_ptr< const rvsdg::Type > &type)
Definition: sext.hpp:75
~SExtOperation() noexcept override
std::string debug_string() const override
Definition: sext.cpp:87
rvsdg::unop_reduction_path_t can_reduce_operand(const rvsdg::Output *operand) const noexcept override
Definition: sext.cpp:99
std::unique_ptr< Operation > copy() const override
Definition: sext.cpp:93
size_t nsrcbits() const noexcept
Definition: sext.hpp:63
rvsdg::Output * reduce_operand(rvsdg::unop_reduction_path_t path, rvsdg::Output *operand) const override
Definition: sext.cpp:118
size_t ndstbits() const noexcept
Definition: sext.hpp:69
size_t nsrcbits() const noexcept
Definition: operators.hpp:1649
static Output & create(Region &region, BitValueRepresentation value)
Definition: constant.hpp:44
rvsdg::Region * region() const noexcept
Definition: node.cpp:151
static SimpleNode & Create(Region &region, std::unique_ptr< Operation > operation, const std::vector< rvsdg::Output * > &operands)
Definition: simple-node.hpp:49
const std::shared_ptr< const rvsdg::Type > & argument(size_t index) const noexcept
Definition: operation.cpp:23
#define JLM_ASSERT(x)
Definition: common.hpp:16
Global memory state passed between functions.
static rvsdg::Output * perform_inverse_reduction(const SExtOperation &op, rvsdg::Output *operand)
Definition: sext.cpp:71
static bool is_bitbinary_reducible(const rvsdg::Output *operand)
Definition: sext.cpp:23
rvsdg::Output & traceOutput(rvsdg::Output &output)
Definition: Trace.cpp:39
static bool is_bitunary_reducible(const rvsdg::Output *operand)
Definition: sext.cpp:17
static bool is_inverse_reducible(const SExtOperation &op, const rvsdg::Output *operand)
Definition: sext.cpp:29
static const rvsdg::unop_reduction_path_t sext_reduction_bitbinary
Definition: sext.cpp:14
static rvsdg::Output * perform_bitunary_reduction(const SExtOperation &op, rvsdg::Output *operand)
Definition: sext.cpp:40
static rvsdg::Output * perform_bitbinary_reduction(const SExtOperation &op, rvsdg::Output *operand)
Definition: sext.cpp:54
static const rvsdg::unop_reduction_path_t sext_reduction_bitunary
Definition: sext.cpp:13
size_t unop_reduction_path_t
Definition: unary.hpp:18
static const unop_reduction_path_t unop_reduction_inverse
Definition: unary.hpp:49
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
static std::string strfmt(Args... args)
Definition: strfmt.hpp:35