@@ -35,12 +35,7 @@ define i64 @f1() #0 {
35
35
; CHECK-LABEL: define i64 @f1
36
36
; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
37
37
; CHECK-NEXT: entry:
38
- ; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
39
- ; CHECK-NEXT: [[TMP1:%.*]] = shl i64 [[TMP0]], 4
40
- ; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[TMP0]], 3
41
- ; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[TMP2]], -1
42
- ; CHECK-NEXT: [[REM:%.*]] = and i64 [[TMP1]], [[TMP3]]
43
- ; CHECK-NEXT: ret i64 [[REM]]
38
+ ; CHECK-NEXT: ret i64 0
44
39
;
45
40
entry:
46
41
%0 = call i64 @llvm.vscale.i64 ()
@@ -55,24 +50,19 @@ entry:
55
50
define i64 @test_pow2_or_zero (i64 %arg ) {
56
51
; CHECK-LABEL: define i64 @test_pow2_or_zero
57
52
; CHECK-SAME: (i64 [[ARG:%.*]]) {
58
- ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[ARG]]
59
- ; CHECK-NEXT: [[X:%.*]] = and i64 [[NEG]], [[ARG]]
60
- ; CHECK-NEXT: [[SHL1:%.*]] = shl i64 [[X]], 4
61
- ; CHECK-NEXT: [[SHL2:%.*]] = shl i64 [[X]], 3
62
- ; CHECK-NEXT: [[MASK:%.*]] = add i64 [[SHL2]], -1
63
- ; CHECK-NEXT: [[REM:%.*]] = and i64 [[SHL1]], [[MASK]]
64
- ; CHECK-NEXT: ret i64 [[REM]]
53
+ ; CHECK-NEXT: ret i64 0
65
54
;
66
55
%neg = sub i64 0 , %arg
67
56
%x = and i64 %neg , %arg
68
57
%shl1 = shl i64 %x , 4
69
58
%shl2 = shl i64 %x , 3
70
59
%mask = add i64 %shl2 , -1
71
- %rem = and i64 %shl1 , %mask
60
+ %rem = and i64 %mask , %shl1
72
61
ret i64 %rem
73
62
}
74
63
75
64
;; Make sure it doesn't work if the value isn't known to be a power of 2.
65
+ ;; In this case a vscale without a `vscale_range` attribute on the function.
76
66
define i64 @no_pow2 () {
77
67
; CHECK-LABEL: define i64 @no_pow2() {
78
68
; CHECK-NEXT: entry:
@@ -92,6 +82,70 @@ entry:
92
82
ret i64 %rem
93
83
}
94
84
85
+ ;; Make sure it doesn't work if the shift on the -1 side is greater
86
+ define i64 @minus_shift_greater (i64 %arg ) {
87
+ ; CHECK-LABEL: define i64 @minus_shift_greater
88
+ ; CHECK-SAME: (i64 [[ARG:%.*]]) {
89
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[ARG]]
90
+ ; CHECK-NEXT: [[X:%.*]] = and i64 [[NEG]], [[ARG]]
91
+ ; CHECK-NEXT: [[SHL1:%.*]] = shl i64 [[X]], 3
92
+ ; CHECK-NEXT: [[SHL2:%.*]] = shl i64 [[X]], 4
93
+ ; CHECK-NEXT: [[MASK:%.*]] = add i64 [[SHL2]], -1
94
+ ; CHECK-NEXT: [[REM:%.*]] = and i64 [[SHL1]], [[MASK]]
95
+ ; CHECK-NEXT: ret i64 [[REM]]
96
+ ;
97
+ %neg = sub i64 0 , %arg
98
+ %x = and i64 %neg , %arg
99
+ %shl1 = shl i64 %x , 3
100
+ %shl2 = shl i64 %x , 4
101
+ %mask = add i64 %shl2 , -1
102
+ %rem = and i64 %shl1 , %mask
103
+ ret i64 %rem
104
+ }
105
+
106
+ ;; Make sure it doesn't work if the subtract isn't one.
107
+ define i64 @sub2 (i64 %arg ) {
108
+ ; CHECK-LABEL: define i64 @sub2
109
+ ; CHECK-SAME: (i64 [[ARG:%.*]]) {
110
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[ARG]]
111
+ ; CHECK-NEXT: [[X:%.*]] = and i64 [[NEG]], [[ARG]]
112
+ ; CHECK-NEXT: [[SHL1:%.*]] = shl i64 [[X]], 4
113
+ ; CHECK-NEXT: [[SHL2:%.*]] = shl i64 [[X]], 3
114
+ ; CHECK-NEXT: [[MASK:%.*]] = add i64 [[SHL2]], -2
115
+ ; CHECK-NEXT: [[REM:%.*]] = and i64 [[SHL1]], [[MASK]]
116
+ ; CHECK-NEXT: ret i64 [[REM]]
117
+ ;
118
+ %neg = sub i64 0 , %arg
119
+ %x = and i64 %neg , %arg
120
+ %shl1 = shl i64 %x , 4
121
+ %shl2 = shl i64 %x , 3
122
+ %mask = add i64 %shl2 , -2
123
+ %rem = and i64 %shl1 , %mask
124
+ ret i64 %rem
125
+ }
126
+
127
+ ;; Make sure it doesn't work with a right shift
128
+ ;; Make sure it doesn't work if the subtract isn't one.
129
+ define i64 @rightshift (i64 %arg ) {
130
+ ; CHECK-LABEL: define i64 @rightshift
131
+ ; CHECK-SAME: (i64 [[ARG:%.*]]) {
132
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[ARG]]
133
+ ; CHECK-NEXT: [[X:%.*]] = and i64 [[NEG]], [[ARG]]
134
+ ; CHECK-NEXT: [[SHL1:%.*]] = shl i64 [[X]], 4
135
+ ; CHECK-NEXT: [[SHL2:%.*]] = lshr i64 [[X]], 3
136
+ ; CHECK-NEXT: [[MASK:%.*]] = add i64 [[SHL2]], -1
137
+ ; CHECK-NEXT: [[REM:%.*]] = and i64 [[SHL1]], [[MASK]]
138
+ ; CHECK-NEXT: ret i64 [[REM]]
139
+ ;
140
+ %neg = sub i64 0 , %arg
141
+ %x = and i64 %neg , %arg
142
+ %shl1 = shl i64 %x , 4
143
+ %shl2 = lshr i64 %x , 3
144
+ %mask = add i64 %shl2 , -1
145
+ %rem = and i64 %shl1 , %mask
146
+ ret i64 %rem
147
+ }
148
+
95
149
declare i64 @llvm.vscale.i64 ()
96
150
97
151
attributes #0 = { vscale_range(1 ,16 ) }
0 commit comments