@@ -113,16 +113,29 @@ define void @deref_assumption_in_header_constant_trip_count_loop_invariant_ptr(p
113
113
; CHECK: [[VECTOR_PH]]:
114
114
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
115
115
; CHECK: [[VECTOR_BODY]]:
116
- ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY ]] ]
116
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.* ]] ]
117
117
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
118
118
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]
119
119
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0
120
120
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP2]], align 4
121
121
; CHECK-NEXT: [[TMP3:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
122
- ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[A]], align 4
122
+ ; CHECK-NEXT: [[TMP4:%.*]] = xor <2 x i1> [[TMP3]], splat (i1 true)
123
+ ; CHECK-NEXT: [[TMP6:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0
124
+ ; CHECK-NEXT: br i1 [[TMP6]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
125
+ ; CHECK: [[PRED_LOAD_IF]]:
123
126
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[A]], align 4
124
- ; CHECK-NEXT: [[TMP6:%.*]] = insertelement <2 x i32> poison, i32 [[TMP4]], i32 0
125
- ; CHECK-NEXT: [[TMP7:%.*]] = insertelement <2 x i32> [[TMP6]], i32 [[TMP5]], i32 1
127
+ ; CHECK-NEXT: [[TMP12:%.*]] = insertelement <2 x i32> poison, i32 [[TMP5]], i32 0
128
+ ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
129
+ ; CHECK: [[PRED_LOAD_CONTINUE]]:
130
+ ; CHECK-NEXT: [[TMP13:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP12]], %[[PRED_LOAD_IF]] ]
131
+ ; CHECK-NEXT: [[TMP14:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1
132
+ ; CHECK-NEXT: br i1 [[TMP14]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
133
+ ; CHECK: [[PRED_LOAD_IF1]]:
134
+ ; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[A]], align 4
135
+ ; CHECK-NEXT: [[TMP11:%.*]] = insertelement <2 x i32> [[TMP13]], i32 [[TMP15]], i32 1
136
+ ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
137
+ ; CHECK: [[PRED_LOAD_CONTINUE2]]:
138
+ ; CHECK-NEXT: [[TMP7:%.*]] = phi <2 x i32> [ [[TMP13]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP11]], %[[PRED_LOAD_IF1]] ]
126
139
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP7]]
127
140
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
128
141
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP8]], i32 0
@@ -1183,7 +1196,7 @@ define void @deref_assumption_in_preheader_constant_trip_count_align_4_known_via
1183
1196
; CHECK-NEXT: store <2 x i32> [[PREDPHI]], ptr [[TMP17]], align 4
1184
1197
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
1185
1198
; CHECK-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000
1186
- ; CHECK-NEXT: br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP24 :![0-9]+]]
1199
+ ; CHECK-NEXT: br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP26 :![0-9]+]]
1187
1200
; CHECK: [[MIDDLE_BLOCK]]:
1188
1201
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
1189
1202
; CHECK: [[SCALAR_PH]]:
@@ -1205,7 +1218,7 @@ define void @deref_assumption_in_preheader_constant_trip_count_align_4_known_via
1205
1218
; CHECK-NEXT: store i32 [[MERGE]], ptr [[GEP_C]], align 4
1206
1219
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
1207
1220
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 1000
1208
- ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP25 :![0-9]+]]
1221
+ ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP27 :![0-9]+]]
1209
1222
; CHECK: [[EXIT]]:
1210
1223
; CHECK-NEXT: ret void
1211
1224
;
@@ -1261,101 +1274,6 @@ define void @deref_assumption_in_preheader_constant_trip_count_align_4_not_known
1261
1274
; CHECK-NEXT: store <2 x i32> [[PREDPHI]], ptr [[TMP17]], align 4
1262
1275
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
1263
1276
; CHECK-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000
1264
- ; CHECK-NEXT: br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP26:![0-9]+]]
1265
- ; CHECK: [[MIDDLE_BLOCK]]:
1266
- ; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
1267
- ; CHECK: [[SCALAR_PH]]:
1268
- ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 1000, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1269
- ; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
1270
- ; CHECK: [[LOOP_HEADER]]:
1271
- ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
1272
- ; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[IV]]
1273
- ; CHECK-NEXT: [[L_B:%.*]] = load i32, ptr [[GEP_B]], align 4
1274
- ; CHECK-NEXT: [[C_1:%.*]] = icmp sge i32 [[L_B]], 0
1275
- ; CHECK-NEXT: br i1 [[C_1]], label %[[LOOP_LATCH]], label %[[LOOP_THEN:.*]]
1276
- ; CHECK: [[LOOP_THEN]]:
1277
- ; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr i32, ptr [[A]], i64 [[IV]]
1278
- ; CHECK-NEXT: [[L_A:%.*]] = load i32, ptr [[GEP_A]], align 4
1279
- ; CHECK-NEXT: br label %[[LOOP_LATCH]]
1280
- ; CHECK: [[LOOP_LATCH]]:
1281
- ; CHECK-NEXT: [[MERGE:%.*]] = phi i32 [ [[L_A]], %[[LOOP_THEN]] ], [ [[L_B]], %[[LOOP_HEADER]] ]
1282
- ; CHECK-NEXT: [[GEP_C:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[IV]]
1283
- ; CHECK-NEXT: store i32 [[MERGE]], ptr [[GEP_C]], align 4
1284
- ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
1285
- ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 1000
1286
- ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP27:![0-9]+]]
1287
- ; CHECK: [[EXIT]]:
1288
- ; CHECK-NEXT: ret void
1289
- ;
1290
- entry:
1291
- call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %a , i64 4000 ) ]
1292
- br label %loop.header
1293
-
1294
- loop.header:
1295
- %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop.latch ]
1296
- %gep.b = getelementptr inbounds i32 , ptr %b , i64 %iv
1297
- %l.b = load i32 , ptr %gep.b , align 4
1298
- %c.1 = icmp sge i32 %l.b , 0
1299
- br i1 %c.1 , label %loop.latch , label %loop.then
1300
-
1301
- loop.then:
1302
- %gep.a = getelementptr i32 , ptr %a , i64 %iv
1303
- %l.a = load i32 , ptr %gep.a , align 4
1304
- br label %loop.latch
1305
-
1306
- loop.latch:
1307
- %merge = phi i32 [ %l.a , %loop.then ], [ %l.b , %loop.header ]
1308
- %gep.c = getelementptr inbounds i32 , ptr %c , i64 %iv
1309
- store i32 %merge , ptr %gep.c , align 4
1310
- %iv.next = add nuw nsw i64 %iv , 1
1311
- %ec = icmp eq i64 %iv.next , 1000
1312
- br i1 %ec , label %exit , label %loop.header
1313
-
1314
- exit:
1315
- ret void
1316
- }
1317
-
1318
- define void @deref_assumption_in_preheader_constant_trip_count_align_4_not_known (ptr noalias %a , ptr noalias %b , ptr noalias %c ) {
1319
- ; CHECK-LABEL: define void @deref_assumption_in_preheader_constant_trip_count_align_4_not_known(
1320
- ; CHECK-SAME: ptr noalias [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) {
1321
- ; CHECK-NEXT: [[ENTRY:.*]]:
1322
- ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[A]], i64 4000) ]
1323
- ; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1324
- ; CHECK: [[VECTOR_PH]]:
1325
- ; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
1326
- ; CHECK: [[VECTOR_BODY]]:
1327
- ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]
1328
- ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
1329
- ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]
1330
- ; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i32 0
1331
- ; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP2]], align 4
1332
- ; CHECK-NEXT: [[TMP3:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
1333
- ; CHECK-NEXT: [[TMP4:%.*]] = xor <2 x i1> [[TMP3]], splat (i1 true)
1334
- ; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0
1335
- ; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
1336
- ; CHECK: [[PRED_LOAD_IF]]:
1337
- ; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP0]]
1338
- ; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4
1339
- ; CHECK-NEXT: [[TMP8:%.*]] = insertelement <2 x i32> poison, i32 [[TMP7]], i32 0
1340
- ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
1341
- ; CHECK: [[PRED_LOAD_CONTINUE]]:
1342
- ; CHECK-NEXT: [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP8]], %[[PRED_LOAD_IF]] ]
1343
- ; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1
1344
- ; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
1345
- ; CHECK: [[PRED_LOAD_IF1]]:
1346
- ; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[INDEX]], 1
1347
- ; CHECK-NEXT: [[TMP12:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP11]]
1348
- ; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4
1349
- ; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP13]], i32 1
1350
- ; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
1351
- ; CHECK: [[PRED_LOAD_CONTINUE2]]:
1352
- ; CHECK-NEXT: [[TMP15:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]
1353
- ; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP3]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP15]]
1354
- ; CHECK-NEXT: [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
1355
- ; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i32, ptr [[TMP16]], i32 0
1356
- ; CHECK-NEXT: store <2 x i32> [[PREDPHI]], ptr [[TMP17]], align 4
1357
- ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
1358
- ; CHECK-NEXT: [[TMP18:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1000
1359
1277
; CHECK-NEXT: br i1 [[TMP18]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP28:![0-9]+]]
1360
1278
; CHECK: [[MIDDLE_BLOCK]]:
1361
1279
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
0 commit comments