@@ -5,7 +5,7 @@ define i8 @sdiv_nonneg0_nonneg1(i8 %x, i8 %y) {
5
5
; CHECK-LABEL: @sdiv_nonneg0_nonneg1(
6
6
; CHECK-NEXT: [[PX:%.*]] = and i8 [[X:%.*]], 127
7
7
; CHECK-NEXT: [[PY:%.*]] = lshr i8 [[Y:%.*]], 1
8
- ; CHECK-NEXT: [[R:%.*]] = sdiv i8 [[PX]], [[PY]]
8
+ ; CHECK-NEXT: [[R:%.*]] = udiv i8 [[PX]], [[PY]]
9
9
; CHECK-NEXT: ret i8 [[R]]
10
10
;
11
11
%px = and i8 %x , 127
@@ -17,14 +17,16 @@ define i8 @sdiv_nonneg0_nonneg1(i8 %x, i8 %y) {
17
17
define i8 @sdiv_nonnegconst0_nonneg1 (i7 %y ) {
18
18
; CHECK-LABEL: @sdiv_nonnegconst0_nonneg1(
19
19
; CHECK-NEXT: [[PY:%.*]] = zext i7 [[Y:%.*]] to i8
20
- ; CHECK-NEXT: [[R:%.*]] = sdiv i8 42, [[PY]]
20
+ ; CHECK-NEXT: [[R:%.*]] = udiv i8 42, [[PY]]
21
21
; CHECK-NEXT: ret i8 [[R]]
22
22
;
23
23
%py = zext i7 %y to i8
24
24
%r = sdiv i8 42 , %py
25
25
ret i8 %r
26
26
}
27
27
28
+ ; TODO: This can be converted to udiv.
29
+
28
30
define i8 @sdiv_nonneg0_nonnegconst1 (i8 %x ) {
29
31
; CHECK-LABEL: @sdiv_nonneg0_nonnegconst1(
30
32
; CHECK-NEXT: [[PX:%.*]] = mul nsw i8 [[X:%.*]], [[X]]
@@ -36,6 +38,8 @@ define i8 @sdiv_nonneg0_nonnegconst1(i8 %x) {
36
38
ret i8 %r
37
39
}
38
40
41
+ ; negative test
42
+
39
43
define i8 @sdiv_unknown0_nonneg1 (i8 %x , i8 %y ) {
40
44
; CHECK-LABEL: @sdiv_unknown0_nonneg1(
41
45
; CHECK-NEXT: [[PY:%.*]] = lshr i8 [[Y:%.*]], 1
@@ -47,6 +51,8 @@ define i8 @sdiv_unknown0_nonneg1(i8 %x, i8 %y) {
47
51
ret i8 %r
48
52
}
49
53
54
+ ; negative test
55
+
50
56
define i8 @sdiv_nonnegconst0_unknown1 (i7 %y ) {
51
57
; CHECK-LABEL: @sdiv_nonnegconst0_unknown1(
52
58
; CHECK-NEXT: [[SY:%.*]] = sext i7 [[Y:%.*]] to i8
@@ -58,6 +64,8 @@ define i8 @sdiv_nonnegconst0_unknown1(i7 %y) {
58
64
ret i8 %r
59
65
}
60
66
67
+ ; negative test - mul must be 'nsw' to be known non-negative
68
+
61
69
define i8 @sdiv_unknown0_nonnegconst1 (i8 %x ) {
62
70
; CHECK-LABEL: @sdiv_unknown0_nonnegconst1(
63
71
; CHECK-NEXT: [[SX:%.*]] = mul i8 [[X:%.*]], [[X]]
@@ -73,7 +81,7 @@ define i8 @srem_nonneg0_nonneg1(i8 %x, i8 %y) {
73
81
; CHECK-LABEL: @srem_nonneg0_nonneg1(
74
82
; CHECK-NEXT: [[PX:%.*]] = and i8 [[X:%.*]], 127
75
83
; CHECK-NEXT: [[PY:%.*]] = lshr i8 [[Y:%.*]], 1
76
- ; CHECK-NEXT: [[R:%.*]] = srem i8 [[PX]], [[PY]]
84
+ ; CHECK-NEXT: [[R:%.*]] = urem i8 [[PX]], [[PY]]
77
85
; CHECK-NEXT: ret i8 [[R]]
78
86
;
79
87
%px = and i8 %x , 127
@@ -85,7 +93,7 @@ define i8 @srem_nonneg0_nonneg1(i8 %x, i8 %y) {
85
93
define i8 @srem_nonnegconst0_nonneg1 (i8 %y ) {
86
94
; CHECK-LABEL: @srem_nonnegconst0_nonneg1(
87
95
; CHECK-NEXT: [[PY:%.*]] = and i8 [[Y:%.*]], 127
88
- ; CHECK-NEXT: [[R:%.*]] = srem i8 42, [[PY]]
96
+ ; CHECK-NEXT: [[R:%.*]] = urem i8 42, [[PY]]
89
97
; CHECK-NEXT: ret i8 [[R]]
90
98
;
91
99
%py = and i8 %y , 127
@@ -96,14 +104,16 @@ define i8 @srem_nonnegconst0_nonneg1(i8 %y) {
96
104
define i8 @srem_nonneg0_nonnegconst1 (i7 %x ) {
97
105
; CHECK-LABEL: @srem_nonneg0_nonnegconst1(
98
106
; CHECK-NEXT: [[PX:%.*]] = zext i7 [[X:%.*]] to i8
99
- ; CHECK-NEXT: [[R:%.*]] = srem i8 [[PX]], 42
107
+ ; CHECK-NEXT: [[R:%.*]] = urem i8 [[PX]], 42
100
108
; CHECK-NEXT: ret i8 [[R]]
101
109
;
102
110
%px = zext i7 %x to i8
103
111
%r = srem i8 %px , 42
104
112
ret i8 %r
105
113
}
106
114
115
+ ; negative test
116
+
107
117
define i8 @srem_unknown0_nonneg1 (i8 %x , i8 %y ) {
108
118
; CHECK-LABEL: @srem_unknown0_nonneg1(
109
119
; CHECK-NEXT: [[PY:%.*]] = lshr i8 [[Y:%.*]], 1
@@ -115,6 +125,8 @@ define i8 @srem_unknown0_nonneg1(i8 %x, i8 %y) {
115
125
ret i8 %r
116
126
}
117
127
128
+ ; negative test
129
+
118
130
define i8 @srem_nonnegconst0_unknown1 (i7 %y ) {
119
131
; CHECK-LABEL: @srem_nonnegconst0_unknown1(
120
132
; CHECK-NEXT: [[SY:%.*]] = sext i7 [[Y:%.*]] to i8
@@ -126,6 +138,8 @@ define i8 @srem_nonnegconst0_unknown1(i7 %y) {
126
138
ret i8 %r
127
139
}
128
140
141
+ ; negative test - mul must be 'nsw' to be known non-negative
142
+
129
143
define i8 @srem_unknown0_nonnegconst1 (i8 %x ) {
130
144
; CHECK-LABEL: @srem_unknown0_nonnegconst1(
131
145
; CHECK-NEXT: [[SX:%.*]] = mul i8 [[X:%.*]], [[X]]
@@ -137,13 +151,15 @@ define i8 @srem_unknown0_nonnegconst1(i8 %x) {
137
151
ret i8 %r
138
152
}
139
153
154
+ ; x is known non-negative in t block
155
+
140
156
define i32 @PR57472 (i32 %x ) {
141
157
; CHECK-LABEL: @PR57472(
142
158
; CHECK-NEXT: entry:
143
159
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
144
160
; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
145
161
; CHECK: t:
146
- ; CHECK-NEXT: [[REM:%.*]] = srem i32 [[X]], 16
162
+ ; CHECK-NEXT: [[REM:%.*]] = urem i32 [[X]], 16
147
163
; CHECK-NEXT: br label [[EXIT:%.*]]
148
164
; CHECK: f:
149
165
; CHECK-NEXT: br label [[EXIT]]
@@ -167,6 +183,8 @@ exit:
167
183
ret i32 %cond
168
184
}
169
185
186
+ ; x is known non-negative in f block
187
+
170
188
define i32 @PR57472_alt (i32 %x ) {
171
189
; CHECK-LABEL: @PR57472_alt(
172
190
; CHECK-NEXT: entry:
@@ -175,7 +193,7 @@ define i32 @PR57472_alt(i32 %x) {
175
193
; CHECK: t:
176
194
; CHECK-NEXT: br label [[EXIT:%.*]]
177
195
; CHECK: f:
178
- ; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 16, [[X]]
196
+ ; CHECK-NEXT: [[DIV:%.*]] = udiv i32 16, [[X]]
179
197
; CHECK-NEXT: br label [[EXIT]]
180
198
; CHECK: exit:
181
199
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ -42, [[T]] ], [ [[DIV]], [[F]] ]
0 commit comments