Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / ARM / CGP / arm-cgp-overflow.ll
blob8e10876c0b108d7605aba1931a9142e92041e3cb
1 ; RUN: llc -mtriple=thumbv8m.main -mcpu=cortex-m33 %s -arm-disable-cgp=false -o - | FileCheck %s
3 ; CHECK: overflow_add
4 ; CHECK: add
5 ; CHECK: uxth
6 ; CHECK: cmp
7 define zeroext i16 @overflow_add(i16 zeroext %a, i16 zeroext %b) {
8   %add = add i16 %a, %b
9   %or = or i16 %add, 1
10   %cmp = icmp ugt i16 %or, 1024
11   %res = select i1 %cmp, i16 2, i16 5
12   ret i16 %res
15 ; CHECK-LABEL: overflow_sub
16 ; CHECK: sub
17 ; CHECK: uxth
18 ; CHECK: cmp
19 define zeroext i16 @overflow_sub(i16 zeroext %a, i16 zeroext %b) {
20   %add = sub i16 %a, %b
21   %or = or i16 %add, 1
22   %cmp = icmp ugt i16 %or, 1024
23   %res = select i1 %cmp, i16 2, i16 5
24   ret i16 %res
27 ; CHECK-LABEL: overflow_mul
28 ; CHECK: mul
29 ; CHECK: uxth
30 ; CHECK: cmp
31 define zeroext i16 @overflow_mul(i16 zeroext %a, i16 zeroext %b) {
32   %add = mul i16 %a, %b
33   %or = or i16 %add, 1
34   %cmp = icmp ugt i16 %or, 1024
35   %res = select i1 %cmp, i16 2, i16 5
36   ret i16 %res
39 ; CHECK-LABEL: overflow_shl
40 ; CHECK-COMMON: lsl
41 ; CHECK-COMMON: uxth
42 ; CHECK-COMMON: cmp
43 define zeroext i16 @overflow_shl(i16 zeroext %a, i16 zeroext %b) {
44   %add = shl i16 %a, %b
45   %or = or i16 %add, 1
46   %cmp = icmp ugt i16 %or, 1024
47   %res = select i1 %cmp, i16 2, i16 5
48   ret i16 %res
51 ; CHECK-LABEL: overflow_add_no_consts:
52 ; CHECK:  add r0, r1
53 ; CHECK:  uxtb [[EXT:r[0-9]+]], r0
54 ; CHECK:  cmp [[EXT]], r2
55 ; CHECK:  movhi r0, #8
56 define i32 @overflow_add_no_consts(i8 zeroext %a, i8 zeroext %b, i8 zeroext %limit) {
57   %add = add i8 %a, %b
58   %cmp = icmp ugt i8 %add, %limit
59   %res = select i1 %cmp, i32 8, i32 16
60   ret i32 %res
63 ; CHECK-LABEL: overflow_add_const_limit:
64 ; CHECK:  add r0, r1
65 ; CHECK:  uxtb [[EXT:r[0-9]+]], r0
66 ; CHECK:  cmp [[EXT]], #128
67 ; CHECK:  movhi r0, #8
68 define i32 @overflow_add_const_limit(i8 zeroext %a, i8 zeroext %b) {
69   %add = add i8 %a, %b
70   %cmp = icmp ugt i8 %add, 128
71   %res = select i1 %cmp, i32 8, i32 16
72   ret i32 %res
75 ; CHECK-LABEL: overflow_add_positive_const_limit:
76 ; CHECK:  adds r0, #1
77 ; CHECK:  uxtb [[EXT:r[0-9]+]], r0
78 ; CHECK:  cmp [[EXT]], #128
79 ; CHECK:  movhi r0, #8
80 define i32 @overflow_add_positive_const_limit(i8 zeroext %a) {
81   %add = add i8 %a, 1
82   %cmp = icmp ugt i8 %add, 128
83   %res = select i1 %cmp, i32 8, i32 16
84   ret i32 %res
87 ; CHECK-LABEL: unsafe_add_underflow:
88 ; CHECK:  subs r0, #2
89 ; CHECK:  uxtb [[EXT:r[0-9]+]], r0
90 ; CHECK:  cmp [[EXT]], #255
91 ; CHECK:  moveq r0, #8
92 define i32 @unsafe_add_underflow(i8 zeroext %a) {
93   %add = add i8 %a, -2
94   %cmp = icmp ugt i8 %add, 254
95   %res = select i1 %cmp, i32 8, i32 16
96   ret i32 %res
99 ; CHECK-LABEL: safe_add_underflow:
100 ; CHECK:      subs [[MINUS_1:r[0-9]+]], r0, #1
101 ; CHECK-NOT:  uxtb
102 ; CHECK:      cmp [[MINUS_1]], #254
103 ; CHECK:      movhi r0, #8
104 define i32 @safe_add_underflow(i8 zeroext %a) {
105   %add = add i8 %a, -1
106   %cmp = icmp ugt i8 %add, 254
107   %res = select i1 %cmp, i32 8, i32 16
108   ret i32 %res
111 ; CHECK-LABEL: safe_add_underflow_neg:
112 ; CHECK:      subs [[MINUS_1:r[0-9]+]], r0, #2
113 ; CHECK-NOT:  uxtb
114 ; CHECK:      cmp [[MINUS_1]], #251
115 ; CHECK:      movlo r0, #8
116 define i32 @safe_add_underflow_neg(i8 zeroext %a) {
117   %add = add i8 %a, -2
118   %cmp = icmp ule i8 %add, -6
119   %res = select i1 %cmp, i32 8, i32 16
120   ret i32 %res
123 ; CHECK-LABEL: overflow_sub_negative_const_limit:
124 ; CHECK:  adds r0, #1
125 ; CHECK:  uxtb [[EXT:r[0-9]+]], r0
126 ; CHECK:  cmp [[EXT]], #128
127 ; CHECK:  movhi r0, #8
128 define i32 @overflow_sub_negative_const_limit(i8 zeroext %a) {
129   %sub = sub i8 %a, -1
130   %cmp = icmp ugt i8 %sub, 128
131   %res = select i1 %cmp, i32 8, i32 16
132   ret i32 %res
135 ; CHECK-LABEL: unsafe_sub_underflow:
136 ; CHECK:  subs r0, #6
137 ; CHECK:  uxtb [[EXT:r[0-9]+]], r0
138 ; CHECK:  cmp [[EXT]], #250
139 ; CHECK:  movhi r0, #8
140 define i32 @unsafe_sub_underflow(i8 zeroext %a) {
141   %sub = sub i8 %a, 6
142   %cmp = icmp ugt i8 %sub, 250
143   %res = select i1 %cmp, i32 8, i32 16
144   ret i32 %res
147 ; CHECK-LABEL: safe_sub_underflow:
148 ; CHECK:      subs [[MINUS_1:r[0-9]+]], r0, #1
149 ; CHECK-NOT:  uxtb
150 ; CHECK:      cmp [[MINUS_1]], #255
151 ; CHECK:      movlo r0, #8
152 define i32 @safe_sub_underflow(i8 zeroext %a) {
153   %sub = sub i8 %a, 1
154   %cmp = icmp ule i8 %sub, 254
155   %res = select i1 %cmp, i32 8, i32 16
156   ret i32 %res
159 ; CHECK-LABEL: safe_sub_underflow_neg
160 ; CHECK:      subs [[MINUS_1:r[0-9]+]], r0, #4
161 ; CHECK-NOT:  uxtb
162 ; CHECK:      cmp [[MINUS_1]], #250
163 ; CHECK:      movhi r0, #8
164 define i32 @safe_sub_underflow_neg(i8 zeroext %a) {
165   %sub = sub i8 %a, 4
166   %cmp = icmp uge i8 %sub, -5
167   %res = select i1 %cmp, i32 8, i32 16
168   ret i32 %res
171 ; CHECK-LABEL: unsafe_sub_underflow_neg
172 ; CHECK:  subs r0, #4
173 ; CHECK:  uxtb [[EXT:r[0-9]+]], r0
174 ; CHECK:  cmp [[EXT]], #253
175 ; CHECK:  movlo r0, #8
176 define i32 @unsafe_sub_underflow_neg(i8 zeroext %a) {
177   %sub = sub i8 %a, 4
178   %cmp = icmp ult i8 %sub, -3
179   %res = select i1 %cmp, i32 8, i32 16
180   ret i32 %res
183 ; CHECK:      rsb.w [[RSUB:r[0-9]+]], r0, #248
184 ; CHECK-NOT:  uxt
185 ; CHECK:      cmp [[RSUB]], #252
186 define i32 @safe_sub_imm_var(i8* %b) {
187 entry:
188   %0 = load i8, i8* %b, align 1
189   %sub = sub nuw nsw i8 -8, %0
190   %cmp = icmp ugt i8 %sub, 252
191   %conv4 = zext i1 %cmp to i32
192   ret i32 %conv4
195 ; CHECK-LABEL: safe_sub_var_imm
196 ; CHECK:      add.w [[ADD:r[0-9]+]], r0, #8
197 ; CHECK-NOT:  uxt
198 ; CHECK:      cmp [[ADD]], #252
199 define i32 @safe_sub_var_imm(i8* %b) {
200 entry:
201   %0 = load i8, i8* %b, align 1
202   %sub = sub nuw nsw i8 %0, -8
203   %cmp = icmp ugt i8 %sub, 252
204   %conv4 = zext i1 %cmp to i32
205   ret i32 %conv4
208 ; CHECK-LABEL: safe_add_imm_var
209 ; CHECK:      add.w [[ADD:r[0-9]+]], r0, #129
210 ; CHECK-NOT:  uxt
211 ; CHECK:      cmp [[ADD]], #127
212 define i32 @safe_add_imm_var(i8* %b) {
213 entry:
214   %0 = load i8, i8* %b, align 1
215   %add = add nuw nsw i8 -127, %0
216   %cmp = icmp ugt i8 %add, 127
217   %conv4 = zext i1 %cmp to i32
218   ret i32 %conv4
221 ; CHECK-LABEL: safe_add_var_imm
222 ; CHECK:      sub.w [[SUB:r[0-9]+]], r0, #127
223 ; CHECK-NOT:  uxt
224 ; CHECK:      cmp [[SUB]], #127
225 define i32 @safe_add_var_imm(i8* %b) {
226 entry:
227   %0 = load i8, i8* %b, align 1
228   %add = add nuw nsw i8 %0, -127
229   %cmp = icmp ugt i8 %add, 127
230   %conv4 = zext i1 %cmp to i32
231   ret i32 %conv4