Skip to content

Commit e121c20

Browse files
authored
cranelift: Fix urem/srem in interpreter (#4532)
1 parent 7ac6134 commit e121c20

File tree

8 files changed

+389
-53
lines changed

8 files changed

+389
-53
lines changed
Lines changed: 4 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,32 @@
11
test run
2+
set avoid_div_traps=false
23
target aarch64
34
target s390x
4-
set avoid_div_traps=false
55
target x86_64
66

7+
; Tests that the `avoid_div_traps` flag prevents a trap when {s,u}rem is called
8+
; with INT_MIN % -1.
9+
710
function %i8(i8, i8) -> i8 {
811
block0(v0: i8, v1: i8):
912
v2 = srem.i8 v0, v1
1013
return v2
1114
}
12-
; run: %i8(0, 1) == 0
13-
; run: %i8(1, -1) == 0
1415
; run: %i8(0x80, 0xff) == 0
15-
; run: %i8(0x2, 0x7) == 0x2
1616

1717
function %i8_const(i8) -> i8 {
1818
block0(v0: i8):
1919
v1 = iconst.i8 -1
2020
v2 = srem.i8 v0, v1
2121
return v2
2222
}
23-
; run: %i8_const(0) == 0
24-
; run: %i8_const(1) == 0
2523
; run: %i8_const(0x80) == 0
26-
; run: %i8_const(0x2) == 0
2724

2825
function %i16(i16, i16) -> i16 {
2926
block0(v0: i16, v1: i16):
3027
v2 = srem.i16 v0, v1
3128
return v2
3229
}
33-
; run: %i16(0, 42) == 0
34-
; run: %i16(4, -2) == 0
35-
; run: %i16(13, 5) == 3
3630
; run: %i16(0x8000, 0xffff) == 0
3731

3832
function %i16_const(i16) -> i16 {
@@ -41,19 +35,13 @@ block0(v0: i16):
4135
v2 = srem.i16 v0, v1
4236
return v2
4337
}
44-
; run: %i16_const(0) == 0
45-
; run: %i16_const(4) == 0
46-
; run: %i16_const(13) == 0
4738
; run: %i16_const(0x8000) == 0
4839

4940
function %i32(i32, i32) -> i32 {
5041
block0(v0: i32, v1: i32):
5142
v2 = srem.i32 v0, v1
5243
return v2
5344
}
54-
; run: %i32(0, 13) == 0
55-
; run: %i32(1048576, 8192) == 0
56-
; run: %i32(-1024, 255) == -4
5745
; run: %i32(0x80000000, 0xffffffff) == 0
5846

5947
function %i32_const(i32) -> i32 {
@@ -62,19 +50,13 @@ block0(v0: i32):
6250
v2 = srem.i32 v0, v1
6351
return v2
6452
}
65-
; run: %i32_const(0) == 0
66-
; run: %i32_const(1057) == 0
67-
; run: %i32_const(-42) == 0
6853
; run: %i32_const(0x80000000) == 0
6954

7055
function %i64(i64, i64) -> i64 {
7156
block0(v0: i64, v1: i64):
7257
v2 = srem.i64 v0, v1
7358
return v2
7459
}
75-
; run: %i64(0, 104857600000) == 0
76-
; run: %i64(104857600000, 511) == 398
77-
; run: %i64(-57, -5) == -2
7860
; run: %i64(0x800000000000000, 0xffffffffffffffff) == 0
7961

8062
function %i64_const(i64) -> i64 {
@@ -83,20 +65,13 @@ block0(v0: i64):
8365
v2 = srem.i64 v0, v1
8466
return v2
8567
}
86-
; run: %i64_const(0) == 0
87-
; run: %i64_const(104857600000) == 0
88-
; run: %i64_const(-57) == 0
8968
; run: %i64_const(0x800000000000000) == 0
9069

9170
function %i8_u(i8, i8) -> i8 {
9271
block0(v0: i8,v1: i8):
9372
v2 = urem v0, v1
9473
return v2
9574
}
96-
; run: %i8_u(0, 1) == 0
97-
; run: %i8_u(2, 2) == 0
98-
; run: %i8_u(1, -1) == 1
99-
; run: %i8_u(3, 2) == 1
10075
; run: %i8_u(0x80, 0xff) == 0x80
10176

10277
function %i8_u_const(i8) -> i8 {
@@ -105,18 +80,13 @@ block0(v0: i8):
10580
v2 = urem v0, v1
10681
return v2
10782
}
108-
; run: %i8_u_const(0) == 0
109-
; run: %i8_u_const(3) == 3
11083
; run: %i8_u_const(0x80) == 0x80
11184

11285
function %i16_u(i16, i16) -> i16 {
11386
block0(v0: i16, v1: i16):
11487
v2 = urem.i16 v0, v1
11588
return v2
11689
}
117-
; run: %i16_u(0, 42) == 0
118-
; run: %i16_u(4, -2) == 4
119-
; run: %i16_u(13, 5) == 3
12090
; run: %i16_u(0x8000, 0xffff) == 0x8000
12191

12292
function %i16_u_const(i16) -> i16 {
@@ -125,18 +95,13 @@ block0(v0: i16):
12595
v2 = urem.i16 v0, v1
12696
return v2
12797
}
128-
; run: %i16_u_const(0) == 0
129-
; run: %i16_u_const(4) == 4
13098
; run: %i16_u_const(0x8000) == 0x8000
13199

132100
function %i32_u(i32, i32) -> i32 {
133101
block0(v0: i32, v1: i32):
134102
v2 = urem.i32 v0, v1
135103
return v2
136104
}
137-
; run: %i32_u(0, 13) == 0
138-
; run: %i32_u(1048576, 8192) == 0
139-
; run: %i32_u(-1024, 255) == 252
140105
; run: %i32_u(0x80000000, 0xffffffff) == 0x80000000
141106

142107
function %i32_u_const(i32) -> i32 {
@@ -145,19 +110,13 @@ block0(v0: i32):
145110
v2 = urem.i32 v0, v1
146111
return v2
147112
}
148-
; run: %i32_u_const(0) == 0
149-
; run: %i32_u_const(1057) == 1057
150-
; run: %i32_u_const(-42) == -42
151113
; run: %i32_u_const(0x80000000) == 0x80000000
152114

153115
function %i64_u(i64, i64) -> i64 {
154116
block0(v0: i64, v1: i64):
155117
v2 = urem.i64 v0, v1
156118
return v2
157119
}
158-
; run: %i64_u(0, 104857600000) == 0
159-
; run: %i64_u(104857600000, 511) == 398
160-
; run: %i64_u(-57, -5) == -57
161120
; run: %i64_u(0x800000000000000, 0xffffffffffffffff) == 0x800000000000000
162121

163122
function %i64_u_const(i64) -> i64 {
@@ -166,7 +125,4 @@ block0(v0: i64):
166125
v2 = urem.i64 v0, v1
167126
return v2
168127
}
169-
; run: %i64_u_const(0) == 0
170-
; run: %i64_u_const(104857600000) == 104857600000
171-
; run: %i64_u_const(-57) == -57
172128
; run: %i64_u_const(0x800000000000000) == 0x800000000000000
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
test interpret
2+
3+
function %srem_i128(i128, i128) -> i128 {
4+
block0(v0: i128,v1: i128):
5+
v2 = srem v0, v1
6+
return v2
7+
}
8+
; run: %srem_i128(0, 1) == 0
9+
; run: %srem_i128(2, 2) == 0
10+
; run: %srem_i128(1, -1) == 0
11+
; run: %srem_i128(3, 2) == 1
12+
; run: %srem_i128(19, 7) == 5
13+
; run: %srem_i128(3, -2) == 1
14+
; run: %srem_i128(-19, 7) == -5
15+
; run: %srem_i128(0xC0FFEEEE_DECAFFFF_C0FFEEEE_DECAFFFF, 8) == -1
16+
; run: %srem_i128(0xC0FFEEEE_DECAFFFF_C0FFEEEE_DECAFFFF, -8) == -1
17+
; run: %srem_i128(0x80000000_00000000_00000000_00000000, -2) == 0
18+
19+
20+
function %srem_imm_i128(i128) -> i128 {
21+
block0(v0: i128):
22+
v1 = srem_imm v0, 3
23+
return v1
24+
}
25+
; run: %srem_imm_i128(0) == 0
26+
; run: %srem_imm_i128(1) == 1
27+
; run: %srem_imm_i128(2) == 2
28+
; run: %srem_imm_i128(3) == 0
29+
; run: %srem_imm_i128(19) == 1
30+
; run: %srem_imm_i128(-19) == -1
31+
; run: %srem_imm_i128(0xC0FFEEEE_DECAFFFF_C0FFEEEE_DECAFFFF) == -1
32+
; run: %srem_imm_i128(0x80000000_00000000_00000000_00000000) == -2
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
test interpret
2+
3+
function %urem_i128(i128, i128) -> i128 {
4+
block0(v0: i128,v1: i128):
5+
v2 = urem v0, v1
6+
return v2
7+
}
8+
; run: %urem_i128(0, 1) == 0
9+
; run: %urem_i128(2, 2) == 0
10+
; run: %urem_i128(1, -1) == 1
11+
; run: %urem_i128(3, 2) == 1
12+
; run: %urem_i128(19, 7) == 5
13+
; run: %urem_i128(3, -2) == 3
14+
; run: %urem_i128(-19, 7) == 6
15+
; run: %urem_i128(0xC0FFEEEE_DECAFFFF_C0FFEEEE_DECAFFFF, 8) == 7
16+
; run: %urem_i128(0xC0FFEEEE_DECAFFFF_C0FFEEEE_DECAFFFF, -8) == 0xC0FFEEEE_DECAFFFF_C0FFEEEE_DECAFFFF
17+
; run: %urem_i128(0x80000000_00000000_00000000_00000000, -2) == 0x80000000_00000000_00000000_00000000
18+
19+
20+
function %urem_imm_i128(i128) -> i128 {
21+
block0(v0: i128):
22+
v1 = urem_imm v0, 3
23+
return v1
24+
}
25+
; run: %urem_imm_i128(0) == 0
26+
; run: %urem_imm_i128(1) == 1
27+
; run: %urem_imm_i128(2) == 2
28+
; run: %urem_imm_i128(3) == 0
29+
; run: %urem_imm_i128(19) == 1
30+
; run: %urem_imm_i128(-19) == 0
31+
; run: %urem_imm_i128(0xC0FFEEEE_DECAFFFF_C0FFEEEE_DECAFFFF) == 0
32+
; run: %urem_imm_i128(0x80000000_00000000_00000000_00000000) == 2
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
test interpret
2+
test run
3+
target aarch64
4+
target s390x
5+
target x86_64
6+
; Test these inputs without div traps, it shouldn't affect normal inputs
7+
set avoid_div_traps
8+
target aarch64
9+
target s390x
10+
target x86_64
11+
12+
function %srem_i64(i64, i64) -> i64 {
13+
block0(v0: i64,v1: i64):
14+
v2 = srem v0, v1
15+
return v2
16+
}
17+
; run: %srem_i64(0, 1) == 0
18+
; run: %srem_i64(2, 2) == 0
19+
; run: %srem_i64(1, -1) == 0
20+
; run: %srem_i64(3, 2) == 1
21+
; run: %srem_i64(19, 7) == 5
22+
; run: %srem_i64(3, -2) == 1
23+
; run: %srem_i64(-19, 7) == -5
24+
; run: %srem_i64(-57, -5) == -2
25+
; run: %srem_i64(0, 104857600000) == 0
26+
; run: %srem_i64(104857600000, 511) == 398
27+
; run: %srem_i64(0xC0FFEEEE_DECAFFFF, 8) == -1
28+
; run: %srem_i64(0xC0FFEEEE_DECAFFFF, -8) == -1
29+
; run: %srem_i64(0x80000000_00000000, -2) == 0
30+
31+
function %srem_i32(i32, i32) -> i32 {
32+
block0(v0: i32,v1: i32):
33+
v2 = srem v0, v1
34+
return v2
35+
}
36+
; run: %srem_i32(0, 1) == 0
37+
; run: %srem_i32(2, 2) == 0
38+
; run: %srem_i32(1, -1) == 0
39+
; run: %srem_i32(3, 2) == 1
40+
; run: %srem_i32(19, 7) == 5
41+
; run: %srem_i32(3, -2) == 1
42+
; run: %srem_i32(-19, 7) == -5
43+
; run: %srem_i32(0, 13) == 0
44+
; run: %srem_i32(1048576, 8192) == 0
45+
; run: %srem_i32(-1024, 255) == -4
46+
; run: %srem_i32(0xC0FFEEEE, 8) == -2
47+
; run: %srem_i32(0xC0FFEEEE, -8) == -2
48+
; run: %srem_i32(0x80000000, -2) == 0
49+
50+
function %srem_i16(i16, i16) -> i16 {
51+
block0(v0: i16,v1: i16):
52+
v2 = srem v0, v1
53+
return v2
54+
}
55+
; run: %srem_i16(0, 1) == 0
56+
; run: %srem_i16(2, 2) == 0
57+
; run: %srem_i16(1, -1) == 0
58+
; run: %srem_i16(3, 2) == 1
59+
; run: %srem_i16(19, 7) == 5
60+
; run: %srem_i16(3, -2) == 1
61+
; run: %srem_i16(13, 5) == 3
62+
; run: %srem_i16(0, 42) == 0
63+
; run: %srem_i16(4, -2) == 0
64+
; run: %srem_i16(-19, 7) == -5
65+
; run: %srem_i16(0xC0FF, 8) == -1
66+
; run: %srem_i16(0xC0FF, -8) == -1
67+
; run: %srem_i16(0x8000, -2) == 0
68+
69+
function %srem_i8(i8, i8) -> i8 {
70+
block0(v0: i8,v1: i8):
71+
v2 = srem v0, v1
72+
return v2
73+
}
74+
; run: %srem_i8(0, 1) == 0
75+
; run: %srem_i8(2, 2) == 0
76+
; run: %srem_i8(1, -1) == 0
77+
; run: %srem_i8(2, 7) == 2
78+
; run: %srem_i8(3, 2) == 1
79+
; run: %srem_i8(19, 7) == 5
80+
; run: %srem_i8(3, -2) == 1
81+
; run: %srem_i8(-19, 7) == -5
82+
; run: %srem_i8(0xC0, 8) == 0
83+
; run: %srem_i8(0xC0, -8) == 0
84+
; run: %srem_i8(0x80, -2) == 0
85+
86+
87+
function %srem_imm_i64(i64) -> i64 {
88+
block0(v0: i64):
89+
v1 = srem_imm v0, 3
90+
return v1
91+
}
92+
; run: %srem_imm_i64(0) == 0
93+
; run: %srem_imm_i64(1) == 1
94+
; run: %srem_imm_i64(2) == 2
95+
; run: %srem_imm_i64(3) == 0
96+
; run: %srem_imm_i64(19) == 1
97+
; run: %srem_imm_i64(-19) == -1
98+
; run: %srem_imm_i64(-57) == 0
99+
; run: %srem_imm_i64(104857600000) == 1
100+
; run: %srem_imm_i64(0xC0FFEEEE_DECAFFFF) == -1
101+
; run: %srem_imm_i64(0x80000000_00000000) == -2
102+
103+
function %srem_imm_i32(i32) -> i32 {
104+
block0(v0: i32):
105+
v1 = srem_imm v0, 3
106+
return v1
107+
}
108+
; run: %srem_imm_i32(0) == 0
109+
; run: %srem_imm_i32(1) == 1
110+
; run: %srem_imm_i32(2) == 2
111+
; run: %srem_imm_i32(3) == 0
112+
; run: %srem_imm_i32(4) == 1
113+
; run: %srem_imm_i32(19) == 1
114+
; run: %srem_imm_i32(-19) == -1
115+
; run: %srem_imm_i32(-42) == 0
116+
; run: %srem_imm_i32(1057) == 1
117+
; run: %srem_imm_i32(0xC0FFEEEE) == -2
118+
119+
function %srem_imm_i16(i16) -> i16 {
120+
block0(v0: i16):
121+
v1 = srem_imm v0, 3
122+
return v1
123+
}
124+
; run: %srem_imm_i16(0) == 0
125+
; run: %srem_imm_i16(1) == 1
126+
; run: %srem_imm_i16(2) == 2
127+
; run: %srem_imm_i16(3) == 0
128+
; run: %srem_imm_i16(4) == 1
129+
; run: %srem_imm_i16(19) == 1
130+
; run: %srem_imm_i16(-19) == -1
131+
; run: %srem_imm_i16(0xC0FF) == -1
132+
; run: %srem_imm_i16(0x8000) == -2
133+
134+
function %srem_imm_i8(i8) -> i8 {
135+
block0(v0: i8):
136+
v1 = srem_imm v0, 3
137+
return v1
138+
}
139+
; run: %srem_imm_i8(0) == 0
140+
; run: %srem_imm_i8(1) == 1
141+
; run: %srem_imm_i8(2) == 2
142+
; run: %srem_imm_i8(3) == 0
143+
; run: %srem_imm_i8(19) == 1
144+
; run: %srem_imm_i8(-19) == -1
145+
; run: %srem_imm_i8(0xC0) == -1
146+
; run: %srem_imm_i8(0x80) == -2

0 commit comments

Comments
 (0)