[llvm] 79a1823 - [SLP]Make stricter check for instructions that do not require
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 21 09:29:22 PDT 2022
Thanks for the fix.
On 3/21/22 06:10, Alexey Bataev via llvm-commits wrote:
> Author: Alexey Bataev
> Date: 2022-03-21T06:09:12-07:00
> New Revision: 79a182371e469d5d1bfc361845244dfacb77133c
>
> URL: https://github.com/llvm/llvm-project/commit/79a182371e469d5d1bfc361845244dfacb77133c
> DIFF: https://github.com/llvm/llvm-project/commit/79a182371e469d5d1bfc361845244dfacb77133c.diff
>
> LOG: [SLP]Make stricter check for instructions that do not require
> scheduling.
>
> Need to check that the instructions with external operands can be
> reordered safely before actualy exclude them from the scheduling.
>
> Added:
>
>
> Modified:
> llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
> llvm/test/Transforms/SLPVectorizer/X86/control-dependence.ll
>
> Removed:
>
>
>
> ################################################################################
> diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
> index f8fe9a6ce4ad0..cfe50fc5a140d 100644
> --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
> +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
> @@ -778,7 +778,7 @@ static bool areAllOperandsNonInsts(Value *V) {
> auto *I = dyn_cast<Instruction>(V);
> if (!I)
> return true;
> - return !I->mayReadOrWriteMemory() && all_of(I->operands(), [I](Value *V) {
> + return !mayBeMemoryDependent(*I) && all_of(I->operands(), [I](Value *V) {
This looks correct, but wow that is an amazingly badly named function.
I'm going to add a separate change to clarify this handles both memory
and control dependence.
> auto *IO = dyn_cast<Instruction>(V);
> if (!IO)
> return true;
>
> diff --git a/llvm/test/Transforms/SLPVectorizer/X86/control-dependence.ll b/llvm/test/Transforms/SLPVectorizer/X86/control-dependence.ll
> index 69f8577169df4..66adf75547b1b 100644
> --- a/llvm/test/Transforms/SLPVectorizer/X86/control-dependence.ll
> +++ b/llvm/test/Transforms/SLPVectorizer/X86/control-dependence.ll
> @@ -381,19 +381,19 @@ define void @test10(i64* %a, i64* %b, i64* %c) {
> ; FIXME: This is wrong, we're hoisting a faulting udiv above an infinite loop.
> define void @test11(i64 %x, i64 %y, i64* %b, i64* %c) {
> ; CHECK-LABEL: @test11(
> -; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> poison, i64 [[X:%.*]], i32 0
> -; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> [[TMP1]], i64 [[Y:%.*]], i32 1
> -; CHECK-NEXT: [[TMP3:%.*]] = udiv <2 x i64> <i64 200, i64 200>, [[TMP2]]
> -; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i64> [[TMP3]], i32 0
> -; CHECK-NEXT: store i64 [[TMP4]], i64* [[B:%.*]], align 4
> -; CHECK-NEXT: [[TMP5:%.*]] = call i64 @may_inf_loop_ro()
> +; CHECK-NEXT: [[U1:%.*]] = udiv i64 200, [[X:%.*]]
> +; CHECK-NEXT: store i64 [[U1]], i64* [[B:%.*]], align 4
> +; CHECK-NEXT: [[TMP1:%.*]] = call i64 @may_inf_loop_ro()
> +; CHECK-NEXT: [[U2:%.*]] = udiv i64 200, [[Y:%.*]]
> ; CHECK-NEXT: [[CA2:%.*]] = getelementptr i64, i64* [[C:%.*]], i32 1
> -; CHECK-NEXT: [[TMP6:%.*]] = bitcast i64* [[C]] to <2 x i64>*
> -; CHECK-NEXT: [[TMP7:%.*]] = load <2 x i64>, <2 x i64>* [[TMP6]], align 4
> -; CHECK-NEXT: [[TMP8:%.*]] = add <2 x i64> [[TMP3]], [[TMP7]]
> +; CHECK-NEXT: [[TMP2:%.*]] = bitcast i64* [[C]] to <2 x i64>*
> +; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, <2 x i64>* [[TMP2]], align 4
> +; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x i64> poison, i64 [[U1]], i32 0
> +; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> [[TMP4]], i64 [[U2]], i32 1
> +; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i64> [[TMP5]], [[TMP3]]
> ; CHECK-NEXT: [[B2:%.*]] = getelementptr i64, i64* [[B]], i32 1
> -; CHECK-NEXT: [[TMP9:%.*]] = bitcast i64* [[B]] to <2 x i64>*
> -; CHECK-NEXT: store <2 x i64> [[TMP8]], <2 x i64>* [[TMP9]], align 4
> +; CHECK-NEXT: [[TMP7:%.*]] = bitcast i64* [[B]] to <2 x i64>*
> +; CHECK-NEXT: store <2 x i64> [[TMP6]], <2 x i64>* [[TMP7]], align 4
> ; CHECK-NEXT: ret void
> ;
> %u1 = udiv i64 200, %x
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list