@@ -1247,6 +1247,78 @@ TEST_F(ValueTrackingTest, computePtrAlignment) {
1247
1247
EXPECT_EQ (getKnownAlignment (A, DL, CxtI3, &AC, &DT), Align (16 ));
1248
1248
}
1249
1249
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
+
1250
1322
TEST_F (ComputeKnownBitsTest, ComputeKnownBits) {
1251
1323
parseAssembly (
1252
1324
" define i32 @test(i32 %a, i32 %b) {\n "
0 commit comments