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