4
4
;.
5
5
; CHECK: @G = global i32 5
6
6
; CHECK: @ptr_pat = private unnamed_addr constant ptr @G, align 8
7
+ ; CHECK: @nonconst_ptr_pat = private unnamed_addr global ptr @G, align 8
7
8
; CHECK: @.memset_pattern = private unnamed_addr constant [2 x i64] [i64 -6148895925951734307, i64 -6148895925951734307], align 16
8
9
; CHECK: @.memset_pattern.1 = private unnamed_addr constant [2 x i64] [i64 4614256656552045848, i64 4614256656552045848], align 16
9
- ; CHECK: @.memset_pattern.2 = private unnamed_addr constant [8 x i16 ] [i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555 ], align 16
10
- ; CHECK: @.memset_pattern.3 = private unnamed_addr constant i128 -113427455635030943652277463699152839203 , align 16
11
- ; CHECK: @.memset_pattern.4 = private unnamed_addr constant i128 -113427455635030943652277463699152839203 , align 16
10
+ ; CHECK: @.memset_pattern.2 = private unnamed_addr constant [2 x ptr ] [ptr @G, ptr @G ], align 16
11
+ ; CHECK: @.memset_pattern.3 = private unnamed_addr constant [2 x ptr] [ptr @G, ptr @G] , align 16
12
+ ; CHECK: @.memset_pattern.4 = private unnamed_addr constant [8 x i16] [i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555, i16 -21555] , align 16
12
13
; CHECK: @.memset_pattern.5 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
13
14
; CHECK: @.memset_pattern.6 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
15
+ ; CHECK: @.memset_pattern.7 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
16
+ ; CHECK: @.memset_pattern.8 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
14
17
;.
15
18
define void @memset_pattern_i128_1_dynvalue (ptr %a , i128 %value ) nounwind {
16
19
; CHECK-LABEL: define void @memset_pattern_i128_1_dynvalue(
@@ -33,7 +36,7 @@ define void @memset_pattern_i128_1_dynvalue(ptr %a, i128 %value) nounwind {
33
36
define void @memset_pattern_i128_1 (ptr %a , i128 %value ) nounwind {
34
37
; CHECK-LABEL: define void @memset_pattern_i128_1(
35
38
; CHECK-SAME: ptr [[A:%.*]], i128 [[VALUE:%.*]]) #[[ATTR0]] {
36
- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.3 , i64 16)
39
+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.5 , i64 16)
37
40
; CHECK-NEXT: ret void
38
41
;
39
42
tail call void @llvm.experimental.memset.pattern (ptr %a , i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 1 , i1 false )
@@ -61,7 +64,7 @@ define void @memset_pattern_i128_1_nz_as(ptr addrspace(1) %a, i128 %value) nounw
61
64
define void @memset_pattern_i128_1_align_attr (ptr align (16 ) %a , i128 %value ) nounwind {
62
65
; CHECK-LABEL: define void @memset_pattern_i128_1_align_attr(
63
66
; CHECK-SAME: ptr align 16 [[A:%.*]], i128 [[VALUE:%.*]]) #[[ATTR0]] {
64
- ; CHECK-NEXT: call void @memset_pattern16(ptr align 16 [[A]], ptr @.memset_pattern.4 , i64 16)
67
+ ; CHECK-NEXT: call void @memset_pattern16(ptr align 16 [[A]], ptr @.memset_pattern.6 , i64 16)
65
68
; CHECK-NEXT: ret void
66
69
;
67
70
tail call void @llvm.experimental.memset.pattern (ptr align (16 ) %a , i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 1 , i1 false )
@@ -71,7 +74,7 @@ define void @memset_pattern_i128_1_align_attr(ptr align(16) %a, i128 %value) nou
71
74
define void @memset_pattern_i128_16 (ptr %a ) nounwind {
72
75
; CHECK-LABEL: define void @memset_pattern_i128_16(
73
76
; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {
74
- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.5 , i64 256)
77
+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.7 , i64 256)
75
78
; CHECK-NEXT: ret void
76
79
;
77
80
tail call void @llvm.experimental.memset.pattern (ptr %a , i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 16 , i1 false )
@@ -82,7 +85,7 @@ define void @memset_pattern_i128_x(ptr %a, i64 %x) nounwind {
82
85
; CHECK-LABEL: define void @memset_pattern_i128_x(
83
86
; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
84
87
; CHECK-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]]
85
- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.6 , i64 [[TMP1]])
88
+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.8 , i64 [[TMP1]])
86
89
; CHECK-NEXT: ret void
87
90
;
88
91
tail call void @llvm.experimental.memset.pattern (ptr %a , i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 %x , i1 false )
@@ -112,7 +115,7 @@ define void @memset_pattern_i16_x(ptr %a, i64 %x) nounwind {
112
115
; CHECK-LABEL: define void @memset_pattern_i16_x(
113
116
; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
114
117
; CHECK-NEXT: [[TMP1:%.*]] = mul i64 2, [[X]]
115
- ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.2 , i64 [[TMP1]])
118
+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.4 , i64 [[TMP1]])
116
119
; CHECK-NEXT: ret void
117
120
;
118
121
tail call void @llvm.experimental.memset.pattern (ptr %a , i16 u0xabcd, i64 %x , i1 false )
@@ -149,42 +152,24 @@ define void @memset_pattern_i64_128_tbaa(ptr %a) nounwind {
149
152
@G = global i32 5
150
153
@ptr_pat = private unnamed_addr constant ptr @G , align 8
151
154
152
- ; FIXME: memset_pattern16 should be selected.
153
155
define void @memset_pattern_i64_16_fromptr (ptr %a ) nounwind {
154
156
; CHECK-LABEL: define void @memset_pattern_i64_16_fromptr(
155
157
; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {
156
158
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @ptr_pat, align 8
157
- ; CHECK-NEXT: br i1 false, label %[[SPLIT:.*]], label %[[LOADSTORELOOP:.*]]
158
- ; CHECK: [[LOADSTORELOOP]]:
159
- ; CHECK-NEXT: [[TMP2:%.*]] = phi i64 [ 0, [[TMP0:%.*]] ], [ [[TMP4:%.*]], %[[LOADSTORELOOP]] ]
160
- ; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP2]]
161
- ; CHECK-NEXT: store i64 [[TMP1]], ptr [[TMP3]], align 1
162
- ; CHECK-NEXT: [[TMP4]] = add i64 [[TMP2]], 1
163
- ; CHECK-NEXT: [[TMP5:%.*]] = icmp ult i64 [[TMP4]], 16
164
- ; CHECK-NEXT: br i1 [[TMP5]], label %[[LOADSTORELOOP]], label %[[SPLIT]]
165
- ; CHECK: [[SPLIT]]:
159
+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.2, i64 128)
166
160
; CHECK-NEXT: ret void
167
161
;
168
162
%1 = load i64 , ptr @ptr_pat , align 8
169
163
tail call void @llvm.experimental.memset.pattern (ptr %a , i64 %1 , i64 16 , i1 false )
170
164
ret void
171
165
}
172
166
173
- ; FIXME: memset_pattern16 should be selected.
174
167
define void @memset_pattern_i64_x_fromptr (ptr %a , i64 %x ) nounwind {
175
168
; CHECK-LABEL: define void @memset_pattern_i64_x_fromptr(
176
169
; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
177
170
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @ptr_pat, align 8
178
- ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 0, [[X]]
179
- ; CHECK-NEXT: br i1 [[TMP2]], label %[[SPLIT:.*]], label %[[LOADSTORELOOP:.*]]
180
- ; CHECK: [[LOADSTORELOOP]]:
181
- ; CHECK-NEXT: [[TMP3:%.*]] = phi i64 [ 0, [[TMP0:%.*]] ], [ [[TMP5:%.*]], %[[LOADSTORELOOP]] ]
182
- ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP3]]
183
- ; CHECK-NEXT: store i64 [[TMP1]], ptr [[TMP4]], align 1
184
- ; CHECK-NEXT: [[TMP5]] = add i64 [[TMP3]], 1
185
- ; CHECK-NEXT: [[TMP6:%.*]] = icmp ult i64 [[TMP5]], [[X]]
186
- ; CHECK-NEXT: br i1 [[TMP6]], label %[[LOADSTORELOOP]], label %[[SPLIT]]
187
- ; CHECK: [[SPLIT]]:
171
+ ; CHECK-NEXT: [[TMP2:%.*]] = mul i64 8, [[X]]
172
+ ; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.3, i64 [[TMP2]])
188
173
; CHECK-NEXT: ret void
189
174
;
190
175
%1 = load i64 , ptr @ptr_pat , align 8
0 commit comments