130 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4define i1 @test_decompose_sub_nsw_sgt_nonneg(i32 %x, i32 %y) {5; CHECK-LABEL: define i1 @test_decompose_sub_nsw_sgt_nonneg(6; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {7; CHECK-NEXT: [[ENTRY:.*:]]8; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[Y]], [[X]]9; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 1010; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]11; CHECK: [[IF_THEN]]:12; CHECK-NEXT: ret i1 true13; CHECK: [[IF_ELSE]]:14; CHECK-NEXT: ret i1 true15;16entry:17 %sub = sub nsw i32 %y, %x18 %cond = icmp sgt i32 %sub, 1019 br i1 %cond, label %if.then, label %if.else20 21if.then:22 %ret = icmp slt i32 %x, %y23 ret i1 %ret24 25if.else:26 ret i1 true27}28 29define i1 @test_decompose_sub_nsw_sgt_zero(i32 %x, i32 %y) {30; CHECK-LABEL: define i1 @test_decompose_sub_nsw_sgt_zero(31; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {32; CHECK-NEXT: [[ENTRY:.*:]]33; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[Y]], [[X]]34; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 035; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]36; CHECK: [[IF_THEN]]:37; CHECK-NEXT: ret i1 true38; CHECK: [[IF_ELSE]]:39; CHECK-NEXT: ret i1 true40;41entry:42 %sub = sub nsw i32 %y, %x43 %cond = icmp sgt i32 %sub, 044 br i1 %cond, label %if.then, label %if.else45 46if.then:47 %ret = icmp slt i32 %x, %y48 ret i1 %ret49 50if.else:51 ret i1 true52}53 54define i1 @test_decompose_sub_nsw_sgt_zero_inv(i32 %x, i32 %y) {55; CHECK-LABEL: define i1 @test_decompose_sub_nsw_sgt_zero_inv(56; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {57; CHECK-NEXT: [[ENTRY:.*:]]58; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[Y]], [[X]]59; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 1060; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]61; CHECK: [[IF_THEN]]:62; CHECK-NEXT: ret i1 false63; CHECK: [[IF_ELSE]]:64; CHECK-NEXT: ret i1 true65;66entry:67 %sub = sub nsw i32 %y, %x68 %cond = icmp sgt i32 %sub, 1069 br i1 %cond, label %if.then, label %if.else70 71if.then:72 %ret = icmp sge i32 %x, %y73 ret i1 %ret74 75if.else:76 ret i1 true77}78 79define i1 @test_decompose_sub_nonsw_sgt_zero(i32 %x, i32 %y) {80; CHECK-LABEL: define i1 @test_decompose_sub_nonsw_sgt_zero(81; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {82; CHECK-NEXT: [[ENTRY:.*:]]83; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[Y]], [[X]]84; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 1085; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]86; CHECK: [[IF_THEN]]:87; CHECK-NEXT: [[RET:%.*]] = icmp slt i32 [[X]], [[Y]]88; CHECK-NEXT: ret i1 [[RET]]89; CHECK: [[IF_ELSE]]:90; CHECK-NEXT: ret i1 true91;92entry:93 %sub = sub i32 %y, %x94 %cond = icmp sgt i32 %sub, 1095 br i1 %cond, label %if.then, label %if.else96 97if.then:98 %ret = icmp slt i32 %x, %y99 ret i1 %ret100 101if.else:102 ret i1 true103}104 105define i1 @test_decompose_sub_nsw_sgt_neg(i32 %x, i32 %y) {106; CHECK-LABEL: define i1 @test_decompose_sub_nsw_sgt_neg(107; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {108; CHECK-NEXT: [[ENTRY:.*:]]109; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[Y]], [[X]]110; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], -10111; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]112; CHECK: [[IF_THEN]]:113; CHECK-NEXT: [[RET:%.*]] = icmp slt i32 [[X]], [[Y]]114; CHECK-NEXT: ret i1 [[RET]]115; CHECK: [[IF_ELSE]]:116; CHECK-NEXT: ret i1 true117;118entry:119 %sub = sub nsw i32 %y, %x120 %cond = icmp sgt i32 %sub, -10121 br i1 %cond, label %if.then, label %if.else122 123if.then:124 %ret = icmp slt i32 %x, %y125 ret i1 %ret126 127if.else:128 ret i1 true129}130