@@ -1205,6 +1205,114 @@ loop.end:
12051205 ret i64 %retval2
12061206}
12071207
1208+ define i64 @diff_exit_block_post_inc_use3 (i64 %start ) {
1209+ ; CHECK-LABEL: define i64 @diff_exit_block_post_inc_use3(
1210+ ; CHECK-SAME: i64 [[START:%.*]]) {
1211+ ; CHECK-NEXT: entry:
1212+ ; CHECK-NEXT: [[P1:%.*]] = alloca [1024 x i8], align 1
1213+ ; CHECK-NEXT: [[P2:%.*]] = alloca [1024 x i8], align 1
1214+ ; CHECK-NEXT: call void @init_mem(ptr [[P1]], i64 1024)
1215+ ; CHECK-NEXT: call void @init_mem(ptr [[P2]], i64 1024)
1216+ ; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
1217+ ; CHECK: vector.ph:
1218+ ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[START]], 64
1219+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
1220+ ; CHECK: vector.body:
1221+ ; CHECK-NEXT: [[INDEX1:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT4:%.*]], [[VECTOR_BODY]] ]
1222+ ; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 3, [[INDEX1]]
1223+ ; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[OFFSET_IDX]], 0
1224+ ; CHECK-NEXT: [[OFFSET_IDX2:%.*]] = add i64 [[START]], [[INDEX1]]
1225+ ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[OFFSET_IDX2]], 0
1226+ ; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[OFFSET_IDX2]], 1
1227+ ; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[OFFSET_IDX2]], 2
1228+ ; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[OFFSET_IDX2]], 3
1229+ ; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[TMP2]], 1
1230+ ; CHECK-NEXT: [[TMP7:%.*]] = add i64 [[TMP3]], 1
1231+ ; CHECK-NEXT: [[TMP8:%.*]] = add i64 [[TMP4]], 1
1232+ ; CHECK-NEXT: [[TMP9:%.*]] = add i64 [[TMP5]], 1
1233+ ; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i64> poison, i64 [[TMP6]], i32 0
1234+ ; CHECK-NEXT: [[TMP11:%.*]] = insertelement <4 x i64> [[TMP10]], i64 [[TMP7]], i32 1
1235+ ; CHECK-NEXT: [[TMP12:%.*]] = insertelement <4 x i64> [[TMP11]], i64 [[TMP8]], i32 2
1236+ ; CHECK-NEXT: [[TMP13:%.*]] = insertelement <4 x i64> [[TMP12]], i64 [[TMP9]], i32 3
1237+ ; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[TMP1]]
1238+ ; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i8, ptr [[TMP14]], i32 0
1239+ ; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, ptr [[TMP15]], align 1
1240+ ; CHECK-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[TMP1]]
1241+ ; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i8, ptr [[TMP16]], i32 0
1242+ ; CHECK-NEXT: [[WIDE_LOAD3:%.*]] = load <4 x i8>, ptr [[TMP17]], align 1
1243+ ; CHECK-NEXT: [[TMP18:%.*]] = icmp eq <4 x i8> [[WIDE_LOAD]], [[WIDE_LOAD3]]
1244+ ; CHECK-NEXT: [[INDEX_NEXT4]] = add nuw i64 [[INDEX1]], 4
1245+ ; CHECK-NEXT: [[TMP19:%.*]] = xor <4 x i1> [[TMP18]], splat (i1 true)
1246+ ; CHECK-NEXT: [[TMP20:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP19]])
1247+ ; CHECK-NEXT: [[TMP21:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 64
1248+ ; CHECK-NEXT: [[TMP22:%.*]] = or i1 [[TMP20]], [[TMP21]]
1249+ ; CHECK-NEXT: br i1 [[TMP22]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP30:![0-9]+]]
1250+ ; CHECK: middle.split:
1251+ ; CHECK-NEXT: br i1 [[TMP20]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
1252+ ; CHECK: middle.block:
1253+ ; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[TMP0]], 1
1254+ ; CHECK-NEXT: br i1 true, label [[LOOP_END:%.*]], label [[SCALAR_PH]]
1255+ ; CHECK: vector.early.exit:
1256+ ; CHECK-NEXT: [[FIRST_ACTIVE_LANE:%.*]] = call i64 @llvm.experimental.cttz.elts.i64.v4i1(<4 x i1> [[TMP19]], i1 true)
1257+ ; CHECK-NEXT: [[EARLY_EXIT_VALUE:%.*]] = extractelement <4 x i64> [[TMP13]], i64 [[FIRST_ACTIVE_LANE]]
1258+ ; CHECK-NEXT: br label [[LOOP_EARLY_EXIT:%.*]]
1259+ ; CHECK: scalar.ph:
1260+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 67, [[MIDDLE_BLOCK]] ], [ 3, [[ENTRY:%.*]] ]
1261+ ; CHECK-NEXT: [[BC_RESUME_VAL5:%.*]] = phi i64 [ [[TMP0]], [[MIDDLE_BLOCK]] ], [ [[START]], [[ENTRY]] ]
1262+ ; CHECK-NEXT: br label [[LOOP:%.*]]
1263+ ; CHECK: loop:
1264+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ]
1265+ ; CHECK-NEXT: [[INDEX2:%.*]] = phi i64 [ [[INDEX2_NEXT:%.*]], [[LOOP_INC]] ], [ [[BC_RESUME_VAL5]], [[SCALAR_PH]] ]
1266+ ; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
1267+ ; CHECK-NEXT: [[INDEX2_NEXT]] = add i64 [[INDEX2]], 1
1268+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
1269+ ; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
1270+ ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
1271+ ; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
1272+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
1273+ ; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_EARLY_EXIT]]
1274+ ; CHECK: loop.inc:
1275+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
1276+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP31:![0-9]+]]
1277+ ; CHECK: loop.early.exit:
1278+ ; CHECK-NEXT: [[RETVAL1:%.*]] = phi i64 [ [[INDEX2_NEXT]], [[LOOP]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
1279+ ; CHECK-NEXT: ret i64 [[RETVAL1]]
1280+ ; CHECK: loop.end:
1281+ ; CHECK-NEXT: [[RETVAL2:%.*]] = phi i64 [ [[INDEX2]], [[LOOP_INC]] ], [ [[IND_ESCAPE]], [[MIDDLE_BLOCK]] ]
1282+ ; CHECK-NEXT: ret i64 [[RETVAL2]]
1283+ ;
1284+ entry:
1285+ %p1 = alloca [1024 x i8 ]
1286+ %p2 = alloca [1024 x i8 ]
1287+ call void @init_mem (ptr %p1 , i64 1024 )
1288+ call void @init_mem (ptr %p2 , i64 1024 )
1289+ br label %loop
1290+
1291+ loop:
1292+ %index = phi i64 [ %index.next , %loop.inc ], [ 3 , %entry ]
1293+ %index2 = phi i64 [ %index2.next , %loop.inc ], [ %start , %entry ]
1294+ %index.next = add i64 %index , 1
1295+ %index2.next = add i64 %index2 , 1
1296+ %arrayidx = getelementptr inbounds i8 , ptr %p1 , i64 %index
1297+ %ld1 = load i8 , ptr %arrayidx , align 1
1298+ %arrayidx1 = getelementptr inbounds i8 , ptr %p2 , i64 %index
1299+ %ld2 = load i8 , ptr %arrayidx1 , align 1
1300+ %cmp3 = icmp eq i8 %ld1 , %ld2
1301+ br i1 %cmp3 , label %loop.inc , label %loop.early.exit
1302+
1303+ loop.inc:
1304+ %exitcond = icmp ne i64 %index.next , 67
1305+ br i1 %exitcond , label %loop , label %loop.end
1306+
1307+ loop.early.exit:
1308+ %retval1 = phi i64 [ %index2.next , %loop ]
1309+ ret i64 %retval1
1310+
1311+ loop.end:
1312+ %retval2 = phi i64 [ %index2 , %loop.inc ]
1313+ ret i64 %retval2
1314+ }
1315+
12081316
12091317define i64 @loop_contains_safe_call () {
12101318; CHECK-LABEL: define i64 @loop_contains_safe_call() {
@@ -1232,7 +1340,7 @@ define i64 @loop_contains_safe_call() {
12321340; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
12331341; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4)
12341342; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
1235- ; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP30 :![0-9]+]]
1343+ ; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP32 :![0-9]+]]
12361344; CHECK: middle.split:
12371345; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
12381346; CHECK: middle.block:
@@ -1254,7 +1362,7 @@ define i64 @loop_contains_safe_call() {
12541362; CHECK: loop.inc:
12551363; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
12561364; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
1257- ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP31 :![0-9]+]]
1365+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP33 :![0-9]+]]
12581366; CHECK: loop.end:
12591367; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
12601368; CHECK-NEXT: ret i64 [[RETVAL]]
@@ -1311,7 +1419,7 @@ define i64 @loop_contains_safe_div() {
13111419; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT2]], 64
13121420; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4)
13131421; CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP6]], [[TMP7]]
1314- ; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP32 :![0-9]+]]
1422+ ; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP34 :![0-9]+]]
13151423; CHECK: middle.split:
13161424; CHECK-NEXT: br i1 [[TMP6]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
13171425; CHECK: middle.block:
@@ -1333,7 +1441,7 @@ define i64 @loop_contains_safe_div() {
13331441; CHECK: loop.inc:
13341442; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
13351443; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
1336- ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP33 :![0-9]+]]
1444+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP35 :![0-9]+]]
13371445; CHECK: loop.end:
13381446; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
13391447; CHECK-NEXT: ret i64 [[RETVAL]]
@@ -1391,7 +1499,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
13911499; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
13921500; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4)
13931501; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
1394- ; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP34 :![0-9]+]]
1502+ ; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP36 :![0-9]+]]
13951503; CHECK: middle.split:
13961504; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i64> [[WIDE_LOAD2]], i32 3
13971505; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
@@ -1415,7 +1523,7 @@ define i64 @loop_contains_load_after_early_exit(ptr dereferenceable(1024) align(
14151523; CHECK-NEXT: [[LD2:%.*]] = load i64, ptr [[ARRAYIDX2]], align 8
14161524; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
14171525; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
1418- ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP35 :![0-9]+]]
1526+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP37 :![0-9]+]]
14191527; CHECK: loop.end:
14201528; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ [[LD2]], [[LOOP_INC]] ], [ [[TMP10]], [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
14211529; CHECK-NEXT: ret i64 [[RETVAL]]
@@ -1477,7 +1585,7 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
14771585; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT4]], 1020
14781586; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 -4)
14791587; CHECK-NEXT: [[TMP11:%.*]] = or i1 [[TMP9]], [[TMP10]]
1480- ; CHECK-NEXT: br i1 [[TMP11]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP36 :![0-9]+]]
1588+ ; CHECK-NEXT: br i1 [[TMP11]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP38 :![0-9]+]]
14811589; CHECK: middle.split:
14821590; CHECK-NEXT: br i1 [[TMP9]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
14831591; CHECK: middle.block:
@@ -1500,7 +1608,7 @@ define i64 @same_exit_block_pre_inc_use1_reverse() {
15001608; CHECK: loop.inc:
15011609; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], -1
15021610; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[INDEX_NEXT]], 0
1503- ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP_END]], label [[LOOP]], !llvm.loop [[LOOP37 :![0-9]+]]
1611+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP_END]], label [[LOOP]], !llvm.loop [[LOOP39 :![0-9]+]]
15041612; CHECK: loop.end:
15051613; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 1024, [[LOOP_INC]] ], [ 1024, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
15061614; CHECK-NEXT: ret i64 [[RETVAL]]
@@ -1557,7 +1665,7 @@ define i64 @same_exit_block_pre_inc_use1_deref_ptrs(ptr dereferenceable(1024) %p
15571665; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT3]], 64
15581666; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i64> [[VEC_IND]], splat (i64 4)
15591667; CHECK-NEXT: [[TMP9:%.*]] = or i1 [[TMP7]], [[TMP8]]
1560- ; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP38 :![0-9]+]]
1668+ ; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_SPLIT:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP40 :![0-9]+]]
15611669; CHECK: middle.split:
15621670; CHECK-NEXT: br i1 [[TMP7]], label [[VECTOR_EARLY_EXIT:%.*]], label [[MIDDLE_BLOCK:%.*]]
15631671; CHECK: middle.block:
@@ -1580,7 +1688,7 @@ define i64 @same_exit_block_pre_inc_use1_deref_ptrs(ptr dereferenceable(1024) %p
15801688; CHECK: loop.inc:
15811689; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
15821690; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
1583- ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP39 :![0-9]+]]
1691+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]], !llvm.loop [[LOOP41 :![0-9]+]]
15841692; CHECK: loop.end:
15851693; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ], [ 67, [[MIDDLE_BLOCK]] ], [ [[EARLY_EXIT_VALUE]], [[VECTOR_EARLY_EXIT]] ]
15861694; CHECK-NEXT: ret i64 [[RETVAL]]
@@ -1653,4 +1761,6 @@ attributes #0 = { "vector-function-abi-variant"="_ZGVsNxv_foo(foo_vec)" }
16531761; CHECK: [[LOOP37]] = distinct !{[[LOOP37]], [[META2]], [[META1]]}
16541762; CHECK: [[LOOP38]] = distinct !{[[LOOP38]], [[META1]], [[META2]]}
16551763; CHECK: [[LOOP39]] = distinct !{[[LOOP39]], [[META2]], [[META1]]}
1764+ ; CHECK: [[LOOP40]] = distinct !{[[LOOP40]], [[META1]], [[META2]]}
1765+ ; CHECK: [[LOOP41]] = distinct !{[[LOOP41]], [[META2]], [[META1]]}
16561766;.
0 commit comments