Skip to content

Commit 417d510

Browse files
committed
Add some tests for getUnderlyingObject
1 parent 5a0942c commit 417d510

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

llvm/unittests/Analysis/ValueTrackingTest.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,6 +1247,78 @@ TEST_F(ValueTrackingTest, computePtrAlignment) {
12471247
EXPECT_EQ(getKnownAlignment(A, DL, CxtI3, &AC, &DT), Align(16));
12481248
}
12491249

1250+
TEST_F(ValueTrackingTest, getUnderlyingObjectCastsAliases) {
1251+
parseAssembly(R"IR(
1252+
@gvar = global i32 0
1253+
@alias = alias i32, i32* @gvar
1254+
@alias_interposable = weak alias i32, i32* @gvar
1255+
define void @test() {
1256+
%A = call ptr @llvm.ssa.copy.p0(ptr @gvar)
1257+
%A2 = call ptr @llvm.ssa.copy.p0(ptr bitcast(ptr @gvar to ptr))
1258+
%A3 = call ptr addrspace(42) @llvm.ssa.copy.p42(ptr addrspace(42) addrspacecast(ptr @gvar to ptr addrspace(42)))
1259+
%A4 = call ptr @llvm.ssa.copy.p0(ptr @alias)
1260+
%A5 = call ptr @llvm.ssa.copy.p0(ptr @alias_interposable)
1261+
ret void
1262+
}
1263+
)IR");
1264+
Value *gvar = A->getOperand(0);
1265+
EXPECT_EQ(getUnderlyingObject(A->getOperand(0)), gvar);
1266+
EXPECT_EQ(getUnderlyingObject(A2->getOperand(0)), gvar);
1267+
EXPECT_EQ(getUnderlyingObject(A3->getOperand(0)), gvar);
1268+
EXPECT_EQ(getUnderlyingObject(A4->getOperand(0)), gvar);
1269+
EXPECT_EQ(getUnderlyingObject(A4->getOperand(0)), gvar);
1270+
// should not skip interposable alias
1271+
EXPECT_EQ(getUnderlyingObject(A5->getOperand(0)), A5->getOperand(0));
1272+
}
1273+
1274+
TEST_F(ValueTrackingTest, getUnderlyingObjectIntrinsics) {
1275+
parseAssembly(R"IR(
1276+
define void @test(ptr %arg) {
1277+
; intrinsic with Return<> arg attribute
1278+
%A = call ptr @llvm.objc.retain(ptr %arg)
1279+
%A2 = call ptr @llvm.ssa.copy(ptr %arg)
1280+
; special cased intrinsics
1281+
%A3 = call ptr @llvm.launder.invariant.group(ptr %arg)
1282+
ret void
1283+
}
1284+
)IR");
1285+
Value *arg = F->getArg(0);
1286+
EXPECT_EQ(getUnderlyingObject(A), arg);
1287+
EXPECT_EQ(getUnderlyingObject(A2), arg);
1288+
EXPECT_EQ(getUnderlyingObject(A3), arg);
1289+
}
1290+
1291+
TEST_F(ValueTrackingTest, getUnderlyingObjectPtrInt) {
1292+
parseAssembly(R"IR(
1293+
define void @test(i64 %arg, ptr %arg1) {
1294+
%A = inttoptr i64 %arg to ptr
1295+
%t0 = ptrtoint ptr %arg1 to i64
1296+
%A2 = inttoptr i64 %t0 to ptr
1297+
ret void
1298+
}
1299+
)IR");
1300+
// Should not skip anything here
1301+
EXPECT_EQ(getUnderlyingObject(A->getOperand(0)), A->getOperand(0));
1302+
EXPECT_EQ(getUnderlyingObject(A2->getOperand(0)), A2->getOperand(0));
1303+
}
1304+
1305+
TEST_F(ValueTrackingTest, getUnderlyingObjectPhi) {
1306+
parseAssembly(R"IR(
1307+
@gvar = global i32 0
1308+
define void @test() {
1309+
entry:
1310+
%A = call ptr @llvm.ssa.copy.p0(ptr @gvar)
1311+
br label %block2
1312+
1313+
block2:
1314+
%A2 = phi ptr [ @gvar, %entry ]
1315+
ret void
1316+
}
1317+
)IR");
1318+
Value *gvar = A->getOperand(0);
1319+
EXPECT_EQ(getUnderlyingObject(A2->getOperand(0)), gvar);
1320+
}
1321+
12501322
TEST_F(ComputeKnownBitsTest, ComputeKnownBits) {
12511323
parseAssembly(
12521324
"define i32 @test(i32 %a, i32 %b) {\n"

0 commit comments

Comments
 (0)