[llvm] 144bdf3 - [VPlan] Also check if plan for best legacy VF contains simplifications.
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 8 12:53:30 PST 2024
Author: Florian Hahn
Date: 2024-11-08T20:53:03Z
New Revision: 144bdf3eb7128518ed162c5a168e3ec90922cd9e
URL: https://github.com/llvm/llvm-project/commit/144bdf3eb7128518ed162c5a168e3ec90922cd9e
DIFF: https://github.com/llvm/llvm-project/commit/144bdf3eb7128518ed162c5a168e3ec90922cd9e.diff
LOG: [VPlan] Also check if plan for best legacy VF contains simplifications.
The plan for the VF chosen by the legacy cost model could also contain
additional simplifications that cause cost differences. Also check if it
contains simplifications.
Fixes https://github.com/llvm/llvm-project/issues/114860.
Added:
llvm/test/Transforms/LoopVectorize/RISCV/select-invariant-cond-cost.ll
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index c07af8519049c4..82d85b112397f3 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -7521,6 +7521,8 @@ VectorizationFactor LoopVectorizationPlanner::computeBestVF() {
precomputeCosts(BestPlan, BestFactor.Width, CostCtx);
assert((BestFactor.Width == LegacyVF.Width ||
planContainsAdditionalSimplifications(getPlanFor(BestFactor.Width),
+ CostCtx, OrigLoop) ||
+ planContainsAdditionalSimplifications(getPlanFor(LegacyVF.Width),
CostCtx, OrigLoop)) &&
" VPlan cost model and legacy cost model disagreed");
assert((BestFactor.Width.isScalar() || BestFactor.ScalarCost > 0) &&
diff --git a/llvm/test/Transforms/LoopVectorize/RISCV/select-invariant-cond-cost.ll b/llvm/test/Transforms/LoopVectorize/RISCV/select-invariant-cond-cost.ll
new file mode 100644
index 00000000000000..8df8e0725e3fd3
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/RISCV/select-invariant-cond-cost.ll
@@ -0,0 +1,49 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -p loop-vectorize -S %s | FileCheck %s
+
+target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
+target triple = "riscv64-unknown-linux-gnu"
+
+; Test for https://github.com/llvm/llvm-project/issues/114860.
+define void @test_invariant_cond_for_select(ptr %dst, i8 %x) #0 {
+; CHECK-LABEL: define void @test_invariant_cond_for_select(
+; CHECK-SAME: ptr [[DST:%.*]], i8 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
+; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[X]], 0
+; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i64 [[IV]], 0
+; CHECK-NEXT: [[C_2_EXT:%.*]] = zext i1 [[C_2]] to i64
+; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C_1]], i64 [[C_2_EXT]], i64 0
+; CHECK-NEXT: [[SEL_TRUNC:%.*]] = trunc i64 [[SEL]] to i8
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[IV]]
+; CHECK-NEXT: store i8 [[SEL_TRUNC]], ptr [[GEP]], align 1
+; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 4
+; CHECK-NEXT: [[EC:%.*]] = icmp ult i64 [[IV]], 14
+; CHECK-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[EXIT:.*]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br label %loop
+
+loop:
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %c.1 = icmp eq i8 %x, 0
+ %c.2 = icmp sgt i64 %iv, 0
+ %c.2.ext = zext i1 %c.2 to i64
+ %sel = select i1 %c.1, i64 %c.2.ext, i64 0
+ %sel.trunc = trunc i64 %sel to i8
+ %gep = getelementptr inbounds i8, ptr %dst, i64 %iv
+ store i8 %sel.trunc, ptr %gep, align 1
+ %iv.next = add i64 %iv, 4
+ %ec = icmp ult i64 %iv, 14
+ br i1 %ec, label %loop, label %exit
+
+exit:
+ ret void
+}
+
+attributes #0 = { "target-features"="+64bit,+v" }
+
More information about the llvm-commits
mailing list