mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-14 17:06:38 +00:00
[LAA] Make sure MaxVF for Store-Load forward safe dep distances is pow2.
MaxVF computed in couldPreventStoreLoadFowrard may not be a power of 2, as CommonStride may not be a power-of-2. This can cause crashes after 78777a20. Use bit_floor to make sure it is a suitable power-of-2. Fixes https://github.com/llvm/llvm-project/issues/134696.
This commit is contained in:
parent
b71123f127
commit
995fd47944
@ -1781,7 +1781,8 @@ bool MemoryDepChecker::couldPreventStoreLoadForward(uint64_t Distance,
|
||||
MaxStoreLoadForwardSafeDistanceInBits &&
|
||||
MaxVFWithoutSLForwardIssuesPowerOf2 !=
|
||||
VectorizerParams::MaxVectorWidth * TypeByteSize) {
|
||||
uint64_t MaxVF = MaxVFWithoutSLForwardIssuesPowerOf2 / CommonStride;
|
||||
uint64_t MaxVF =
|
||||
bit_floor(MaxVFWithoutSLForwardIssuesPowerOf2 / CommonStride);
|
||||
uint64_t MaxVFInBits = MaxVF * TypeByteSize * 8;
|
||||
MaxStoreLoadForwardSafeDistanceInBits =
|
||||
std::min(MaxStoreLoadForwardSafeDistanceInBits, MaxVFInBits);
|
||||
|
@ -256,3 +256,66 @@ loop:
|
||||
exit:
|
||||
ret void
|
||||
}
|
||||
|
||||
@a = external global [10 x [12 x i16]]
|
||||
|
||||
; Test case for https://github.com/llvm/llvm-project/issues/134696.
|
||||
define void @safe_load_store_distance_not_pow_of_2(i64 %N) {
|
||||
; CHECK-LABEL: @safe_load_store_distance_not_pow_of_2(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[N:%.*]], i64 1)
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[N]], [[UMIN]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = udiv i64 [[TMP0]], 3
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[UMIN]], [[TMP1]]
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[TMP2]], 1
|
||||
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ule i64 [[TMP3]], 8
|
||||
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
|
||||
; CHECK: vector.ph:
|
||||
; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP3]], 8
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[N_MOD_VF]], 0
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP4]], i64 8, i64 [[N_MOD_VF]]
|
||||
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP3]], [[TMP5]]
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = mul i64 [[N_VEC]], 3
|
||||
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
|
||||
; CHECK: vector.body:
|
||||
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
|
||||
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <8 x i64> [ <i64 0, i64 3, i64 6, i64 9, i64 12, i64 15, i64 18, i64 21>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr [10 x [12 x i16]], ptr @a, i64 0, i64 8, <8 x i64> [[VEC_IND]]
|
||||
; CHECK-NEXT: call void @llvm.masked.scatter.v8i16.v8p0(<8 x i16> zeroinitializer, <8 x ptr> [[TMP7]], i32 2, <8 x i1> splat (i1 true))
|
||||
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
|
||||
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <8 x i64> [[VEC_IND]], splat (i64 24)
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
|
||||
; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
|
||||
; CHECK: middle.block:
|
||||
; CHECK-NEXT: br label [[SCALAR_PH]]
|
||||
; CHECK: scalar.ph:
|
||||
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[TMP6]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: br label [[LOOP:%.*]]
|
||||
; CHECK: loop:
|
||||
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
|
||||
; CHECK-NEXT: [[GEP:%.*]] = getelementptr [10 x [12 x i16]], ptr @a, i64 0, i64 0, i64 [[IV]]
|
||||
; CHECK-NEXT: [[TMP9:%.*]] = load i16, ptr [[GEP]], align 2
|
||||
; CHECK-NEXT: [[GEP_OFF:%.*]] = getelementptr [10 x [12 x i16]], ptr @a, i64 0, i64 8, i64 [[IV]]
|
||||
; CHECK-NEXT: store i16 0, ptr [[GEP_OFF]], align 2
|
||||
; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 3
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IV]], [[N]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT:%.*]], !llvm.loop [[LOOP11:![0-9]+]]
|
||||
; CHECK: exit:
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
entry:
|
||||
br label %loop
|
||||
|
||||
loop:
|
||||
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
|
||||
%gep = getelementptr [10 x [12 x i16]], ptr @a, i64 0, i64 0, i64 %iv
|
||||
%1 = load i16, ptr %gep, align 2
|
||||
%gep.off = getelementptr [10 x [12 x i16]], ptr @a, i64 0, i64 8, i64 %iv
|
||||
store i16 0, ptr %gep.off, align 2
|
||||
%iv.next = add nsw i64 %iv, 3
|
||||
%cmp = icmp ult i64 %iv, %N
|
||||
br i1 %cmp, label %loop, label %exit
|
||||
|
||||
exit:
|
||||
ret void
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user