Skip to content

Commit 6db2594

Browse files
authored
[PreISelIntrinsicLowering] Zext/trunc count parameter as necessary for memset_pattern16 emission (#129239)
This patch cleans up the handling of the count parameter in general, though was initially motivated by a compiler crash upon a memset.pattern with a narrow count causing a compiler crash due to different types for CreateMul when converting the count to the number of bytes. The logic used to name globals means there is some minor renaming churn in the output to test/Transforms/PreISelIntrinsicLowering/X86/memset-pattern.ll irrelevant to the newly added tests (that would crash before).
1 parent 96b112f commit 6db2594

File tree

2 files changed

+45
-17
lines changed

2 files changed

+45
-17
lines changed

llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -394,11 +394,12 @@ bool PreISelIntrinsicLowering::expandMemIntrinsicUses(Function &F) const {
394394
Module *M = Memset->getModule();
395395
const DataLayout &DL = Memset->getDataLayout();
396396

397+
Type *DestPtrTy = Memset->getRawDest()->getType();
398+
Type *SizeTTy = TLI.getSizeTType(*M);
397399
StringRef FuncName = "memset_pattern16";
398-
FunctionCallee MSP = getOrInsertLibFunc(
399-
M, TLI, LibFunc_memset_pattern16, Builder.getVoidTy(),
400-
Memset->getRawDest()->getType(), Builder.getPtrTy(),
401-
Memset->getLength()->getType());
400+
FunctionCallee MSP = getOrInsertLibFunc(M, TLI, LibFunc_memset_pattern16,
401+
Builder.getVoidTy(), DestPtrTy,
402+
Builder.getPtrTy(), SizeTTy);
402403
inferNonMandatoryLibFuncAttrs(M, FuncName, TLI);
403404

404405
// Otherwise we should form a memset_pattern16. PatternValue is known
@@ -415,8 +416,9 @@ bool PreISelIntrinsicLowering::expandMemIntrinsicUses(Function &F) const {
415416
GV->setAlignment(Align(16));
416417
Value *PatternPtr = GV;
417418
Value *NumBytes = Builder.CreateMul(
418-
Builder.getInt64(DL.getTypeAllocSize(Memset->getValue()->getType())),
419-
Memset->getLength());
419+
TLI.getAsSizeT(DL.getTypeAllocSize(Memset->getValue()->getType()),
420+
*M),
421+
Builder.CreateZExtOrTrunc(Memset->getLength(), SizeTTy));
420422
CallInst *MemsetPattern16Call =
421423
Builder.CreateCall(MSP, {Memset->getRawDest(), PatternPtr, NumBytes});
422424
MemsetPattern16Call->setAAMetadata(Memset->getAAMetadata());

llvm/test/Transforms/PreISelIntrinsicLowering/X86/memset-pattern.ll

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33

44
;.
55
; CHECK: @.memset_pattern = private unnamed_addr constant [2 x i64] [i64 -6148895925951734307, i64 -6148895925951734307], align 16
6-
; CHECK: @.memset_pattern.1 = private unnamed_addr constant [2 x i64] [i64 4614256656552045848, i64 4614256656552045848], align 16
7-
; 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
8-
; CHECK: @.memset_pattern.3 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
9-
; CHECK: @.memset_pattern.4 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
6+
; CHECK: @.memset_pattern.1 = private unnamed_addr constant [2 x i64] [i64 -6148895925951734307, i64 -6148895925951734307], align 16
7+
; CHECK: @.memset_pattern.2 = private unnamed_addr constant [2 x i64] [i64 -6148895925951734307, i64 -6148895925951734307], align 16
8+
; CHECK: @.memset_pattern.3 = private unnamed_addr constant [2 x i64] [i64 4614256656552045848, i64 4614256656552045848], align 16
9+
; 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
1010
; CHECK: @.memset_pattern.5 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
1111
; CHECK: @.memset_pattern.6 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
12+
; CHECK: @.memset_pattern.7 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
13+
; CHECK: @.memset_pattern.8 = private unnamed_addr constant i128 -113427455635030943652277463699152839203, align 16
1214
;.
1315
define void @memset_pattern_i128_1_dynvalue(ptr %a, i128 %value) nounwind {
1416
; CHECK-LABEL: define void @memset_pattern_i128_1_dynvalue(
@@ -31,7 +33,7 @@ define void @memset_pattern_i128_1_dynvalue(ptr %a, i128 %value) nounwind {
3133
define void @memset_pattern_i128_1(ptr %a, i128 %value) nounwind {
3234
; CHECK-LABEL: define void @memset_pattern_i128_1(
3335
; CHECK-SAME: ptr [[A:%.*]], i128 [[VALUE:%.*]]) #[[ATTR0]] {
34-
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.3, i64 16)
36+
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.5, i64 16)
3537
; CHECK-NEXT: ret void
3638
;
3739
tail call void @llvm.experimental.memset.pattern(ptr %a, i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 1, i1 false)
@@ -59,7 +61,7 @@ define void @memset_pattern_i128_1_nz_as(ptr addrspace(1) %a, i128 %value) nounw
5961
define void @memset_pattern_i128_1_align_attr(ptr align(16) %a, i128 %value) nounwind {
6062
; CHECK-LABEL: define void @memset_pattern_i128_1_align_attr(
6163
; CHECK-SAME: ptr align 16 [[A:%.*]], i128 [[VALUE:%.*]]) #[[ATTR0]] {
62-
; CHECK-NEXT: call void @memset_pattern16(ptr align 16 [[A]], ptr @.memset_pattern.4, i64 16)
64+
; CHECK-NEXT: call void @memset_pattern16(ptr align 16 [[A]], ptr @.memset_pattern.6, i64 16)
6365
; CHECK-NEXT: ret void
6466
;
6567
tail call void @llvm.experimental.memset.pattern(ptr align(16) %a, i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 1, i1 false)
@@ -69,7 +71,7 @@ define void @memset_pattern_i128_1_align_attr(ptr align(16) %a, i128 %value) nou
6971
define void @memset_pattern_i128_16(ptr %a) nounwind {
7072
; CHECK-LABEL: define void @memset_pattern_i128_16(
7173
; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {
72-
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.5, i64 256)
74+
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.7, i64 256)
7375
; CHECK-NEXT: ret void
7476
;
7577
tail call void @llvm.experimental.memset.pattern(ptr %a, i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 16, i1 false)
@@ -80,7 +82,7 @@ define void @memset_pattern_i128_x(ptr %a, i64 %x) nounwind {
8082
; CHECK-LABEL: define void @memset_pattern_i128_x(
8183
; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
8284
; CHECK-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]]
83-
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.6, i64 [[TMP1]])
85+
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.8, i64 [[TMP1]])
8486
; CHECK-NEXT: ret void
8587
;
8688
tail call void @llvm.experimental.memset.pattern(ptr %a, i128 u0xaaaaaaaabbbbbbbbccccccccdddddddd, i64 %x, i1 false)
@@ -110,7 +112,7 @@ define void @memset_pattern_i16_x(ptr %a, i64 %x) nounwind {
110112
; CHECK-LABEL: define void @memset_pattern_i16_x(
111113
; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
112114
; CHECK-NEXT: [[TMP1:%.*]] = mul i64 2, [[X]]
113-
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.2, i64 [[TMP1]])
115+
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.4, i64 [[TMP1]])
114116
; CHECK-NEXT: ret void
115117
;
116118
tail call void @llvm.experimental.memset.pattern(ptr %a, i16 u0xabcd, i64 %x, i1 false)
@@ -121,7 +123,7 @@ define void @memset_pattern_i64_x(ptr %a, i64 %x) nounwind {
121123
; CHECK-LABEL: define void @memset_pattern_i64_x(
122124
; CHECK-SAME: ptr [[A:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
123125
; CHECK-NEXT: [[TMP1:%.*]] = mul i64 8, [[X]]
124-
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern, i64 [[TMP1]])
126+
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.2, i64 [[TMP1]])
125127
; CHECK-NEXT: ret void
126128
;
127129
tail call void @llvm.experimental.memset.pattern(ptr %a, i64 u0xaaaabbbbccccdddd, i64 %x, i1 false)
@@ -132,13 +134,37 @@ define void @memset_pattern_i64_x(ptr %a, i64 %x) nounwind {
132134
define void @memset_pattern_i64_128_tbaa(ptr %a) nounwind {
133135
; CHECK-LABEL: define void @memset_pattern_i64_128_tbaa(
134136
; CHECK-SAME: ptr [[A:%.*]]) #[[ATTR0]] {
135-
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.1, i64 1024), !tbaa [[TBAA0:![0-9]+]]
137+
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.3, i64 1024), !tbaa [[TBAA0:![0-9]+]]
136138
; CHECK-NEXT: ret void
137139
;
138140
tail call void @llvm.experimental.memset.pattern(ptr %a, i64 u0x400921fb54442d18, i64 128, i1 false), !tbaa !5
139141
ret void
140142
}
141143

144+
define void @memset_pattern_i64_narrow_idx(ptr %a, i32 %x) nounwind {
145+
; CHECK-LABEL: define void @memset_pattern_i64_narrow_idx(
146+
; CHECK-SAME: ptr [[A:%.*]], i32 [[X:%.*]]) #[[ATTR0]] {
147+
; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[X]] to i64
148+
; CHECK-NEXT: [[TMP2:%.*]] = mul i64 8, [[TMP1]]
149+
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern.1, i64 [[TMP2]])
150+
; CHECK-NEXT: ret void
151+
;
152+
tail call void @llvm.experimental.memset.pattern(ptr %a, i64 u0xaaaabbbbccccdddd, i32 %x, i1 false)
153+
ret void
154+
}
155+
156+
define void @memset_pattern_i64_wide_idx(ptr %a, i128 %x) nounwind {
157+
; CHECK-LABEL: define void @memset_pattern_i64_wide_idx(
158+
; CHECK-SAME: ptr [[A:%.*]], i128 [[X:%.*]]) #[[ATTR0]] {
159+
; CHECK-NEXT: [[TMP1:%.*]] = trunc i128 [[X]] to i64
160+
; CHECK-NEXT: [[TMP2:%.*]] = mul i64 8, [[TMP1]]
161+
; CHECK-NEXT: call void @memset_pattern16(ptr [[A]], ptr @.memset_pattern, i64 [[TMP2]])
162+
; CHECK-NEXT: ret void
163+
;
164+
tail call void @llvm.experimental.memset.pattern(ptr %a, i64 u0xaaaabbbbccccdddd, i128 %x, i1 false)
165+
ret void
166+
}
167+
142168
!5 = !{!6, !6, i64 0}
143169
!6 = !{!"double", !7, i64 0}
144170
!7 = !{!"omnipotent char", !8, i64 0}

0 commit comments

Comments
 (0)