32 auto i32Type = BitType::Create(32);
44 auto & x1 = GraphExport::Create(*cmpNode1.output(0),
"x1");
45 auto & x2 = GraphExport::Create(*cmpNode2.output(0),
"x2");
55 auto [_, op] = TryGetSimpleNodeAndOptionalOp<IntegerConstantOperation>(*x1.origin());
56 EXPECT_NE(op,
nullptr);
57 EXPECT_EQ(op->Representation().nbits(), 1u);
58 EXPECT_EQ(op->Representation().to_uint(),
expected);
62 auto [node, op] = TryGetSimpleNodeAndOptionalOp<PtrCmpOperation>(*x2.origin());
63 EXPECT_NE(op,
nullptr);
64 EXPECT_EQ(node, &cmpNode2);
68TEST(PtrCmpOperationTests, testNormalizeNullPointerComparison)
74 auto i1Type = BitType::Create(1);
75 auto i32Type = BitType::Create(32);
76 auto functionType1 = FunctionType::Create({}, { pointerType });
78 FunctionType::Create({}, { i1Type, i1Type, i1Type, i1Type, i1Type, i1Type, i1Type });
92 auto deltaNode = DeltaNode::Create(
93 &graph.GetRootRegion(),
96 auto & deltaOutput = deltaNode->finalize(ptrNullDeltaNode.output(0));
98 auto lambdaNode1 = LambdaNode::Create(
99 graph.GetRootRegion(),
107 auto lambdaOutput = lambdaNode1->finalize({ ptrNullLambdaNode.output(0) });
108 auto & fnToPtrNode = CreateOpNode<FunctionToPointerOperation>({ lambdaOutput }, functionType1);
110 auto lambdaNode2 = LambdaNode::Create(
111 graph.GetRootRegion(),
118 auto i0CtxVar = lambdaNode2->AddContextVar(i0);
119 auto deltaCtxVar = lambdaNode2->AddContextVar(deltaOutput);
120 auto fnToPtrCtxVar = lambdaNode2->AddContextVar(*fnToPtrNode.output(0));
130 *cPtrNullNode.output(0));
135 *cPtrNullNode.output(0));
148 *cPtrNullNode.output(0),
149 *cPtrNullNode.output(0));
153 *cPtrNullNode.output(0),
154 *cPtrNullNode.output(0));
156 lambdaNode2->finalize({ ptrCmpNode1.output(0),
157 ptrCmpNode2.output(0),
158 ptrCmpNode3.output(0),
159 ptrCmpNode4.output(0),
160 ptrCmpNode5.output(0),
161 ptrCmpNode6.output(0),
162 ptrCmpNode7.output(0) });
175 auto [constantNode, constantOperation] =
177 *lambdaNode2->GetFunctionResults()[0]->origin());
178 EXPECT_NE(constantOperation,
nullptr);
179 EXPECT_EQ(constantOperation->Representation().nbits(), 1u);
180 EXPECT_EQ(constantOperation->Representation().to_uint(), 0u);
184 auto [constantNode, constantOperation] =
186 *lambdaNode2->GetFunctionResults()[1]->origin());
187 EXPECT_NE(constantOperation,
nullptr);
188 EXPECT_EQ(constantOperation->Representation().nbits(), 1u);
189 EXPECT_EQ(constantOperation->Representation().to_uint(), 1u);
193 auto [constantNode, constantOperation] =
195 *lambdaNode2->GetFunctionResults()[2]->origin());
196 EXPECT_NE(constantOperation,
nullptr);
197 EXPECT_EQ(constantOperation->Representation().nbits(), 1u);
198 EXPECT_EQ(constantOperation->Representation().to_uint(), 1u);
202 auto [constantNode, constantOperation] =
204 *lambdaNode2->GetFunctionResults()[3]->origin());
205 EXPECT_NE(constantOperation,
nullptr);
206 EXPECT_EQ(constantOperation->Representation().nbits(), 1u);
207 EXPECT_EQ(constantOperation->Representation().to_uint(), 1u);
211 auto [constantNode, constantOperation] =
213 *lambdaNode2->GetFunctionResults()[4]->origin());
214 EXPECT_NE(constantOperation,
nullptr);
215 EXPECT_EQ(constantOperation->Representation().nbits(), 1u);
216 EXPECT_EQ(constantOperation->Representation().to_uint(), 1u);
220 auto [constantNode, constantOperation] =
222 *lambdaNode2->GetFunctionResults()[5]->origin());
223 EXPECT_NE(constantOperation,
nullptr);
224 EXPECT_EQ(constantOperation->Representation().nbits(), 1u);
225 EXPECT_EQ(constantOperation->Representation().to_uint(), 1u);
229 auto [constantNode, constantOperation] =
231 *lambdaNode2->GetFunctionResults()[6]->origin());
232 EXPECT_NE(constantOperation,
nullptr);
233 EXPECT_EQ(constantOperation->Representation().nbits(), 1u);
234 EXPECT_EQ(constantOperation->Representation().to_uint(), 0u);
240 testPtrCmpNormalizeIdenticalOperands<ICmpPredicate::Eq>(1);
241 testPtrCmpNormalizeIdenticalOperands<ICmpPredicate::Sge>(1);
242 testPtrCmpNormalizeIdenticalOperands<ICmpPredicate::Sle>(1);
243 testPtrCmpNormalizeIdenticalOperands<ICmpPredicate::Uge>(1);
244 testPtrCmpNormalizeIdenticalOperands<ICmpPredicate::Ule>(1);
246 testPtrCmpNormalizeIdenticalOperands<ICmpPredicate::Ne>(0);
247 testPtrCmpNormalizeIdenticalOperands<ICmpPredicate::Sgt>(0);
248 testPtrCmpNormalizeIdenticalOperands<ICmpPredicate::Slt>(0);
249 testPtrCmpNormalizeIdenticalOperands<ICmpPredicate::Ugt>(0);
250 testPtrCmpNormalizeIdenticalOperands<ICmpPredicate::Ult>(0);
253TEST(FCmpOperationTests, testFoldConstants)
270 ::llvm::APFloat::getNaN(::llvm::APFloat::IEEEdouble()));
272 const auto expectFoldedTo =
277 ASSERT_TRUE(folded.has_value())
278 <<
"Expected folding for predicate " <<
static_cast<int>(predicate);
279 ASSERT_EQ(folded->size(), 1u);
281 auto [node, constantOperation] =
283 ASSERT_NE(constantOperation,
nullptr);
284 EXPECT_EQ(constantOperation->Representation().nbits(), 1u);
285 EXPECT_EQ(constantOperation->Representation().to_uint(),
expected ? 1u : 0u)
286 <<
"Predicate " <<
static_cast<int>(predicate);
291 expectFoldedTo(
fpcmp::TRUE, c0.output(0),
c1.output(0),
true);
314 expectFoldedTo(
fpcmp::ord, cNeg1.output(0),
c2.output(0),
true);
315 expectFoldedTo(
fpcmp::uno, cNeg1.output(0),
c2.output(0),
false);
318 expectFoldedTo(
fpcmp::ord, cNaN.output(0),
c1.output(0),
false);
319 expectFoldedTo(
fpcmp::uno, cNaN.output(0),
c1.output(0),
true);
321 expectFoldedTo(
fpcmp::ueq, cNaN.output(0), cNaN.output(0),
true);
325 expectFoldedTo(
fpcmp::une, cNaN.output(0),
c1.output(0),
true);
329 expectFoldedTo(
fpcmp::ugt, cNaN.output(0),
c1.output(0),
true);
333 expectFoldedTo(
fpcmp::uge, cNaN.output(0),
c1.output(0),
true);
338 expectFoldedTo(
fpcmp::ult, cNaN.output(0),
c1.output(0),
true);
342 expectFoldedTo(
fpcmp::ule, cNaN.output(0),
c1.output(0),
true);
364 std::vector<rvsdg::Output *>({ &nonConst, c0Node.output(0) }));
365 EXPECT_FALSE(notFolded.has_value());
369TEST(FBinaryOperationTests, testFoldConstants)
385 ASSERT_TRUE(folded.has_value()) <<
"Expected folding for fpop " <<
static_cast<int>(op);
386 ASSERT_EQ(folded->size(), 1u);
388 auto [node, constantOperation] =
390 ASSERT_NE(constantOperation,
nullptr);
391 EXPECT_EQ(&constantOperation->constant().getSemantics(), &::llvm::APFloat::IEEEdouble());
392 EXPECT_TRUE(constantOperation->constant().bitwiseIsEqual(::llvm::APFloat(
expected)))
393 <<
"fpop " <<
static_cast<int>(op);
399 expectFoldedTo(
fpop::div,
c1.output(0),
c2.output(0), 3.625);
416 std::vector<Output *>({ &nonConst,
c1.output(0) }));
417 EXPECT_FALSE(notFolded.has_value());