Skip to content

Commit a2eca31

Browse files
committed
Test cases for rem-seteq fold with illegal types
This also briefly tests a larger set of architectures than the more exhaustive functionality tests for AArch64 and x86. As requested in D88785 Reviewed By: RKSimon Differential Revision: https://reviews.llvm.org/D98339
1 parent 6b76d82 commit a2eca31

18 files changed

+5838
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
3+
4+
define i1 @test_srem_odd(i29 %X) nounwind {
5+
; CHECK-LABEL: test_srem_odd:
6+
; CHECK: // %bb.0:
7+
; CHECK-NEXT: mov w9, #33099
8+
; CHECK-NEXT: mov w10, #64874
9+
; CHECK-NEXT: sbfx w8, w0, #0, #29
10+
; CHECK-NEXT: movk w9, #48986, lsl #16
11+
; CHECK-NEXT: movk w10, #330, lsl #16
12+
; CHECK-NEXT: madd w8, w8, w9, w10
13+
; CHECK-NEXT: mov w9, #64213
14+
; CHECK-NEXT: movk w9, #661, lsl #16
15+
; CHECK-NEXT: cmp w8, w9
16+
; CHECK-NEXT: cset w0, lo
17+
; CHECK-NEXT: ret
18+
%srem = srem i29 %X, 99
19+
%cmp = icmp eq i29 %srem, 0
20+
ret i1 %cmp
21+
}
22+
23+
define i1 @test_srem_even(i4 %X) nounwind {
24+
; CHECK-LABEL: test_srem_even:
25+
; CHECK: // %bb.0:
26+
; CHECK-NEXT: mov w9, #43691
27+
; CHECK-NEXT: sbfx w8, w0, #0, #4
28+
; CHECK-NEXT: movk w9, #10922, lsl #16
29+
; CHECK-NEXT: smull x9, w8, w9
30+
; CHECK-NEXT: lsr x10, x9, #63
31+
; CHECK-NEXT: lsr x9, x9, #32
32+
; CHECK-NEXT: add w9, w9, w10
33+
; CHECK-NEXT: mov w10, #6
34+
; CHECK-NEXT: msub w8, w9, w10, w8
35+
; CHECK-NEXT: cmp w8, #1 // =1
36+
; CHECK-NEXT: cset w0, eq
37+
; CHECK-NEXT: ret
38+
%srem = srem i4 %X, 6
39+
%cmp = icmp eq i4 %srem, 1
40+
ret i1 %cmp
41+
}
42+
43+
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
44+
; CHECK-LABEL: test_srem_pow2_setne:
45+
; CHECK: // %bb.0:
46+
; CHECK-NEXT: sbfx w8, w0, #0, #6
47+
; CHECK-NEXT: ubfx w8, w8, #9, #2
48+
; CHECK-NEXT: add w8, w0, w8
49+
; CHECK-NEXT: and w8, w8, #0x3c
50+
; CHECK-NEXT: sub w8, w0, w8
51+
; CHECK-NEXT: tst w8, #0x3f
52+
; CHECK-NEXT: cset w0, ne
53+
; CHECK-NEXT: ret
54+
%srem = srem i6 %X, 4
55+
%cmp = icmp ne i6 %srem, 0
56+
ret i1 %cmp
57+
}
58+
59+
define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
60+
; CHECK-LABEL: test_srem_vec:
61+
; CHECK: // %bb.0:
62+
; CHECK-NEXT: mov x10, #7281
63+
; CHECK-NEXT: movk x10, #29127, lsl #16
64+
; CHECK-NEXT: movk x10, #50972, lsl #32
65+
; CHECK-NEXT: sbfx x9, x2, #0, #33
66+
; CHECK-NEXT: movk x10, #7281, lsl #48
67+
; CHECK-NEXT: mov x11, #8589934591
68+
; CHECK-NEXT: mov x12, #7282
69+
; CHECK-NEXT: movk x12, #29127, lsl #16
70+
; CHECK-NEXT: dup v0.2d, x11
71+
; CHECK-NEXT: adrp x11, .LCPI3_0
72+
; CHECK-NEXT: smulh x10, x9, x10
73+
; CHECK-NEXT: movk x12, #50972, lsl #32
74+
; CHECK-NEXT: ldr q1, [x11, :lo12:.LCPI3_0]
75+
; CHECK-NEXT: adrp x11, .LCPI3_1
76+
; CHECK-NEXT: sub x10, x10, x9
77+
; CHECK-NEXT: sbfx x8, x1, #0, #33
78+
; CHECK-NEXT: movk x12, #7281, lsl #48
79+
; CHECK-NEXT: ldr q2, [x11, :lo12:.LCPI3_1]
80+
; CHECK-NEXT: asr x11, x10, #3
81+
; CHECK-NEXT: add x10, x11, x10, lsr #63
82+
; CHECK-NEXT: smulh x11, x8, x12
83+
; CHECK-NEXT: add x11, x11, x11, lsr #63
84+
; CHECK-NEXT: add x11, x11, x11, lsl #3
85+
; CHECK-NEXT: sub x8, x8, x11
86+
; CHECK-NEXT: sbfx x11, x0, #0, #33
87+
; CHECK-NEXT: smulh x12, x11, x12
88+
; CHECK-NEXT: add x12, x12, x12, lsr #63
89+
; CHECK-NEXT: add x12, x12, x12, lsl #3
90+
; CHECK-NEXT: sub x11, x11, x12
91+
; CHECK-NEXT: add x10, x10, x10, lsl #3
92+
; CHECK-NEXT: fmov d3, x11
93+
; CHECK-NEXT: add x9, x9, x10
94+
; CHECK-NEXT: mov v3.d[1], x8
95+
; CHECK-NEXT: fmov d4, x9
96+
; CHECK-NEXT: and v4.16b, v4.16b, v0.16b
97+
; CHECK-NEXT: and v0.16b, v3.16b, v0.16b
98+
; CHECK-NEXT: cmeq v0.2d, v0.2d, v1.2d
99+
; CHECK-NEXT: cmeq v1.2d, v4.2d, v2.2d
100+
; CHECK-NEXT: mvn v0.16b, v0.16b
101+
; CHECK-NEXT: mvn v1.16b, v1.16b
102+
; CHECK-NEXT: xtn v0.2s, v0.2d
103+
; CHECK-NEXT: xtn v1.2s, v1.2d
104+
; CHECK-NEXT: mov w1, v0.s[1]
105+
; CHECK-NEXT: fmov w0, s0
106+
; CHECK-NEXT: fmov w2, s1
107+
; CHECK-NEXT: ret
108+
%srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9>
109+
%cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3>
110+
ret <3 x i1> %cmp
111+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
3+
4+
define i1 @test_urem_odd(i13 %X) nounwind {
5+
; CHECK-LABEL: test_urem_odd:
6+
; CHECK: // %bb.0:
7+
; CHECK-NEXT: mov w9, #52429
8+
; CHECK-NEXT: and w8, w0, #0x1fff
9+
; CHECK-NEXT: movk w9, #52428, lsl #16
10+
; CHECK-NEXT: mul w8, w8, w9
11+
; CHECK-NEXT: mov w9, #13108
12+
; CHECK-NEXT: movk w9, #13107, lsl #16
13+
; CHECK-NEXT: cmp w8, w9
14+
; CHECK-NEXT: cset w0, lo
15+
; CHECK-NEXT: ret
16+
%urem = urem i13 %X, 5
17+
%cmp = icmp eq i13 %urem, 0
18+
ret i1 %cmp
19+
}
20+
21+
define i1 @test_urem_even(i27 %X) nounwind {
22+
; CHECK-LABEL: test_urem_even:
23+
; CHECK: // %bb.0:
24+
; CHECK-NEXT: mov w9, #28087
25+
; CHECK-NEXT: and w8, w0, #0x7ffffff
26+
; CHECK-NEXT: movk w9, #46811, lsl #16
27+
; CHECK-NEXT: mul w8, w8, w9
28+
; CHECK-NEXT: mov w9, #9363
29+
; CHECK-NEXT: ror w8, w8, #1
30+
; CHECK-NEXT: movk w9, #4681, lsl #16
31+
; CHECK-NEXT: cmp w8, w9
32+
; CHECK-NEXT: cset w0, lo
33+
; CHECK-NEXT: ret
34+
%urem = urem i27 %X, 14
35+
%cmp = icmp eq i27 %urem, 0
36+
ret i1 %cmp
37+
}
38+
39+
define i1 @test_urem_odd_setne(i4 %X) nounwind {
40+
; CHECK-LABEL: test_urem_odd_setne:
41+
; CHECK: // %bb.0:
42+
; CHECK-NEXT: mov w9, #52429
43+
; CHECK-NEXT: and w8, w0, #0xf
44+
; CHECK-NEXT: movk w9, #52428, lsl #16
45+
; CHECK-NEXT: mul w8, w8, w9
46+
; CHECK-NEXT: mov w9, #858993459
47+
; CHECK-NEXT: cmp w8, w9
48+
; CHECK-NEXT: cset w0, hi
49+
; CHECK-NEXT: ret
50+
%urem = urem i4 %X, 5
51+
%cmp = icmp ne i4 %urem, 0
52+
ret i1 %cmp
53+
}
54+
55+
define i1 @test_urem_negative_odd(i9 %X) nounwind {
56+
; CHECK-LABEL: test_urem_negative_odd:
57+
; CHECK: // %bb.0:
58+
; CHECK-NEXT: mov w9, #57651
59+
; CHECK-NEXT: and w8, w0, #0x1ff
60+
; CHECK-NEXT: movk w9, #43302, lsl #16
61+
; CHECK-NEXT: mul w8, w8, w9
62+
; CHECK-NEXT: mov w9, #17191
63+
; CHECK-NEXT: movk w9, #129, lsl #16
64+
; CHECK-NEXT: cmp w8, w9
65+
; CHECK-NEXT: cset w0, hi
66+
; CHECK-NEXT: ret
67+
%urem = urem i9 %X, -5
68+
%cmp = icmp ne i9 %urem, 0
69+
ret i1 %cmp
70+
}
71+
72+
define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
73+
; CHECK-LABEL: test_urem_vec:
74+
; CHECK: // %bb.0:
75+
; CHECK-NEXT: mov w12, #43691
76+
; CHECK-NEXT: and w8, w0, #0x7ff
77+
; CHECK-NEXT: movk w12, #43690, lsl #16
78+
; CHECK-NEXT: umull x12, w8, w12
79+
; CHECK-NEXT: mov w11, #25663
80+
; CHECK-NEXT: mov w13, #6
81+
; CHECK-NEXT: lsr x12, x12, #34
82+
; CHECK-NEXT: and w10, w2, #0x7ff
83+
; CHECK-NEXT: movk w11, #160, lsl #16
84+
; CHECK-NEXT: msub w8, w12, w13, w8
85+
; CHECK-NEXT: mov w12, #18725
86+
; CHECK-NEXT: and w9, w1, #0x7ff
87+
; CHECK-NEXT: movk w12, #9362, lsl #16
88+
; CHECK-NEXT: umull x11, w10, w11
89+
; CHECK-NEXT: adrp x13, .LCPI4_0
90+
; CHECK-NEXT: umull x12, w9, w12
91+
; CHECK-NEXT: lsr x11, x11, #32
92+
; CHECK-NEXT: ldr d0, [x13, :lo12:.LCPI4_0]
93+
; CHECK-NEXT: lsr x12, x12, #32
94+
; CHECK-NEXT: sub w13, w10, w11
95+
; CHECK-NEXT: add w11, w11, w13, lsr #1
96+
; CHECK-NEXT: sub w13, w9, w12
97+
; CHECK-NEXT: add w12, w12, w13, lsr #1
98+
; CHECK-NEXT: fmov s1, w8
99+
; CHECK-NEXT: mov w8, #2043
100+
; CHECK-NEXT: lsr w11, w11, #10
101+
; CHECK-NEXT: lsr w12, w12, #2
102+
; CHECK-NEXT: msub w8, w11, w8, w10
103+
; CHECK-NEXT: sub w10, w12, w12, lsl #3
104+
; CHECK-NEXT: add w9, w9, w10
105+
; CHECK-NEXT: mov v1.h[1], w9
106+
; CHECK-NEXT: mov v1.h[2], w8
107+
; CHECK-NEXT: bic v1.4h, #248, lsl #8
108+
; CHECK-NEXT: cmeq v0.4h, v1.4h, v0.4h
109+
; CHECK-NEXT: mvn v0.8b, v0.8b
110+
; CHECK-NEXT: umov w0, v0.h[0]
111+
; CHECK-NEXT: umov w1, v0.h[1]
112+
; CHECK-NEXT: umov w2, v0.h[2]
113+
; CHECK-NEXT: ret
114+
%urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5>
115+
%cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
116+
ret <3 x i1> %cmp
117+
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=amdgcn-amd-mesa3d < %s | FileCheck %s
3+
4+
define i1 @test_srem_odd(i29 %X) nounwind {
5+
; CHECK-LABEL: test_srem_odd:
6+
; CHECK: ; %bb.0:
7+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
8+
; CHECK-NEXT: v_bfe_i32 v0, v0, 0, 29
9+
; CHECK-NEXT: s_mov_b32 s5, 0xa57eb503
10+
; CHECK-NEXT: s_movk_i32 s4, 0x63
11+
; CHECK-NEXT: v_mul_hi_i32 v1, v0, s5
12+
; CHECK-NEXT: v_add_i32_e32 v1, vcc, v1, v0
13+
; CHECK-NEXT: v_lshrrev_b32_e32 v2, 31, v1
14+
; CHECK-NEXT: v_ashrrev_i32_e32 v1, 6, v1
15+
; CHECK-NEXT: v_add_i32_e32 v1, vcc, v1, v2
16+
; CHECK-NEXT: v_mul_lo_u32 v1, v1, s4
17+
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v1
18+
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, 0, v0
19+
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
20+
; CHECK-NEXT: s_setpc_b64 s[30:31]
21+
%srem = srem i29 %X, 99
22+
%cmp = icmp eq i29 %srem, 0
23+
ret i1 %cmp
24+
}
25+
26+
define i1 @test_srem_even(i4 %X) nounwind {
27+
; CHECK-LABEL: test_srem_even:
28+
; CHECK: ; %bb.0:
29+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
30+
; CHECK-NEXT: v_bfe_i32 v0, v0, 0, 4
31+
; CHECK-NEXT: s_mov_b32 s4, 0x2aaaaaab
32+
; CHECK-NEXT: v_mul_hi_i32 v1, v0, s4
33+
; CHECK-NEXT: v_lshrrev_b32_e32 v2, 31, v1
34+
; CHECK-NEXT: v_add_i32_e32 v1, vcc, v1, v2
35+
; CHECK-NEXT: v_mul_lo_u32 v1, v1, 6
36+
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v1
37+
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
38+
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
39+
; CHECK-NEXT: s_setpc_b64 s[30:31]
40+
%srem = srem i4 %X, 6
41+
%cmp = icmp eq i4 %srem, 1
42+
ret i1 %cmp
43+
}
44+
45+
define i1 @test_srem_pow2_setne(i6 %X) nounwind {
46+
; CHECK-LABEL: test_srem_pow2_setne:
47+
; CHECK: ; %bb.0:
48+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
49+
; CHECK-NEXT: v_bfe_i32 v1, v0, 0, 6
50+
; CHECK-NEXT: v_bfe_u32 v1, v1, 9, 2
51+
; CHECK-NEXT: v_add_i32_e32 v1, vcc, v0, v1
52+
; CHECK-NEXT: v_and_b32_e32 v1, 60, v1
53+
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v1
54+
; CHECK-NEXT: v_and_b32_e32 v0, 63, v0
55+
; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
56+
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
57+
; CHECK-NEXT: s_setpc_b64 s[30:31]
58+
%srem = srem i6 %X, 4
59+
%cmp = icmp ne i6 %srem, 0
60+
ret i1 %cmp
61+
}
62+
63+
define <3 x i1> @test_srem_vec(<3 x i31> %X) nounwind {
64+
; CHECK-LABEL: test_srem_vec:
65+
; CHECK: ; %bb.0:
66+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
67+
; CHECK-NEXT: v_bfe_i32 v3, v2, 0, 31
68+
; CHECK-NEXT: v_bfe_i32 v4, v1, 0, 31
69+
; CHECK-NEXT: v_bfe_i32 v5, v0, 0, 31
70+
; CHECK-NEXT: s_mov_b32 s6, 0x38e38e39
71+
; CHECK-NEXT: s_mov_b32 s7, 0xc71c71c7
72+
; CHECK-NEXT: s_brev_b32 s4, -2
73+
; CHECK-NEXT: s_mov_b32 s5, 0x7ffffffd
74+
; CHECK-NEXT: v_mul_hi_i32 v5, v5, s6
75+
; CHECK-NEXT: v_mul_hi_i32 v4, v4, s6
76+
; CHECK-NEXT: v_mul_hi_i32 v3, v3, s7
77+
; CHECK-NEXT: v_lshrrev_b32_e32 v6, 31, v5
78+
; CHECK-NEXT: v_lshrrev_b32_e32 v5, 1, v5
79+
; CHECK-NEXT: v_lshrrev_b32_e32 v7, 31, v4
80+
; CHECK-NEXT: v_lshrrev_b32_e32 v4, 1, v4
81+
; CHECK-NEXT: v_lshrrev_b32_e32 v8, 31, v3
82+
; CHECK-NEXT: v_lshrrev_b32_e32 v3, 1, v3
83+
; CHECK-NEXT: v_add_i32_e32 v5, vcc, v5, v6
84+
; CHECK-NEXT: v_add_i32_e32 v4, vcc, v4, v7
85+
; CHECK-NEXT: v_add_i32_e32 v3, vcc, v3, v8
86+
; CHECK-NEXT: v_mul_lo_u32 v5, v5, 9
87+
; CHECK-NEXT: v_mul_lo_u32 v4, v4, 9
88+
; CHECK-NEXT: v_mul_lo_u32 v3, v3, -9
89+
; CHECK-NEXT: v_sub_i32_e32 v0, vcc, v0, v5
90+
; CHECK-NEXT: v_sub_i32_e32 v1, vcc, v1, v4
91+
; CHECK-NEXT: v_sub_i32_e32 v2, vcc, v2, v3
92+
; CHECK-NEXT: v_and_b32_e32 v2, s4, v2
93+
; CHECK-NEXT: v_and_b32_e32 v1, s4, v1
94+
; CHECK-NEXT: v_and_b32_e32 v0, s4, v0
95+
; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, 3, v0
96+
; CHECK-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
97+
; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v1
98+
; CHECK-NEXT: v_cndmask_b32_e64 v1, 0, 1, vcc
99+
; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, 3, v2
100+
; CHECK-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc
101+
; CHECK-NEXT: s_setpc_b64 s[30:31]
102+
%srem = srem <3 x i31> %X, <i31 9, i31 9, i31 -9>
103+
%cmp = icmp ne <3 x i31> %srem, <i31 3, i31 -3, i31 3>
104+
ret <3 x i1> %cmp
105+
}

0 commit comments

Comments
 (0)