xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/sub-nsw.ll (revision 003fb2aeb49dc7440cab7e009bd264f8f42fc8dc)
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