14
14
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
15
15
target triple = "aarch64--linux-android9001"
16
16
17
- define i32 @vmax_u8x8 (<8 x i8 > %a ) nounwind ssp {
17
+ define i32 @vmax_u8x8 (<8 x i8 > %a ) nounwind ssp # 0 {
18
18
; CHECK-LABEL: define i32 @vmax_u8x8(
19
19
; CHECK-SAME: <8 x i8> [[A:%.*]]) #[[ATTR0:[0-9]+]] {
20
- ; CHECK-NEXT: [[ENTRY:.*]]:
20
+ ; CHECK-NEXT: [[ENTRY:.*:]]
21
+ ; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i8>, ptr @__msan_param_tls, align 8
21
22
; CHECK-NEXT: call void @llvm.donothing()
23
+ ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <8 x i8> [[TMP3]] to i64
24
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP4]], 0
25
+ ; CHECK-NEXT: br i1 [[_MSCMP]], label %[[BB2:.*]], label %[[BB3:.*]], !prof [[PROF1:![0-9]+]]
26
+ ; CHECK: [[BB2]]:
27
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4:[0-9]+]]
28
+ ; CHECK-NEXT: unreachable
29
+ ; CHECK: [[BB3]]:
22
30
; CHECK-NEXT: [[VMAXV_I:%.*]] = tail call i32 @llvm.aarch64.neon.umaxv.i32.v8i8(<8 x i8> [[A]]) #[[ATTR3:[0-9]+]]
23
31
; CHECK-NEXT: [[TMP:%.*]] = trunc i32 [[VMAXV_I]] to i8
24
32
; CHECK-NEXT: [[TMP0:%.*]] = xor i8 [[TMP]], 0
25
33
; CHECK-NEXT: [[TMP1:%.*]] = and i8 -1, [[TMP0]]
26
34
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
27
35
; CHECK-NEXT: [[_MSPROP_ICMP:%.*]] = and i1 false, [[TMP2]]
28
36
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i8 [[TMP]], 0
37
+ ; CHECK-NEXT: br i1 [[_MSPROP_ICMP]], label %[[BB7:.*]], label %[[BB8:.*]], !prof [[PROF1]]
38
+ ; CHECK: [[BB7]]:
39
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
40
+ ; CHECK-NEXT: unreachable
41
+ ; CHECK: [[BB8]]:
29
42
; CHECK-NEXT: br i1 [[TOBOOL]], label %[[RETURN:.*]], label %[[IF_THEN:.*]]
30
43
; CHECK: [[IF_THEN]]:
31
44
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
32
45
; CHECK-NEXT: [[CALL1:%.*]] = tail call i32 @bar() #[[ATTR3]]
33
46
; CHECK-NEXT: [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 8
34
47
; CHECK-NEXT: br label %[[RETURN]]
35
48
; CHECK: [[RETURN]]:
36
- ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], %[[IF_THEN]] ], [ 0, %[[ENTRY]] ]
37
- ; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
49
+ ; CHECK-NEXT: [[_MSPHI_S:%.*]] = phi i32 [ [[_MSRET]], %[[IF_THEN]] ], [ 0, %[[BB8]] ]
50
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], %[[IF_THEN]] ], [ 0, %[[BB8]] ]
51
+ ; CHECK-NEXT: store i32 [[_MSPHI_S]], ptr @__msan_retval_tls, align 8
38
52
; CHECK-NEXT: ret i32 [[RETVAL_0]]
39
53
;
40
54
entry:
@@ -54,27 +68,41 @@ return:
54
68
55
69
declare i32 @bar (...)
56
70
57
- define i32 @vmax_u4x16 (<4 x i16 > %a ) nounwind ssp {
71
+ define i32 @vmax_u4x16 (<4 x i16 > %a ) nounwind ssp # 0 {
58
72
; CHECK-LABEL: define i32 @vmax_u4x16(
59
73
; CHECK-SAME: <4 x i16> [[A:%.*]]) #[[ATTR0]] {
60
- ; CHECK-NEXT: [[ENTRY:.*]]:
74
+ ; CHECK-NEXT: [[ENTRY:.*:]]
75
+ ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 8
61
76
; CHECK-NEXT: call void @llvm.donothing()
77
+ ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <4 x i16> [[TMP3]] to i64
78
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP4]], 0
79
+ ; CHECK-NEXT: br i1 [[_MSCMP]], label %[[BB2:.*]], label %[[BB3:.*]], !prof [[PROF1]]
80
+ ; CHECK: [[BB2]]:
81
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
82
+ ; CHECK-NEXT: unreachable
83
+ ; CHECK: [[BB3]]:
62
84
; CHECK-NEXT: [[VMAXV_I:%.*]] = tail call i32 @llvm.aarch64.neon.umaxv.i32.v4i16(<4 x i16> [[A]]) #[[ATTR3]]
63
85
; CHECK-NEXT: [[TMP:%.*]] = trunc i32 [[VMAXV_I]] to i16
64
86
; CHECK-NEXT: [[TMP0:%.*]] = xor i16 [[TMP]], 0
65
87
; CHECK-NEXT: [[TMP1:%.*]] = and i16 -1, [[TMP0]]
66
88
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i16 [[TMP1]], 0
67
89
; CHECK-NEXT: [[_MSPROP_ICMP:%.*]] = and i1 false, [[TMP2]]
68
90
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i16 [[TMP]], 0
91
+ ; CHECK-NEXT: br i1 [[_MSPROP_ICMP]], label %[[BB7:.*]], label %[[BB8:.*]], !prof [[PROF1]]
92
+ ; CHECK: [[BB7]]:
93
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
94
+ ; CHECK-NEXT: unreachable
95
+ ; CHECK: [[BB8]]:
69
96
; CHECK-NEXT: br i1 [[TOBOOL]], label %[[RETURN:.*]], label %[[IF_THEN:.*]]
70
97
; CHECK: [[IF_THEN]]:
71
98
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
72
99
; CHECK-NEXT: [[CALL1:%.*]] = tail call i32 @bar() #[[ATTR3]]
73
100
; CHECK-NEXT: [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 8
74
101
; CHECK-NEXT: br label %[[RETURN]]
75
102
; CHECK: [[RETURN]]:
76
- ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], %[[IF_THEN]] ], [ 0, %[[ENTRY]] ]
77
- ; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
103
+ ; CHECK-NEXT: [[_MSPHI_S:%.*]] = phi i32 [ [[_MSRET]], %[[IF_THEN]] ], [ 0, %[[BB8]] ]
104
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], %[[IF_THEN]] ], [ 0, %[[BB8]] ]
105
+ ; CHECK-NEXT: store i32 [[_MSPHI_S]], ptr @__msan_retval_tls, align 8
78
106
; CHECK-NEXT: ret i32 [[RETVAL_0]]
79
107
;
80
108
entry:
@@ -92,27 +120,41 @@ return:
92
120
ret i32 %retval.0
93
121
}
94
122
95
- define i32 @vmax_u8x16 (<8 x i16 > %a ) nounwind ssp {
123
+ define i32 @vmax_u8x16 (<8 x i16 > %a ) nounwind ssp # 0 {
96
124
; CHECK-LABEL: define i32 @vmax_u8x16(
97
125
; CHECK-SAME: <8 x i16> [[A:%.*]]) #[[ATTR0]] {
98
- ; CHECK-NEXT: [[ENTRY:.*]]:
126
+ ; CHECK-NEXT: [[ENTRY:.*:]]
127
+ ; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8
99
128
; CHECK-NEXT: call void @llvm.donothing()
129
+ ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <8 x i16> [[TMP3]] to i128
130
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP4]], 0
131
+ ; CHECK-NEXT: br i1 [[_MSCMP]], label %[[BB2:.*]], label %[[BB3:.*]], !prof [[PROF1]]
132
+ ; CHECK: [[BB2]]:
133
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
134
+ ; CHECK-NEXT: unreachable
135
+ ; CHECK: [[BB3]]:
100
136
; CHECK-NEXT: [[VMAXV_I:%.*]] = tail call i32 @llvm.aarch64.neon.umaxv.i32.v8i16(<8 x i16> [[A]]) #[[ATTR3]]
101
137
; CHECK-NEXT: [[TMP:%.*]] = trunc i32 [[VMAXV_I]] to i16
102
138
; CHECK-NEXT: [[TMP0:%.*]] = xor i16 [[TMP]], 0
103
139
; CHECK-NEXT: [[TMP1:%.*]] = and i16 -1, [[TMP0]]
104
140
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i16 [[TMP1]], 0
105
141
; CHECK-NEXT: [[_MSPROP_ICMP:%.*]] = and i1 false, [[TMP2]]
106
142
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i16 [[TMP]], 0
143
+ ; CHECK-NEXT: br i1 [[_MSPROP_ICMP]], label %[[BB7:.*]], label %[[BB8:.*]], !prof [[PROF1]]
144
+ ; CHECK: [[BB7]]:
145
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
146
+ ; CHECK-NEXT: unreachable
147
+ ; CHECK: [[BB8]]:
107
148
; CHECK-NEXT: br i1 [[TOBOOL]], label %[[RETURN:.*]], label %[[IF_THEN:.*]]
108
149
; CHECK: [[IF_THEN]]:
109
150
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
110
151
; CHECK-NEXT: [[CALL1:%.*]] = tail call i32 @bar() #[[ATTR3]]
111
152
; CHECK-NEXT: [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 8
112
153
; CHECK-NEXT: br label %[[RETURN]]
113
154
; CHECK: [[RETURN]]:
114
- ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], %[[IF_THEN]] ], [ 0, %[[ENTRY]] ]
115
- ; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
155
+ ; CHECK-NEXT: [[_MSPHI_S:%.*]] = phi i32 [ [[_MSRET]], %[[IF_THEN]] ], [ 0, %[[BB8]] ]
156
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], %[[IF_THEN]] ], [ 0, %[[BB8]] ]
157
+ ; CHECK-NEXT: store i32 [[_MSPHI_S]], ptr @__msan_retval_tls, align 8
116
158
; CHECK-NEXT: ret i32 [[RETVAL_0]]
117
159
;
118
160
entry:
@@ -130,27 +172,41 @@ return:
130
172
ret i32 %retval.0
131
173
}
132
174
133
- define i32 @vmax_u16x8 (<16 x i8 > %a ) nounwind ssp {
175
+ define i32 @vmax_u16x8 (<16 x i8 > %a ) nounwind ssp # 0 {
134
176
; CHECK-LABEL: define i32 @vmax_u16x8(
135
177
; CHECK-SAME: <16 x i8> [[A:%.*]]) #[[ATTR0]] {
136
- ; CHECK-NEXT: [[ENTRY:.*]]:
178
+ ; CHECK-NEXT: [[ENTRY:.*:]]
179
+ ; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8
137
180
; CHECK-NEXT: call void @llvm.donothing()
181
+ ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x i8> [[TMP3]] to i128
182
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP4]], 0
183
+ ; CHECK-NEXT: br i1 [[_MSCMP]], label %[[BB2:.*]], label %[[BB3:.*]], !prof [[PROF1]]
184
+ ; CHECK: [[BB2]]:
185
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
186
+ ; CHECK-NEXT: unreachable
187
+ ; CHECK: [[BB3]]:
138
188
; CHECK-NEXT: [[VMAXV_I:%.*]] = tail call i32 @llvm.aarch64.neon.umaxv.i32.v16i8(<16 x i8> [[A]]) #[[ATTR3]]
139
189
; CHECK-NEXT: [[TMP:%.*]] = trunc i32 [[VMAXV_I]] to i8
140
190
; CHECK-NEXT: [[TMP0:%.*]] = xor i8 [[TMP]], 0
141
191
; CHECK-NEXT: [[TMP1:%.*]] = and i8 -1, [[TMP0]]
142
192
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
143
193
; CHECK-NEXT: [[_MSPROP_ICMP:%.*]] = and i1 false, [[TMP2]]
144
194
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i8 [[TMP]], 0
195
+ ; CHECK-NEXT: br i1 [[_MSPROP_ICMP]], label %[[BB7:.*]], label %[[BB8:.*]], !prof [[PROF1]]
196
+ ; CHECK: [[BB7]]:
197
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
198
+ ; CHECK-NEXT: unreachable
199
+ ; CHECK: [[BB8]]:
145
200
; CHECK-NEXT: br i1 [[TOBOOL]], label %[[RETURN:.*]], label %[[IF_THEN:.*]]
146
201
; CHECK: [[IF_THEN]]:
147
202
; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
148
203
; CHECK-NEXT: [[CALL1:%.*]] = tail call i32 @bar() #[[ATTR3]]
149
204
; CHECK-NEXT: [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 8
150
205
; CHECK-NEXT: br label %[[RETURN]]
151
206
; CHECK: [[RETURN]]:
152
- ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], %[[IF_THEN]] ], [ 0, %[[ENTRY]] ]
153
- ; CHECK-NEXT: store i32 0, ptr @__msan_retval_tls, align 8
207
+ ; CHECK-NEXT: [[_MSPHI_S:%.*]] = phi i32 [ [[_MSRET]], %[[IF_THEN]] ], [ 0, %[[BB8]] ]
208
+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], %[[IF_THEN]] ], [ 0, %[[BB8]] ]
209
+ ; CHECK-NEXT: store i32 [[_MSPHI_S]], ptr @__msan_retval_tls, align 8
154
210
; CHECK-NEXT: ret i32 [[RETVAL_0]]
155
211
;
156
212
entry:
@@ -177,9 +233,9 @@ define <8 x i8> @test_vmaxv_u8_used_by_laneop(<8 x i8> %a1, <8 x i8> %a2) #0 {
177
233
; CHECK-NEXT: call void @llvm.donothing()
178
234
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i8> [[TMP0]] to i64
179
235
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP2]], 0
180
- ; CHECK-NEXT: br i1 [[_MSCMP]], label %[[BB3:.*]], label %[[BB4:.*]], !prof [[PROF1:![0-9]+ ]]
236
+ ; CHECK-NEXT: br i1 [[_MSCMP]], label %[[BB3:.*]], label %[[BB4:.*]], !prof [[PROF1]]
181
237
; CHECK: [[BB3]]:
182
- ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4:[0-9]+ ]]
238
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
183
239
; CHECK-NEXT: unreachable
184
240
; CHECK: [[BB4]]:
185
241
; CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @llvm.aarch64.neon.umaxv.i32.v8i8(<8 x i8> [[A2]])
0 commit comments