1
- ; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve --asm-verbose=false < %s |FileCheck %s
1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2
+ ; RUN: llc -mattr=+sve < %s | FileCheck %s
2
3
3
- declare i32 @llvm.vscale.i32 ()
4
- declare i64 @llvm.vscale.i64 ()
4
+ target triple = "aarch64-unknown-linux-gnu"
5
5
6
6
; Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
7
7
define i64 @combine_add_vscale_i64 () nounwind {
8
8
; CHECK-LABEL: combine_add_vscale_i64:
9
- ; CHECK-NOT : add
10
- ; CHECK-NEXT: cntd x0
11
- ; CHECK-NEXT: ret
9
+ ; CHECK: // %bb.0:
10
+ ; CHECK-NEXT: cntd x0
11
+ ; CHECK-NEXT: ret
12
12
%vscale = call i64 @llvm.vscale.i64 ()
13
13
%add = add i64 %vscale , %vscale
14
14
ret i64 %add
15
15
}
16
16
17
17
define i32 @combine_add_vscale_i32 () nounwind {
18
18
; CHECK-LABEL: combine_add_vscale_i32:
19
- ; CHECK-NOT: add
20
- ; CHECK-NEXT: cntd x0
21
- ; CHECK-NEXT: ret
19
+ ; CHECK: // %bb.0:
20
+ ; CHECK-NEXT: cntd x0
21
+ ; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0
22
+ ; CHECK-NEXT: ret
22
23
%vscale = call i32 @llvm.vscale.i32 ()
23
24
%add = add i32 %vscale , %vscale
24
25
ret i32 %add
@@ -28,19 +29,20 @@ define i32 @combine_add_vscale_i32() nounwind {
28
29
; In this test, C0 = 1, C1 = 32.
29
30
define i64 @combine_mul_vscale_i64 () nounwind {
30
31
; CHECK-LABEL: combine_mul_vscale_i64:
31
- ; CHECK-NOT : mul
32
- ; CHECK-NEXT: rdvl x0, #2
33
- ; CHECK-NEXT: ret
32
+ ; CHECK: // %bb.0:
33
+ ; CHECK-NEXT: rdvl x0, #2
34
+ ; CHECK-NEXT: ret
34
35
%vscale = call i64 @llvm.vscale.i64 ()
35
36
%mul = mul i64 %vscale , 32
36
37
ret i64 %mul
37
38
}
38
39
39
40
define i32 @combine_mul_vscale_i32 () nounwind {
40
41
; CHECK-LABEL: combine_mul_vscale_i32:
41
- ; CHECK-NOT: mul
42
- ; CHECK-NEXT: rdvl x0, #3
43
- ; CHECK-NEXT: ret
42
+ ; CHECK: // %bb.0:
43
+ ; CHECK-NEXT: rdvl x0, #3
44
+ ; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0
45
+ ; CHECK-NEXT: ret
44
46
%vscale = call i32 @llvm.vscale.i32 ()
45
47
%mul = mul i32 %vscale , 48
46
48
ret i32 %mul
@@ -49,23 +51,23 @@ define i32 @combine_mul_vscale_i32() nounwind {
49
51
; Canonicalize (sub X, (vscale * C)) to (add X, (vscale * -C))
50
52
define i64 @combine_sub_vscale_i64 (i64 %in ) nounwind {
51
53
; CHECK-LABEL: combine_sub_vscale_i64:
52
- ; CHECK-NOT : sub
53
- ; CHECK-NEXT: rdvl x8, #-1
54
- ; CHECK-NEXT: asr x8, x8, #4
55
- ; CHECK-NEXT: add x0, x0, x8
56
- ; CHECK-NEXT: ret
54
+ ; CHECK: // %bb.0:
55
+ ; CHECK-NEXT: rdvl x8, #-1
56
+ ; CHECK-NEXT: asr x8, x8, #4
57
+ ; CHECK-NEXT: add x0, x0, x8
58
+ ; CHECK-NEXT: ret
57
59
%vscale = call i64 @llvm.vscale.i64 ()
58
60
%sub = sub i64 %in , %vscale
59
61
ret i64 %sub
60
62
}
61
63
62
64
define i32 @combine_sub_vscale_i32 (i32 %in ) nounwind {
63
65
; CHECK-LABEL: combine_sub_vscale_i32:
64
- ; CHECK-NOT : sub
65
- ; CHECK-NEXT: rdvl x8, #-1
66
- ; CHECK-NEXT: asr x8, x8, #4
67
- ; CHECK-NEXT: add w0, w0, w8
68
- ; CHECK-NEXT: ret
66
+ ; CHECK: // %bb.0:
67
+ ; CHECK-NEXT: rdvl x8, #-1
68
+ ; CHECK-NEXT: asr x8, x8, #4
69
+ ; CHECK-NEXT: add w0, w0, w8
70
+ ; CHECK-NEXT: ret
69
71
%vscale = call i32 @llvm.vscale.i32 ()
70
72
%sub = sub i32 %in , %vscale
71
73
ret i32 %sub
@@ -75,12 +77,13 @@ define i32 @combine_sub_vscale_i32(i32 %in) nounwind {
75
77
; (sub X, (vscale * C)) to (add X, (vscale * -C))
76
78
define i64 @multiple_uses_sub_vscale_i64 (i64 %x , i64 %y ) nounwind {
77
79
; CHECK-LABEL: multiple_uses_sub_vscale_i64:
78
- ; CHECK-NEXT: rdvl x8, #1
79
- ; CHECK-NEXT: lsr x8, x8, #4
80
- ; CHECK-NEXT: sub x9, x0, x8
81
- ; CHECK-NEXT: add x8, x1, x8
82
- ; CHECK-NEXT: mul x0, x9, x8
83
- ; CHECK-NEXT: ret
80
+ ; CHECK: // %bb.0:
81
+ ; CHECK-NEXT: rdvl x8, #1
82
+ ; CHECK-NEXT: lsr x8, x8, #4
83
+ ; CHECK-NEXT: sub x9, x0, x8
84
+ ; CHECK-NEXT: add x8, x1, x8
85
+ ; CHECK-NEXT: mul x0, x9, x8
86
+ ; CHECK-NEXT: ret
84
87
%vscale = call i64 @llvm.vscale.i64 ()
85
88
%sub = sub i64 %x , %vscale
86
89
%add = add i64 %y , %vscale
@@ -95,20 +98,48 @@ define i64 @multiple_uses_sub_vscale_i64(i64 %x, i64 %y) nounwind {
95
98
; Hence, the immediate for RDVL is #1.
96
99
define i64 @combine_shl_vscale_i64 () nounwind {
97
100
; CHECK-LABEL: combine_shl_vscale_i64:
98
- ; CHECK-NOT : shl
99
- ; CHECK-NEXT: rdvl x0, #1
100
- ; CHECK-NEXT: ret
101
+ ; CHECK: // %bb.0:
102
+ ; CHECK-NEXT: rdvl x0, #1
103
+ ; CHECK-NEXT: ret
101
104
%vscale = call i64 @llvm.vscale.i64 ()
102
105
%shl = shl i64 %vscale , 4
103
106
ret i64 %shl
104
107
}
105
108
106
109
define i32 @combine_shl_vscale_i32 () nounwind {
107
110
; CHECK-LABEL: combine_shl_vscale_i32:
108
- ; CHECK-NOT: shl
109
- ; CHECK-NEXT: rdvl x0, #1
110
- ; CHECK-NEXT: ret
111
+ ; CHECK: // %bb.0:
112
+ ; CHECK-NEXT: rdvl x0, #1
113
+ ; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0
114
+ ; CHECK-NEXT: ret
111
115
%vscale = call i32 @llvm.vscale.i32 ()
112
116
%shl = shl i32 %vscale , 4
113
117
ret i32 %shl
114
118
}
119
+
120
+ define i64 @combine_shl_mul_vscale (i64 %a ) nounwind {
121
+ ; CHECK-LABEL: combine_shl_mul_vscale:
122
+ ; CHECK: // %bb.0:
123
+ ; CHECK-NEXT: cnth x8
124
+ ; CHECK-NEXT: mul x0, x0, x8
125
+ ; CHECK-NEXT: ret
126
+ %vscale = tail call i64 @llvm.vscale.i64 ()
127
+ %mul = mul i64 %a , %vscale
128
+ %shl = shl i64 %mul , 3
129
+ ret i64 %shl
130
+ }
131
+
132
+ define i64 @combine_shl_mul_vscale_commuted (i64 %a ) nounwind {
133
+ ; CHECK-LABEL: combine_shl_mul_vscale_commuted:
134
+ ; CHECK: // %bb.0:
135
+ ; CHECK-NEXT: cnth x8
136
+ ; CHECK-NEXT: mul x0, x0, x8
137
+ ; CHECK-NEXT: ret
138
+ %vscale = tail call i64 @llvm.vscale.i64 ()
139
+ %mul = mul i64 %vscale , %a
140
+ %shl = shl i64 %mul , 3
141
+ ret i64 %shl
142
+ }
143
+
144
+ declare i32 @llvm.vscale.i32 ()
145
+ declare i64 @llvm.vscale.i64 ()
0 commit comments