6 #include <gtest/gtest.h>
20 static std::unique_ptr<jlm::llvm::ControlFlowGraph>
29 std::vector<const Variable *>
operands;
30 for (
size_t n = 0; n < operation.
narguments(); n++)
32 auto & operandType = operation.
argument(n);
33 auto operand = cfg->entry()->append_argument(
Argument::create(
"", operandType));
39 std::unique_ptr<jlm::rvsdg::SimpleOperation>(
40 jlm::util::assertedCast<jlm::rvsdg::SimpleOperation>(operation.
copy().release())),
43 for (
size_t n = 0; n < threeAddressCode->nresults(); n++)
45 auto result = threeAddressCode->result(n);
46 cfg->exit()->append_result(result);
49 cfg->exit()->divert_inedges(basicBlock);
50 basicBlock->add_outedge(cfg->exit());
55 static std::unique_ptr<jlm::llvm::InterProceduralGraphModule>
61 auto & ipgraph = ipgModule->ipgraph();
63 std::vector<std::shared_ptr<const jlm::rvsdg::Type>> operandTypes;
64 for (
size_t n = 0; n < operation.
narguments(); n++)
66 operandTypes.emplace_back(operation.
argument(n));
69 std::vector<std::shared_ptr<const jlm::rvsdg::Type>> resultTypes;
70 for (
size_t n = 0; n < operation.
nresults(); n++)
72 resultTypes.emplace_back(operation.
result(n));
79 functionNode->add_cfg(std::move(cfg));
80 ipgModule->create_variable(functionNode);
85 TEST(ThreeAddressCodeConversionTests, LoadVolatileConversion)
97 std::cout <<
jlm::rvsdg::view(&rvsdgModule->Rvsdg().GetRootRegion()) << std::flush;
100 auto lambdaOutput = rvsdgModule->Rvsdg().GetRootRegion().result(0)->origin();
101 auto lambda = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::LambdaNode>(*lambdaOutput);
103 auto loadVolatileNode = lambda->subregion()->Nodes().begin().ptr();
104 EXPECT_TRUE(is<LoadVolatileOperation>(loadVolatileNode));
107 TEST(ThreeAddressCodeConversionTests, StoreVolatileConversion)
119 std::cout <<
jlm::rvsdg::view(&rvsdgModule->Rvsdg().GetRootRegion()) << std::flush;
122 auto lambdaOutput = rvsdgModule->Rvsdg().GetRootRegion().result(0)->origin();
123 auto lambda = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::LambdaNode>(*lambdaOutput);
125 auto storeVolatileNode = lambda->subregion()->Nodes().begin().ptr();
126 EXPECT_TRUE(is<StoreVolatileOperation>(storeVolatileNode));
static jlm::util::StatisticsCollector statisticsCollector
static std::unique_ptr< jlm::llvm::InterProceduralGraphModule > SetupFunctionWithThreeAddressCode(const jlm::rvsdg::SimpleOperation &operation)
TEST(ThreeAddressCodeConversionTests, LoadVolatileConversion)
static std::unique_ptr< jlm::llvm::ControlFlowGraph > SetupControlFlowGraph(jlm::llvm::InterProceduralGraphModule &ipgModule, const jlm::rvsdg::SimpleOperation &operation)
static std::unique_ptr< Argument > create(const std::string &name, std::shared_ptr< const jlm::rvsdg::Type > type, const AttributeSet &attributes)
static BasicBlock * create(ControlFlowGraph &cfg)
static std::unique_ptr< ControlFlowGraph > create(InterProceduralGraphModule &im)
static FunctionNode * create(InterProceduralGraph &ipg, const std::string &name, std::shared_ptr< const rvsdg::FunctionType > type, const llvm::Linkage &linkage, const CallingConvention &callingConvention, const AttributeSet &attributes)
static std::unique_ptr< InterProceduralGraphModule > create(const jlm::util::FilePath &sourceFilename, const std::string &targetTriple, const std::string &dataLayout)
static std::unique_ptr< llvm::ThreeAddressCode > create(std::unique_ptr< rvsdg::SimpleOperation > operation, const std::vector< const Variable * > &operands)
static std::shared_ptr< const FunctionType > Create(std::vector< std::shared_ptr< const jlm::rvsdg::Type >> argumentTypes, std::vector< std::shared_ptr< const jlm::rvsdg::Type >> resultTypes)
virtual std::unique_ptr< Operation > copy() const =0
const std::shared_ptr< const rvsdg::Type > & argument(size_t index) const noexcept
const std::shared_ptr< const rvsdg::Type > & result(size_t index) const noexcept
size_t nresults() const noexcept
size_t narguments() const noexcept
static std::shared_ptr< const TestType > createValueType()
Global memory state passed between functions.
static std::unique_ptr< LlvmRvsdgModule > ConvertInterProceduralGraphModule(InterProceduralGraphModule &interProceduralGraphModule, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
std::string view(const rvsdg::Region *region)
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)