@@ -1335,6 +1335,59 @@ entry:
1335
1335
ret i8 %r
1336
1336
}
1337
1337
1338
+ define [2 x i32 ] @select_of_ptrs (i32* %data , i1 %c , i32 %v ) {
1339
+ ; CHECK-LABEL: @select_of_ptrs(
1340
+ ; CHECK-NEXT: entry:
1341
+ ; CHECK-NEXT: [[RETVAL_FULL:%.*]] = alloca [2 x i32], align 4
1342
+ ; CHECK-NEXT: [[DOTFCA_0_GEP:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i32 0, i32 0
1343
+ ; CHECK-NEXT: store i32 0, i32* [[DOTFCA_0_GEP]], align 4
1344
+ ; CHECK-NEXT: [[DOTFCA_1_GEP:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i32 0, i32 1
1345
+ ; CHECK-NEXT: store i32 0, i32* [[DOTFCA_1_GEP]], align 4
1346
+ ; CHECK-NEXT: [[RETVAL_BASE:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i64 0, i64 0
1347
+ ; CHECK-NEXT: [[RETVAL:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i64 0, i64 1
1348
+ ; CHECK-NEXT: [[PTR:%.*]] = select i1 [[C:%.*]], i32* [[RETVAL_BASE]], i32* [[RETVAL]]
1349
+ ; CHECK-NEXT: store i32 [[V:%.*]], i32* [[PTR]], align 4
1350
+ ; CHECK-NEXT: [[I0:%.*]] = call i32 @user_of_alloca(i32* [[RETVAL_BASE]])
1351
+ ; CHECK-NEXT: [[I1_FCA_0_GEP:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i32 0, i32 0
1352
+ ; CHECK-NEXT: [[I1_FCA_0_LOAD:%.*]] = load i32, i32* [[I1_FCA_0_GEP]], align 4
1353
+ ; CHECK-NEXT: [[I1_FCA_0_INSERT:%.*]] = insertvalue [2 x i32] poison, i32 [[I1_FCA_0_LOAD]], 0
1354
+ ; CHECK-NEXT: [[I1_FCA_1_GEP:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i32 0, i32 1
1355
+ ; CHECK-NEXT: [[I1_FCA_1_LOAD:%.*]] = load i32, i32* [[I1_FCA_1_GEP]], align 4
1356
+ ; CHECK-NEXT: [[I1_FCA_1_INSERT:%.*]] = insertvalue [2 x i32] [[I1_FCA_0_INSERT]], i32 [[I1_FCA_1_LOAD]], 1
1357
+ ; CHECK-NEXT: ret [2 x i32] [[I1_FCA_1_INSERT]]
1358
+ ;
1359
+ ; CHECK-OPAQUE-LABEL: @select_of_ptrs(
1360
+ ; CHECK-OPAQUE-NEXT: entry:
1361
+ ; CHECK-OPAQUE-NEXT: [[RETVAL_FULL:%.*]] = alloca [2 x i32], align 4
1362
+ ; CHECK-OPAQUE-NEXT: [[DOTFCA_0_GEP:%.*]] = getelementptr inbounds [2 x i32], ptr [[RETVAL_FULL]], i32 0, i32 0
1363
+ ; CHECK-OPAQUE-NEXT: store i32 0, ptr [[DOTFCA_0_GEP]], align 4
1364
+ ; CHECK-OPAQUE-NEXT: [[DOTFCA_1_GEP:%.*]] = getelementptr inbounds [2 x i32], ptr [[RETVAL_FULL]], i32 0, i32 1
1365
+ ; CHECK-OPAQUE-NEXT: store i32 0, ptr [[DOTFCA_1_GEP]], align 4
1366
+ ; CHECK-OPAQUE-NEXT: [[RETVAL_BASE:%.*]] = getelementptr inbounds [2 x i32], ptr [[RETVAL_FULL]], i64 0, i64 0
1367
+ ; CHECK-OPAQUE-NEXT: [[RETVAL:%.*]] = getelementptr inbounds [2 x i32], ptr [[RETVAL_FULL]], i64 0, i64 1
1368
+ ; CHECK-OPAQUE-NEXT: [[PTR:%.*]] = select i1 [[C:%.*]], ptr [[RETVAL_BASE]], ptr [[RETVAL]]
1369
+ ; CHECK-OPAQUE-NEXT: store i32 [[V:%.*]], ptr [[PTR]], align 4
1370
+ ; CHECK-OPAQUE-NEXT: [[I0:%.*]] = call i32 @user_of_alloca(ptr [[RETVAL_BASE]])
1371
+ ; CHECK-OPAQUE-NEXT: [[I1_FCA_0_GEP:%.*]] = getelementptr inbounds [2 x i32], ptr [[RETVAL_FULL]], i32 0, i32 0
1372
+ ; CHECK-OPAQUE-NEXT: [[I1_FCA_0_LOAD:%.*]] = load i32, ptr [[I1_FCA_0_GEP]], align 4
1373
+ ; CHECK-OPAQUE-NEXT: [[I1_FCA_0_INSERT:%.*]] = insertvalue [2 x i32] poison, i32 [[I1_FCA_0_LOAD]], 0
1374
+ ; CHECK-OPAQUE-NEXT: [[I1_FCA_1_GEP:%.*]] = getelementptr inbounds [2 x i32], ptr [[RETVAL_FULL]], i32 0, i32 1
1375
+ ; CHECK-OPAQUE-NEXT: [[I1_FCA_1_LOAD:%.*]] = load i32, ptr [[I1_FCA_1_GEP]], align 4
1376
+ ; CHECK-OPAQUE-NEXT: [[I1_FCA_1_INSERT:%.*]] = insertvalue [2 x i32] [[I1_FCA_0_INSERT]], i32 [[I1_FCA_1_LOAD]], 1
1377
+ ; CHECK-OPAQUE-NEXT: ret [2 x i32] [[I1_FCA_1_INSERT]]
1378
+ ;
1379
+ entry:
1380
+ %retval.full = alloca [2 x i32 ], align 4
1381
+ store [2 x i32 ] zeroinitializer , [2 x i32 ]* %retval.full , align 4
1382
+ %retval.base = getelementptr inbounds [2 x i32 ], [2 x i32 ]* %retval.full , i64 0 , i64 0
1383
+ %retval = getelementptr inbounds [2 x i32 ], [2 x i32 ]* %retval.full , i64 0 , i64 1
1384
+ %ptr = select i1 %c , i32* %retval.base , i32* %retval
1385
+ store i32 %v , i32* %ptr
1386
+ %i0 = call i32 @user_of_alloca (i32* %retval.base )
1387
+ %i1 = load [2 x i32 ], [2 x i32 ]* %retval.full , align 4
1388
+ ret [2 x i32 ] %i1
1389
+ }
1390
+
1338
1391
declare dso_local i32 @user_of_alloca (i32* nocapture readonly )
1339
1392
declare dso_local i32 @user_of_alloca_with_multiple_args (i32* nocapture readonly , i32* nocapture readonly )
1340
1393
declare dso_local i32 @capture_of_alloca (i32 *)
0 commit comments