1*003fb2aeSYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2*003fb2aeSYingwei Zheng; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3*003fb2aeSYingwei Zheng 4*003fb2aeSYingwei Zhengdefine i1 @test_decompose_sub_nsw_sgt_nonneg(i32 %x, i32 %y) { 5*003fb2aeSYingwei Zheng; CHECK-LABEL: define i1 @test_decompose_sub_nsw_sgt_nonneg( 6*003fb2aeSYingwei Zheng; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { 7*003fb2aeSYingwei Zheng; CHECK-NEXT: [[ENTRY:.*:]] 8*003fb2aeSYingwei Zheng; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[Y]], [[X]] 9*003fb2aeSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 10 10*003fb2aeSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 11*003fb2aeSYingwei Zheng; CHECK: [[IF_THEN]]: 12*003fb2aeSYingwei Zheng; CHECK-NEXT: ret i1 true 13*003fb2aeSYingwei Zheng; CHECK: [[IF_ELSE]]: 14*003fb2aeSYingwei Zheng; CHECK-NEXT: ret i1 true 15*003fb2aeSYingwei Zheng; 16*003fb2aeSYingwei Zhengentry: 17*003fb2aeSYingwei Zheng %sub = sub nsw i32 %y, %x 18*003fb2aeSYingwei Zheng %cond = icmp sgt i32 %sub, 10 19*003fb2aeSYingwei Zheng br i1 %cond, label %if.then, label %if.else 20*003fb2aeSYingwei Zheng 21*003fb2aeSYingwei Zhengif.then: 22*003fb2aeSYingwei Zheng %ret = icmp slt i32 %x, %y 23*003fb2aeSYingwei Zheng ret i1 %ret 24*003fb2aeSYingwei Zheng 25*003fb2aeSYingwei Zhengif.else: 26*003fb2aeSYingwei Zheng ret i1 true 27*003fb2aeSYingwei Zheng} 28*003fb2aeSYingwei Zheng 29*003fb2aeSYingwei Zhengdefine i1 @test_decompose_sub_nsw_sgt_zero(i32 %x, i32 %y) { 30*003fb2aeSYingwei Zheng; CHECK-LABEL: define i1 @test_decompose_sub_nsw_sgt_zero( 31*003fb2aeSYingwei Zheng; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { 32*003fb2aeSYingwei Zheng; CHECK-NEXT: [[ENTRY:.*:]] 33*003fb2aeSYingwei Zheng; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[Y]], [[X]] 34*003fb2aeSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 0 35*003fb2aeSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 36*003fb2aeSYingwei Zheng; CHECK: [[IF_THEN]]: 37*003fb2aeSYingwei Zheng; CHECK-NEXT: ret i1 true 38*003fb2aeSYingwei Zheng; CHECK: [[IF_ELSE]]: 39*003fb2aeSYingwei Zheng; CHECK-NEXT: ret i1 true 40*003fb2aeSYingwei Zheng; 41*003fb2aeSYingwei Zhengentry: 42*003fb2aeSYingwei Zheng %sub = sub nsw i32 %y, %x 43*003fb2aeSYingwei Zheng %cond = icmp sgt i32 %sub, 0 44*003fb2aeSYingwei Zheng br i1 %cond, label %if.then, label %if.else 45*003fb2aeSYingwei Zheng 46*003fb2aeSYingwei Zhengif.then: 47*003fb2aeSYingwei Zheng %ret = icmp slt i32 %x, %y 48*003fb2aeSYingwei Zheng ret i1 %ret 49*003fb2aeSYingwei Zheng 50*003fb2aeSYingwei Zhengif.else: 51*003fb2aeSYingwei Zheng ret i1 true 52*003fb2aeSYingwei Zheng} 53*003fb2aeSYingwei Zheng 54*003fb2aeSYingwei Zhengdefine i1 @test_decompose_sub_nsw_sgt_zero_inv(i32 %x, i32 %y) { 55*003fb2aeSYingwei Zheng; CHECK-LABEL: define i1 @test_decompose_sub_nsw_sgt_zero_inv( 56*003fb2aeSYingwei Zheng; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { 57*003fb2aeSYingwei Zheng; CHECK-NEXT: [[ENTRY:.*:]] 58*003fb2aeSYingwei Zheng; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[Y]], [[X]] 59*003fb2aeSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 10 60*003fb2aeSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 61*003fb2aeSYingwei Zheng; CHECK: [[IF_THEN]]: 62*003fb2aeSYingwei Zheng; CHECK-NEXT: ret i1 false 63*003fb2aeSYingwei Zheng; CHECK: [[IF_ELSE]]: 64*003fb2aeSYingwei Zheng; CHECK-NEXT: ret i1 true 65*003fb2aeSYingwei Zheng; 66*003fb2aeSYingwei Zhengentry: 67*003fb2aeSYingwei Zheng %sub = sub nsw i32 %y, %x 68*003fb2aeSYingwei Zheng %cond = icmp sgt i32 %sub, 10 69*003fb2aeSYingwei Zheng br i1 %cond, label %if.then, label %if.else 70*003fb2aeSYingwei Zheng 71*003fb2aeSYingwei Zhengif.then: 72*003fb2aeSYingwei Zheng %ret = icmp sge i32 %x, %y 73*003fb2aeSYingwei Zheng ret i1 %ret 74*003fb2aeSYingwei Zheng 75*003fb2aeSYingwei Zhengif.else: 76*003fb2aeSYingwei Zheng ret i1 true 77*003fb2aeSYingwei Zheng} 78*003fb2aeSYingwei Zheng 79*003fb2aeSYingwei Zhengdefine i1 @test_decompose_sub_nonsw_sgt_zero(i32 %x, i32 %y) { 80*003fb2aeSYingwei Zheng; CHECK-LABEL: define i1 @test_decompose_sub_nonsw_sgt_zero( 81*003fb2aeSYingwei Zheng; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { 82*003fb2aeSYingwei Zheng; CHECK-NEXT: [[ENTRY:.*:]] 83*003fb2aeSYingwei Zheng; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[Y]], [[X]] 84*003fb2aeSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], 10 85*003fb2aeSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 86*003fb2aeSYingwei Zheng; CHECK: [[IF_THEN]]: 87*003fb2aeSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = icmp slt i32 [[X]], [[Y]] 88*003fb2aeSYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 89*003fb2aeSYingwei Zheng; CHECK: [[IF_ELSE]]: 90*003fb2aeSYingwei Zheng; CHECK-NEXT: ret i1 true 91*003fb2aeSYingwei Zheng; 92*003fb2aeSYingwei Zhengentry: 93*003fb2aeSYingwei Zheng %sub = sub i32 %y, %x 94*003fb2aeSYingwei Zheng %cond = icmp sgt i32 %sub, 10 95*003fb2aeSYingwei Zheng br i1 %cond, label %if.then, label %if.else 96*003fb2aeSYingwei Zheng 97*003fb2aeSYingwei Zhengif.then: 98*003fb2aeSYingwei Zheng %ret = icmp slt i32 %x, %y 99*003fb2aeSYingwei Zheng ret i1 %ret 100*003fb2aeSYingwei Zheng 101*003fb2aeSYingwei Zhengif.else: 102*003fb2aeSYingwei Zheng ret i1 true 103*003fb2aeSYingwei Zheng} 104*003fb2aeSYingwei Zheng 105*003fb2aeSYingwei Zhengdefine i1 @test_decompose_sub_nsw_sgt_neg(i32 %x, i32 %y) { 106*003fb2aeSYingwei Zheng; CHECK-LABEL: define i1 @test_decompose_sub_nsw_sgt_neg( 107*003fb2aeSYingwei Zheng; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) { 108*003fb2aeSYingwei Zheng; CHECK-NEXT: [[ENTRY:.*:]] 109*003fb2aeSYingwei Zheng; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[Y]], [[X]] 110*003fb2aeSYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp sgt i32 [[SUB]], -10 111*003fb2aeSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] 112*003fb2aeSYingwei Zheng; CHECK: [[IF_THEN]]: 113*003fb2aeSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = icmp slt i32 [[X]], [[Y]] 114*003fb2aeSYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 115*003fb2aeSYingwei Zheng; CHECK: [[IF_ELSE]]: 116*003fb2aeSYingwei Zheng; CHECK-NEXT: ret i1 true 117*003fb2aeSYingwei Zheng; 118*003fb2aeSYingwei Zhengentry: 119*003fb2aeSYingwei Zheng %sub = sub nsw i32 %y, %x 120*003fb2aeSYingwei Zheng %cond = icmp sgt i32 %sub, -10 121*003fb2aeSYingwei Zheng br i1 %cond, label %if.then, label %if.else 122*003fb2aeSYingwei Zheng 123*003fb2aeSYingwei Zhengif.then: 124*003fb2aeSYingwei Zheng %ret = icmp slt i32 %x, %y 125*003fb2aeSYingwei Zheng ret i1 %ret 126*003fb2aeSYingwei Zheng 127*003fb2aeSYingwei Zhengif.else: 128*003fb2aeSYingwei Zheng ret i1 true 129*003fb2aeSYingwei Zheng} 130