1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2
2
; RUN: opt < %s -passes=msan -S | FileCheck %s
3
3
;
4
- ; The heuristic handler for llvm.reverse is incorrect because it doesn't
5
- ; reverse the shadow.
6
- ;
7
4
; Forked from llvm/test/CodeGen/X86/bitreverse.ll
8
5
9
6
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
@@ -16,8 +13,9 @@ define <2 x i16> @test_bitreverse_v2i16(<2 x i16> %a) nounwind #0 {
16
13
; CHECK-SAME: <2 x i16> [[A:%.*]]) #[[ATTR1:[0-9]+]] {
17
14
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr @__msan_param_tls, align 8
18
15
; CHECK-NEXT: call void @llvm.donothing()
16
+ ; CHECK-NEXT: [[TMP2:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[TMP1]])
19
17
; CHECK-NEXT: [[B:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[A]])
20
- ; CHECK-NEXT: store <2 x i16> [[TMP1 ]], ptr @__msan_retval_tls, align 8
18
+ ; CHECK-NEXT: store <2 x i16> [[TMP2 ]], ptr @__msan_retval_tls, align 8
21
19
; CHECK-NEXT: ret <2 x i16> [[B]]
22
20
;
23
21
%b = call <2 x i16 > @llvm.bitreverse.v2i16 (<2 x i16 > %a )
@@ -31,8 +29,9 @@ define i64 @test_bitreverse_i64(i64 %a) nounwind #0 {
31
29
; CHECK-SAME: i64 [[A:%.*]]) #[[ATTR1]] {
32
30
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
33
31
; CHECK-NEXT: call void @llvm.donothing()
32
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i64 @llvm.bitreverse.i64(i64 [[TMP1]])
34
33
; CHECK-NEXT: [[B:%.*]] = call i64 @llvm.bitreverse.i64(i64 [[A]])
35
- ; CHECK-NEXT: store i64 [[TMP1 ]], ptr @__msan_retval_tls, align 8
34
+ ; CHECK-NEXT: store i64 [[TMP2 ]], ptr @__msan_retval_tls, align 8
36
35
; CHECK-NEXT: ret i64 [[B]]
37
36
;
38
37
%b = call i64 @llvm.bitreverse.i64 (i64 %a )
@@ -46,8 +45,9 @@ define i32 @test_bitreverse_i32(i32 %a) nounwind #0 {
46
45
; CHECK-SAME: i32 [[A:%.*]]) #[[ATTR1]] {
47
46
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8
48
47
; CHECK-NEXT: call void @llvm.donothing()
48
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[TMP1]])
49
49
; CHECK-NEXT: [[B:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[A]])
50
- ; CHECK-NEXT: store i32 [[TMP1 ]], ptr @__msan_retval_tls, align 8
50
+ ; CHECK-NEXT: store i32 [[TMP2 ]], ptr @__msan_retval_tls, align 8
51
51
; CHECK-NEXT: ret i32 [[B]]
52
52
;
53
53
%b = call i32 @llvm.bitreverse.i32 (i32 %a )
@@ -61,8 +61,9 @@ define i24 @test_bitreverse_i24(i24 %a) nounwind #0 {
61
61
; CHECK-SAME: i24 [[A:%.*]]) #[[ATTR1]] {
62
62
; CHECK-NEXT: [[TMP1:%.*]] = load i24, ptr @__msan_param_tls, align 8
63
63
; CHECK-NEXT: call void @llvm.donothing()
64
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i24 @llvm.bitreverse.i24(i24 [[TMP1]])
64
65
; CHECK-NEXT: [[B:%.*]] = call i24 @llvm.bitreverse.i24(i24 [[A]])
65
- ; CHECK-NEXT: store i24 [[TMP1 ]], ptr @__msan_retval_tls, align 8
66
+ ; CHECK-NEXT: store i24 [[TMP2 ]], ptr @__msan_retval_tls, align 8
66
67
; CHECK-NEXT: ret i24 [[B]]
67
68
;
68
69
%b = call i24 @llvm.bitreverse.i24 (i24 %a )
@@ -76,8 +77,9 @@ define i16 @test_bitreverse_i16(i16 %a) nounwind #0 {
76
77
; CHECK-SAME: i16 [[A:%.*]]) #[[ATTR1]] {
77
78
; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @__msan_param_tls, align 8
78
79
; CHECK-NEXT: call void @llvm.donothing()
80
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.bitreverse.i16(i16 [[TMP1]])
79
81
; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.bitreverse.i16(i16 [[A]])
80
- ; CHECK-NEXT: store i16 [[TMP1 ]], ptr @__msan_retval_tls, align 8
82
+ ; CHECK-NEXT: store i16 [[TMP2 ]], ptr @__msan_retval_tls, align 8
81
83
; CHECK-NEXT: ret i16 [[B]]
82
84
;
83
85
%b = call i16 @llvm.bitreverse.i16 (i16 %a )
@@ -91,8 +93,9 @@ define i8 @test_bitreverse_i8(i8 %a) #0 {
91
93
; CHECK-SAME: i8 [[A:%.*]]) #[[ATTR2:[0-9]+]] {
92
94
; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @__msan_param_tls, align 8
93
95
; CHECK-NEXT: call void @llvm.donothing()
96
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[TMP1]])
94
97
; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[A]])
95
- ; CHECK-NEXT: store i8 [[TMP1 ]], ptr @__msan_retval_tls, align 8
98
+ ; CHECK-NEXT: store i8 [[TMP2 ]], ptr @__msan_retval_tls, align 8
96
99
; CHECK-NEXT: ret i8 [[B]]
97
100
;
98
101
%b = call i8 @llvm.bitreverse.i8 (i8 %a )
@@ -106,8 +109,9 @@ define i4 @test_bitreverse_i4(i4 %a) #0 {
106
109
; CHECK-SAME: i4 [[A:%.*]]) #[[ATTR2]] {
107
110
; CHECK-NEXT: [[TMP1:%.*]] = load i4, ptr @__msan_param_tls, align 8
108
111
; CHECK-NEXT: call void @llvm.donothing()
112
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i4 @llvm.bitreverse.i4(i4 [[TMP1]])
109
113
; CHECK-NEXT: [[B:%.*]] = call i4 @llvm.bitreverse.i4(i4 [[A]])
110
- ; CHECK-NEXT: store i4 [[TMP1 ]], ptr @__msan_retval_tls, align 8
114
+ ; CHECK-NEXT: store i4 [[TMP2 ]], ptr @__msan_retval_tls, align 8
111
115
; CHECK-NEXT: ret i4 [[B]]
112
116
;
113
117
%b = call i4 @llvm.bitreverse.i4 (i4 %a )
@@ -120,8 +124,9 @@ define <2 x i16> @fold_v2i16() #0 {
120
124
; CHECK-LABEL: define <2 x i16> @fold_v2i16(
121
125
; CHECK-SAME: ) #[[ATTR2]] {
122
126
; CHECK-NEXT: call void @llvm.donothing()
127
+ ; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> zeroinitializer)
123
128
; CHECK-NEXT: [[B:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> <i16 15, i16 3840>)
124
- ; CHECK-NEXT: store <2 x i16> zeroinitializer , ptr @__msan_retval_tls, align 8
129
+ ; CHECK-NEXT: store <2 x i16> [[TMP1]] , ptr @__msan_retval_tls, align 8
125
130
; CHECK-NEXT: ret <2 x i16> [[B]]
126
131
;
127
132
%b = call <2 x i16 > @llvm.bitreverse.v2i16 (<2 x i16 > <i16 15 , i16 3840 >)
@@ -132,8 +137,9 @@ define i24 @fold_i24() #0 {
132
137
; CHECK-LABEL: define i24 @fold_i24(
133
138
; CHECK-SAME: ) #[[ATTR2]] {
134
139
; CHECK-NEXT: call void @llvm.donothing()
140
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i24 @llvm.bitreverse.i24(i24 0)
135
141
; CHECK-NEXT: [[B:%.*]] = call i24 @llvm.bitreverse.i24(i24 4096)
136
- ; CHECK-NEXT: store i24 0 , ptr @__msan_retval_tls, align 8
142
+ ; CHECK-NEXT: store i24 [[TMP1]] , ptr @__msan_retval_tls, align 8
137
143
; CHECK-NEXT: ret i24 [[B]]
138
144
;
139
145
%b = call i24 @llvm.bitreverse.i24 (i24 4096 )
@@ -144,8 +150,9 @@ define i8 @fold_i8() #0 {
144
150
; CHECK-LABEL: define i8 @fold_i8(
145
151
; CHECK-SAME: ) #[[ATTR2]] {
146
152
; CHECK-NEXT: call void @llvm.donothing()
153
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.bitreverse.i8(i8 0)
147
154
; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.bitreverse.i8(i8 15)
148
- ; CHECK-NEXT: store i8 0 , ptr @__msan_retval_tls, align 8
155
+ ; CHECK-NEXT: store i8 [[TMP1]] , ptr @__msan_retval_tls, align 8
149
156
; CHECK-NEXT: ret i8 [[B]]
150
157
;
151
158
%b = call i8 @llvm.bitreverse.i8 (i8 15 )
@@ -156,8 +163,9 @@ define i4 @fold_i4() #0 {
156
163
; CHECK-LABEL: define i4 @fold_i4(
157
164
; CHECK-SAME: ) #[[ATTR2]] {
158
165
; CHECK-NEXT: call void @llvm.donothing()
166
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i4 @llvm.bitreverse.i4(i4 0)
159
167
; CHECK-NEXT: [[B:%.*]] = call i4 @llvm.bitreverse.i4(i4 -8)
160
- ; CHECK-NEXT: store i4 0 , ptr @__msan_retval_tls, align 8
168
+ ; CHECK-NEXT: store i4 [[TMP1]] , ptr @__msan_retval_tls, align 8
161
169
; CHECK-NEXT: ret i4 [[B]]
162
170
;
163
171
%b = call i4 @llvm.bitreverse.i4 (i4 8 )
@@ -171,9 +179,11 @@ define i8 @identity_i8(i8 %a) #0 {
171
179
; CHECK-SAME: i8 [[A:%.*]]) #[[ATTR2]] {
172
180
; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @__msan_param_tls, align 8
173
181
; CHECK-NEXT: call void @llvm.donothing()
182
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[TMP1]])
174
183
; CHECK-NEXT: [[B:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[A]])
184
+ ; CHECK-NEXT: [[TMP3:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[TMP2]])
175
185
; CHECK-NEXT: [[C:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[B]])
176
- ; CHECK-NEXT: store i8 [[TMP1 ]], ptr @__msan_retval_tls, align 8
186
+ ; CHECK-NEXT: store i8 [[TMP3 ]], ptr @__msan_retval_tls, align 8
177
187
; CHECK-NEXT: ret i8 [[C]]
178
188
;
179
189
%b = call i8 @llvm.bitreverse.i8 (i8 %a )
@@ -186,9 +196,11 @@ define <2 x i16> @identity_v2i16(<2 x i16> %a) #0 {
186
196
; CHECK-SAME: <2 x i16> [[A:%.*]]) #[[ATTR2]] {
187
197
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i16>, ptr @__msan_param_tls, align 8
188
198
; CHECK-NEXT: call void @llvm.donothing()
199
+ ; CHECK-NEXT: [[TMP2:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[TMP1]])
189
200
; CHECK-NEXT: [[B:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[A]])
201
+ ; CHECK-NEXT: [[TMP3:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[TMP2]])
190
202
; CHECK-NEXT: [[C:%.*]] = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> [[B]])
191
- ; CHECK-NEXT: store <2 x i16> [[TMP1 ]], ptr @__msan_retval_tls, align 8
203
+ ; CHECK-NEXT: store <2 x i16> [[TMP3 ]], ptr @__msan_retval_tls, align 8
192
204
; CHECK-NEXT: ret <2 x i16> [[C]]
193
205
;
194
206
%b = call <2 x i16 > @llvm.bitreverse.v2i16 (<2 x i16 > %a )
@@ -206,8 +218,9 @@ define i528 @large_promotion(i528 %A) nounwind #0 {
206
218
; CHECK-SAME: i528 [[A:%.*]]) #[[ATTR1]] {
207
219
; CHECK-NEXT: [[TMP1:%.*]] = load i528, ptr @__msan_param_tls, align 8
208
220
; CHECK-NEXT: call void @llvm.donothing()
221
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i528 @llvm.bitreverse.i528(i528 [[TMP1]])
209
222
; CHECK-NEXT: [[Z:%.*]] = call i528 @llvm.bitreverse.i528(i528 [[A]])
210
- ; CHECK-NEXT: store i528 [[TMP1 ]], ptr @__msan_retval_tls, align 8
223
+ ; CHECK-NEXT: store i528 [[TMP2 ]], ptr @__msan_retval_tls, align 8
211
224
; CHECK-NEXT: ret i528 [[Z]]
212
225
;
213
226
%Z = call i528 @llvm.bitreverse.i528 (i528 %A )
0 commit comments