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