xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/sub-nsw.ll (revision 003fb2aeb49dc7440cab7e009bd264f8f42fc8dc)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
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]], 10
10; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
11; CHECK:       [[IF_THEN]]:
12; CHECK-NEXT:    ret i1 true
13; CHECK:       [[IF_ELSE]]:
14; CHECK-NEXT:    ret i1 true
15;
16entry:
17  %sub = sub nsw i32 %y, %x
18  %cond = icmp sgt i32 %sub, 10
19  br i1 %cond, label %if.then, label %if.else
20
21if.then:
22  %ret = icmp slt i32 %x, %y
23  ret i1 %ret
24
25if.else:
26  ret i1 true
27}
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]], 0
35; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
36; CHECK:       [[IF_THEN]]:
37; CHECK-NEXT:    ret i1 true
38; CHECK:       [[IF_ELSE]]:
39; CHECK-NEXT:    ret i1 true
40;
41entry:
42  %sub = sub nsw i32 %y, %x
43  %cond = icmp sgt i32 %sub, 0
44  br i1 %cond, label %if.then, label %if.else
45
46if.then:
47  %ret = icmp slt i32 %x, %y
48  ret i1 %ret
49
50if.else:
51  ret i1 true
52}
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]], 10
60; CHECK-NEXT:    br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
61; CHECK:       [[IF_THEN]]:
62; CHECK-NEXT:    ret i1 false
63; CHECK:       [[IF_ELSE]]:
64; CHECK-NEXT:    ret i1 true
65;
66entry:
67  %sub = sub nsw i32 %y, %x
68  %cond = icmp sgt i32 %sub, 10
69  br i1 %cond, label %if.then, label %if.else
70
71if.then:
72  %ret = icmp sge i32 %x, %y
73  ret i1 %ret
74
75if.else:
76  ret i1 true
77}
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]], 10
85; 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 true
91;
92entry:
93  %sub = sub i32 %y, %x
94  %cond = icmp sgt i32 %sub, 10
95  br i1 %cond, label %if.then, label %if.else
96
97if.then:
98  %ret = icmp slt i32 %x, %y
99  ret i1 %ret
100
101if.else:
102  ret i1 true
103}
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]], -10
111; 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 true
117;
118entry:
119  %sub = sub nsw i32 %y, %x
120  %cond = icmp sgt i32 %sub, -10
121  br i1 %cond, label %if.then, label %if.else
122
123if.then:
124  %ret = icmp slt i32 %x, %y
125  ret i1 %ret
126
127if.else:
128  ret i1 true
129}
130