xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-signed.ll (revision ed1632b72ec029256f3af60822dad54970a79577)
165df6961SNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
265df6961SNikita Popov; RUN: opt -S -passes=constraint-elimination < %s | FileCheck %s
365df6961SNikita Popov
465df6961SNikita Popovdeclare void @use(i1)
565df6961SNikita Popov
665df6961SNikita Popovdefine void @signed_iv_step_1(i64 %end) {
765df6961SNikita Popov; CHECK-LABEL: define void @signed_iv_step_1(
865df6961SNikita Popov; CHECK-SAME: i64 [[END:%.*]]) {
965df6961SNikita Popov; CHECK-NEXT:  entry:
1065df6961SNikita Popov; CHECK-NEXT:    [[PRECOND:%.*]] = icmp sge i64 [[END]], -10
1165df6961SNikita Popov; CHECK-NEXT:    br i1 [[PRECOND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
1265df6961SNikita Popov; CHECK:       loop:
1365df6961SNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ -10, [[ENTRY:%.*]] ]
1465df6961SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1
1565df6961SNikita Popov; CHECK-NEXT:    [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
1665df6961SNikita Popov; CHECK-NEXT:    br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
1765df6961SNikita Popov; CHECK:       loop.latch:
18*ed1632b7SNikita Popov; CHECK-NEXT:    call void @use(i1 true)
19*ed1632b7SNikita Popov; CHECK-NEXT:    call void @use(i1 true)
2065df6961SNikita Popov; CHECK-NEXT:    br label [[LOOP]]
2165df6961SNikita Popov; CHECK:       exit:
2265df6961SNikita Popov; CHECK-NEXT:    ret void
2365df6961SNikita Popov;
2465df6961SNikita Popoventry:
2565df6961SNikita Popov  %precond = icmp sge i64 %end, -10
2665df6961SNikita Popov  br i1 %precond, label %loop, label %exit
2765df6961SNikita Popov
2865df6961SNikita Popovloop:
2965df6961SNikita Popov  %iv = phi i64 [ %iv.next, %loop.latch ], [ -10, %entry ]
3065df6961SNikita Popov  %iv.next = add i64 %iv, 1
3165df6961SNikita Popov  %cmp.i.not = icmp eq i64 %iv, %end
3265df6961SNikita Popov  br i1 %cmp.i.not, label %exit, label %loop.latch
3365df6961SNikita Popov
3465df6961SNikita Popovloop.latch:
3565df6961SNikita Popov  %cmp2 = icmp slt i64 %iv, %end
3665df6961SNikita Popov  call void @use(i1 %cmp2)
3765df6961SNikita Popov  %cmp3 = icmp sge i64 %iv, -10
3865df6961SNikita Popov  call void @use(i1 %cmp3)
3965df6961SNikita Popov  br label %loop
4065df6961SNikita Popov
4165df6961SNikita Popovexit:
4265df6961SNikita Popov  ret void
4365df6961SNikita Popov}
4465df6961SNikita Popov
4565df6961SNikita Popovdefine void @signed_iv_step_4(i64 %count) {
4665df6961SNikita Popov; CHECK-LABEL: define void @signed_iv_step_4(
4765df6961SNikita Popov; CHECK-SAME: i64 [[COUNT:%.*]]) {
4865df6961SNikita Popov; CHECK-NEXT:  entry:
4965df6961SNikita Popov; CHECK-NEXT:    [[END:%.*]] = shl nsw i64 [[COUNT]], 2
5065df6961SNikita Popov; CHECK-NEXT:    [[PRECOND:%.*]] = icmp sgt i64 [[COUNT]], -1
5165df6961SNikita Popov; CHECK-NEXT:    br i1 [[PRECOND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
5265df6961SNikita Popov; CHECK:       loop:
5365df6961SNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]
5465df6961SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 4
5565df6961SNikita Popov; CHECK-NEXT:    [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
5665df6961SNikita Popov; CHECK-NEXT:    br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
5765df6961SNikita Popov; CHECK:       loop.latch:
5865df6961SNikita Popov; CHECK-NEXT:    call void @use(i1 true)
5965df6961SNikita Popov; CHECK-NEXT:    call void @use(i1 true)
6065df6961SNikita Popov; CHECK-NEXT:    br label [[LOOP]]
6165df6961SNikita Popov; CHECK:       exit:
6265df6961SNikita Popov; CHECK-NEXT:    ret void
6365df6961SNikita Popov;
6465df6961SNikita Popoventry:
6565df6961SNikita Popov  %end = shl nsw i64 %count, 2
6665df6961SNikita Popov  %precond = icmp sgt i64 %count, -1
6765df6961SNikita Popov  br i1 %precond, label %loop, label %exit
6865df6961SNikita Popov
6965df6961SNikita Popovloop:
7065df6961SNikita Popov  %iv = phi i64 [ %iv.next, %loop.latch ], [ 0, %entry ]
7165df6961SNikita Popov  %iv.next = add i64 %iv, 4
7265df6961SNikita Popov  %cmp.i.not = icmp eq i64 %iv, %end
7365df6961SNikita Popov  br i1 %cmp.i.not, label %exit, label %loop.latch
7465df6961SNikita Popov
7565df6961SNikita Popovloop.latch:
7665df6961SNikita Popov  %cmp2 = icmp slt i64 %iv, %end
7765df6961SNikita Popov  call void @use(i1 %cmp2)
7865df6961SNikita Popov  %cmp3 = icmp sge i64 %iv, 0
7965df6961SNikita Popov  call void @use(i1 %cmp3)
8065df6961SNikita Popov  br label %loop
8165df6961SNikita Popov
8265df6961SNikita Popovexit:
8365df6961SNikita Popov  ret void
8465df6961SNikita Popov}
8565df6961SNikita Popov
8665df6961SNikita Popovdefine void @signed_iv_step_4_missing_precond(i64 %count) {
8765df6961SNikita Popov; CHECK-LABEL: define void @signed_iv_step_4_missing_precond(
8865df6961SNikita Popov; CHECK-SAME: i64 [[COUNT:%.*]]) {
8965df6961SNikita Popov; CHECK-NEXT:  entry:
9065df6961SNikita Popov; CHECK-NEXT:    [[END:%.*]] = shl i64 [[COUNT]], 2
9165df6961SNikita Popov; CHECK-NEXT:    [[PRECOND:%.*]] = icmp sgt i64 [[COUNT]], -1
9265df6961SNikita Popov; CHECK-NEXT:    br i1 [[PRECOND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
9365df6961SNikita Popov; CHECK:       loop:
9465df6961SNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]
9565df6961SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 4
9665df6961SNikita Popov; CHECK-NEXT:    [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
9765df6961SNikita Popov; CHECK-NEXT:    br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
9865df6961SNikita Popov; CHECK:       loop.latch:
9965df6961SNikita Popov; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i64 [[IV]], [[END]]
10065df6961SNikita Popov; CHECK-NEXT:    call void @use(i1 [[CMP2]])
10165df6961SNikita Popov; CHECK-NEXT:    [[CMP3:%.*]] = icmp sge i64 [[IV]], 0
10265df6961SNikita Popov; CHECK-NEXT:    call void @use(i1 [[CMP3]])
10365df6961SNikita Popov; CHECK-NEXT:    br label [[LOOP]]
10465df6961SNikita Popov; CHECK:       exit:
10565df6961SNikita Popov; CHECK-NEXT:    ret void
10665df6961SNikita Popov;
10765df6961SNikita Popoventry:
10865df6961SNikita Popov  %end = shl i64 %count, 2
10965df6961SNikita Popov  %precond = icmp sgt i64 %count, -1
11065df6961SNikita Popov  br i1 %precond, label %loop, label %exit
11165df6961SNikita Popov
11265df6961SNikita Popovloop:
11365df6961SNikita Popov  %iv = phi i64 [ %iv.next, %loop.latch ], [ 0, %entry ]
11465df6961SNikita Popov  %iv.next = add i64 %iv, 4
11565df6961SNikita Popov  %cmp.i.not = icmp eq i64 %iv, %end
11665df6961SNikita Popov  br i1 %cmp.i.not, label %exit, label %loop.latch
11765df6961SNikita Popov
11865df6961SNikita Popovloop.latch:
11965df6961SNikita Popov  %cmp2 = icmp slt i64 %iv, %end
12065df6961SNikita Popov  call void @use(i1 %cmp2)
12165df6961SNikita Popov  %cmp3 = icmp sge i64 %iv, 0
12265df6961SNikita Popov  call void @use(i1 %cmp3)
12365df6961SNikita Popov  br label %loop
12465df6961SNikita Popov
12565df6961SNikita Popovexit:
12665df6961SNikita Popov  ret void
12765df6961SNikita Popov}
12865df6961SNikita Popov
12965df6961SNikita Popovdefine void @signed_iv_step_4_start_4(i64 %count) {
13065df6961SNikita Popov; CHECK-LABEL: define void @signed_iv_step_4_start_4(
13165df6961SNikita Popov; CHECK-SAME: i64 [[COUNT:%.*]]) {
13265df6961SNikita Popov; CHECK-NEXT:  entry:
13365df6961SNikita Popov; CHECK-NEXT:    [[END:%.*]] = shl nsw i64 [[COUNT]], 2
13465df6961SNikita Popov; CHECK-NEXT:    [[PRECOND:%.*]] = icmp sgt i64 [[COUNT]], 0
13565df6961SNikita Popov; CHECK-NEXT:    br i1 [[PRECOND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
13665df6961SNikita Popov; CHECK:       loop:
13765df6961SNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 4, [[ENTRY:%.*]] ]
13865df6961SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 4
13965df6961SNikita Popov; CHECK-NEXT:    [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
14065df6961SNikita Popov; CHECK-NEXT:    br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
14165df6961SNikita Popov; CHECK:       loop.latch:
142*ed1632b7SNikita Popov; CHECK-NEXT:    call void @use(i1 true)
143*ed1632b7SNikita Popov; CHECK-NEXT:    call void @use(i1 true)
14465df6961SNikita Popov; CHECK-NEXT:    br label [[LOOP]]
14565df6961SNikita Popov; CHECK:       exit:
14665df6961SNikita Popov; CHECK-NEXT:    ret void
14765df6961SNikita Popov;
14865df6961SNikita Popoventry:
14965df6961SNikita Popov  %end = shl nsw i64 %count, 2
15065df6961SNikita Popov  %precond = icmp sgt i64 %count, 0
15165df6961SNikita Popov  br i1 %precond, label %loop, label %exit
15265df6961SNikita Popov
15365df6961SNikita Popovloop:
15465df6961SNikita Popov  %iv = phi i64 [ %iv.next, %loop.latch ], [ 4, %entry ]
15565df6961SNikita Popov  %iv.next = add i64 %iv, 4
15665df6961SNikita Popov  %cmp.i.not = icmp eq i64 %iv, %end
15765df6961SNikita Popov  br i1 %cmp.i.not, label %exit, label %loop.latch
15865df6961SNikita Popov
15965df6961SNikita Popovloop.latch:
16065df6961SNikita Popov  %cmp2 = icmp slt i64 %iv, %end
16165df6961SNikita Popov  call void @use(i1 %cmp2)
16265df6961SNikita Popov  %cmp3 = icmp sge i64 %iv, 4
16365df6961SNikita Popov  call void @use(i1 %cmp3)
16465df6961SNikita Popov  br label %loop
16565df6961SNikita Popov
16665df6961SNikita Popovexit:
16765df6961SNikita Popov  ret void
16865df6961SNikita Popov}
16965df6961SNikita Popov
17065df6961SNikita Popovdefine void @signed_iv_step_4_start_4_missing_precond(i64 %count) {
17165df6961SNikita Popov; CHECK-LABEL: define void @signed_iv_step_4_start_4_missing_precond(
17265df6961SNikita Popov; CHECK-SAME: i64 [[COUNT:%.*]]) {
17365df6961SNikita Popov; CHECK-NEXT:  entry:
17465df6961SNikita Popov; CHECK-NEXT:    [[END:%.*]] = shl nsw i64 [[COUNT]], 2
17565df6961SNikita Popov; CHECK-NEXT:    [[PRECOND:%.*]] = icmp sgt i64 [[COUNT]], -1
17665df6961SNikita Popov; CHECK-NEXT:    br i1 [[PRECOND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
17765df6961SNikita Popov; CHECK:       loop:
17865df6961SNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 4, [[ENTRY:%.*]] ]
17965df6961SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 4
18065df6961SNikita Popov; CHECK-NEXT:    [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
18165df6961SNikita Popov; CHECK-NEXT:    br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
18265df6961SNikita Popov; CHECK:       loop.latch:
18365df6961SNikita Popov; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i64 [[IV]], [[END]]
18465df6961SNikita Popov; CHECK-NEXT:    call void @use(i1 [[CMP2]])
18565df6961SNikita Popov; CHECK-NEXT:    [[CMP3:%.*]] = icmp sge i64 [[IV]], 4
18665df6961SNikita Popov; CHECK-NEXT:    call void @use(i1 [[CMP3]])
18765df6961SNikita Popov; CHECK-NEXT:    br label [[LOOP]]
18865df6961SNikita Popov; CHECK:       exit:
18965df6961SNikita Popov; CHECK-NEXT:    ret void
19065df6961SNikita Popov;
19165df6961SNikita Popoventry:
19265df6961SNikita Popov  %end = shl nsw i64 %count, 2
19365df6961SNikita Popov  %precond = icmp sgt i64 %count, -1
19465df6961SNikita Popov  br i1 %precond, label %loop, label %exit
19565df6961SNikita Popov
19665df6961SNikita Popovloop:
19765df6961SNikita Popov  %iv = phi i64 [ %iv.next, %loop.latch ], [ 4, %entry ]
19865df6961SNikita Popov  %iv.next = add i64 %iv, 4
19965df6961SNikita Popov  %cmp.i.not = icmp eq i64 %iv, %end
20065df6961SNikita Popov  br i1 %cmp.i.not, label %exit, label %loop.latch
20165df6961SNikita Popov
20265df6961SNikita Popovloop.latch:
20365df6961SNikita Popov  %cmp2 = icmp slt i64 %iv, %end
20465df6961SNikita Popov  call void @use(i1 %cmp2)
20565df6961SNikita Popov  %cmp3 = icmp sge i64 %iv, 4
20665df6961SNikita Popov  call void @use(i1 %cmp3)
20765df6961SNikita Popov  br label %loop
20865df6961SNikita Popov
20965df6961SNikita Popovexit:
21065df6961SNikita Popov  ret void
21165df6961SNikita Popov}
21265df6961SNikita Popov
21365df6961SNikita Popovdefine void @signed_iv_step_minus1(i64 %end) {
21465df6961SNikita Popov; CHECK-LABEL: define void @signed_iv_step_minus1(
21565df6961SNikita Popov; CHECK-SAME: i64 [[END:%.*]]) {
21665df6961SNikita Popov; CHECK-NEXT:  entry:
21765df6961SNikita Popov; CHECK-NEXT:    [[PRECOND:%.*]] = icmp sle i64 [[END]], 10
21865df6961SNikita Popov; CHECK-NEXT:    br i1 [[PRECOND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
21965df6961SNikita Popov; CHECK:       loop:
22065df6961SNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 10, [[ENTRY:%.*]] ]
22165df6961SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], -1
22265df6961SNikita Popov; CHECK-NEXT:    [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
22365df6961SNikita Popov; CHECK-NEXT:    br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
22465df6961SNikita Popov; CHECK:       loop.latch:
225*ed1632b7SNikita Popov; CHECK-NEXT:    call void @use(i1 true)
226*ed1632b7SNikita Popov; CHECK-NEXT:    call void @use(i1 true)
22765df6961SNikita Popov; CHECK-NEXT:    br label [[LOOP]]
22865df6961SNikita Popov; CHECK:       exit:
22965df6961SNikita Popov; CHECK-NEXT:    ret void
23065df6961SNikita Popov;
23165df6961SNikita Popoventry:
23265df6961SNikita Popov  %precond = icmp sle i64 %end, 10
23365df6961SNikita Popov  br i1 %precond, label %loop, label %exit
23465df6961SNikita Popov
23565df6961SNikita Popovloop:
23665df6961SNikita Popov  %iv = phi i64 [ %iv.next, %loop.latch ], [ 10, %entry ]
23765df6961SNikita Popov  %iv.next = add i64 %iv, -1
23865df6961SNikita Popov  %cmp.i.not = icmp eq i64 %iv, %end
23965df6961SNikita Popov  br i1 %cmp.i.not, label %exit, label %loop.latch
24065df6961SNikita Popov
24165df6961SNikita Popovloop.latch:
24265df6961SNikita Popov  %cmp2 = icmp sgt i64 %iv, %end
24365df6961SNikita Popov  call void @use(i1 %cmp2)
24465df6961SNikita Popov  %cmp3 = icmp sle i64 %iv, 10
24565df6961SNikita Popov  call void @use(i1 %cmp3)
24665df6961SNikita Popov  br label %loop
24765df6961SNikita Popov
24865df6961SNikita Popovexit:
24965df6961SNikita Popov  ret void
25065df6961SNikita Popov}
25165df6961SNikita Popov
25265df6961SNikita Popovdefine void @signed_iv_step_minus1_missing_precond(i64 %end) {
25365df6961SNikita Popov; CHECK-LABEL: define void @signed_iv_step_minus1_missing_precond(
25465df6961SNikita Popov; CHECK-SAME: i64 [[END:%.*]]) {
25565df6961SNikita Popov; CHECK-NEXT:  entry:
25665df6961SNikita Popov; CHECK-NEXT:    [[PRECOND:%.*]] = icmp sle i64 [[END]], 11
25765df6961SNikita Popov; CHECK-NEXT:    br i1 [[PRECOND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
25865df6961SNikita Popov; CHECK:       loop:
25965df6961SNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 10, [[ENTRY:%.*]] ]
26065df6961SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV]], -1
26165df6961SNikita Popov; CHECK-NEXT:    [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
26265df6961SNikita Popov; CHECK-NEXT:    br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
26365df6961SNikita Popov; CHECK:       loop.latch:
26465df6961SNikita Popov; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i64 [[IV]], [[END]]
26565df6961SNikita Popov; CHECK-NEXT:    call void @use(i1 [[CMP2]])
26665df6961SNikita Popov; CHECK-NEXT:    [[CMP3:%.*]] = icmp sle i64 [[IV]], 10
26765df6961SNikita Popov; CHECK-NEXT:    call void @use(i1 [[CMP3]])
26865df6961SNikita Popov; CHECK-NEXT:    br label [[LOOP]]
26965df6961SNikita Popov; CHECK:       exit:
27065df6961SNikita Popov; CHECK-NEXT:    ret void
27165df6961SNikita Popov;
27265df6961SNikita Popoventry:
27365df6961SNikita Popov  %precond = icmp sle i64 %end, 11
27465df6961SNikita Popov  br i1 %precond, label %loop, label %exit
27565df6961SNikita Popov
27665df6961SNikita Popovloop:
27765df6961SNikita Popov  %iv = phi i64 [ %iv.next, %loop.latch ], [ 10, %entry ]
27865df6961SNikita Popov  %iv.next = add i64 %iv, -1
27965df6961SNikita Popov  %cmp.i.not = icmp eq i64 %iv, %end
28065df6961SNikita Popov  br i1 %cmp.i.not, label %exit, label %loop.latch
28165df6961SNikita Popov
28265df6961SNikita Popovloop.latch:
28365df6961SNikita Popov  %cmp2 = icmp sgt i64 %iv, %end
28465df6961SNikita Popov  call void @use(i1 %cmp2)
28565df6961SNikita Popov  %cmp3 = icmp sle i64 %iv, 10
28665df6961SNikita Popov  call void @use(i1 %cmp3)
28765df6961SNikita Popov  br label %loop
28865df6961SNikita Popov
28965df6961SNikita Popovexit:
29065df6961SNikita Popov  ret void
29165df6961SNikita Popov}
292