[llvm] [RISCV] Add FeaturePredictableSelectIsExpensive (PR #97708)
Pengcheng Wang via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 4 19:58:00 PDT 2024
https://github.com/wangpc-pp updated https://github.com/llvm/llvm-project/pull/97708
>From 1283fd013a372592bf79b1f6a6145a5ccaa4d39b Mon Sep 17 00:00:00 2001
From: Wang Pengcheng <wangpengcheng.pp at bytedance.com>
Date: Thu, 4 Jul 2024 18:24:48 +0800
Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?=
=?UTF-8?q?itial=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.6-beta.1
---
llvm/lib/Target/RISCV/RISCVFeatures.td | 4 ++
llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 5 ++
...ert-highly-predictable-select-to-branch.ll | 50 +++++++++++++++++++
3 files changed, 59 insertions(+)
create mode 100644 llvm/test/CodeGen/RISCV/convert-highly-predictable-select-to-branch.ll
diff --git a/llvm/lib/Target/RISCV/RISCVFeatures.td b/llvm/lib/Target/RISCV/RISCVFeatures.td
index 7b3057b187d5ed..5276e75c136c2a 100644
--- a/llvm/lib/Target/RISCV/RISCVFeatures.td
+++ b/llvm/lib/Target/RISCV/RISCVFeatures.td
@@ -1262,6 +1262,10 @@ def FeatureUnalignedVectorMem
def FeaturePostRAScheduler : SubtargetFeature<"use-postra-scheduler",
"UsePostRAScheduler", "true", "Schedule again after register allocation">;
+def FeaturePredictableSelectIsExpensive
+ : SubtargetFeature<"predictable-select-expensive", "IsPredictableSelectExpensive", "true",
+ "Prefer likely predicted branches over selects">;
+
def TuneNoOptimizedZeroStrideLoad
: SubtargetFeature<"no-optimized-zero-stride-load", "HasOptimizedZeroStrideLoad",
"false", "Hasn't optimized (perform fewer memory operations)"
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 45368a01a0a73e..05d91a283b41a9 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -1518,6 +1518,11 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
// Disable strict node mutation.
IsStrictFPEnabled = true;
+
+ // Let the subtarget decide if a predictable select is more expensive than the
+ // corresponding branch. This information is used in CGP/SelectOpt to decide
+ // when to convert selects into branches.
+ PredictableSelectIsExpensive = Subtarget.isPredictableSelectExpensive();
}
EVT RISCVTargetLowering::getSetCCResultType(const DataLayout &DL,
diff --git a/llvm/test/CodeGen/RISCV/convert-highly-predictable-select-to-branch.ll b/llvm/test/CodeGen/RISCV/convert-highly-predictable-select-to-branch.ll
new file mode 100644
index 00000000000000..1abd774d7a4874
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/convert-highly-predictable-select-to-branch.ll
@@ -0,0 +1,50 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=riscv64 -mattr=+zicond < %s | FileCheck %s --check-prefixes=CHECK,CHEAP
+; RUN: llc -mtriple=riscv64 -mattr=+zicond,+predictable-select-expensive < %s | FileCheck %s --check-prefixes=CHECK,EXPENSIVE
+
+; Test has not predictable select, which should not be transformed to a branch
+define i32 @test1(i32 %a) {
+; CHECK-LABEL: test1:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: sext.w a1, a0
+; CHECK-NEXT: slti a1, a1, 1
+; CHECK-NEXT: addiw a0, a0, -1
+; CHECK-NEXT: czero.nez a0, a0, a1
+; CHECK-NEXT: ret
+entry:
+ %cmp = icmp slt i32 %a, 1
+ %dec = sub i32 %a, 1
+ %res = select i1 %cmp, i32 0, i32 %dec, !prof !0
+ ret i32 %res
+}
+
+; Test has highly predictable select according to profile data,
+; which should be transformed to a branch on cores with enabled FeaturePredictableSelectIsExpensive
+define i32 @test2(i32 %a) {
+; CHEAP-LABEL: test2:
+; CHEAP: # %bb.0: # %entry
+; CHEAP-NEXT: sext.w a1, a0
+; CHEAP-NEXT: slti a1, a1, 1
+; CHEAP-NEXT: addiw a0, a0, -1
+; CHEAP-NEXT: czero.nez a0, a0, a1
+; CHEAP-NEXT: ret
+;
+; EXPENSIVE-LABEL: test2:
+; EXPENSIVE: # %bb.0: # %entry
+; EXPENSIVE-NEXT: sext.w a1, a0
+; EXPENSIVE-NEXT: blez a1, .LBB1_2
+; EXPENSIVE-NEXT: # %bb.1: # %select.false
+; EXPENSIVE-NEXT: addiw a0, a0, -1
+; EXPENSIVE-NEXT: ret
+; EXPENSIVE-NEXT: .LBB1_2:
+; EXPENSIVE-NEXT: li a0, 0
+; EXPENSIVE-NEXT: ret
+entry:
+ %cmp = icmp slt i32 %a, 1
+ %dec = sub i32 %a, 1
+ %res = select i1 %cmp, i32 0, i32 %dec, !prof !1
+ ret i32 %res
+}
+
+!0 = !{!"branch_weights", i32 1, i32 1}
+!1 = !{!"branch_weights", i32 1, i32 1000}
>From 64312ac1f69b7285ac030da3e285a148d9917a8b Mon Sep 17 00:00:00 2001
From: Wang Pengcheng <wangpengcheng.pp at bytedance.com>
Date: Fri, 5 Jul 2024 10:57:49 +0800
Subject: [PATCH 2/2] Rename flag to PredictableSelectIsExpensive
Created using spr 1.3.6-beta.1
---
llvm/lib/Target/RISCV/RISCVFeatures.td | 2 +-
llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVFeatures.td b/llvm/lib/Target/RISCV/RISCVFeatures.td
index 5276e75c136c2a..697a22b30dfcca 100644
--- a/llvm/lib/Target/RISCV/RISCVFeatures.td
+++ b/llvm/lib/Target/RISCV/RISCVFeatures.td
@@ -1263,7 +1263,7 @@ def FeaturePostRAScheduler : SubtargetFeature<"use-postra-scheduler",
"UsePostRAScheduler", "true", "Schedule again after register allocation">;
def FeaturePredictableSelectIsExpensive
- : SubtargetFeature<"predictable-select-expensive", "IsPredictableSelectExpensive", "true",
+ : SubtargetFeature<"predictable-select-expensive", "PredictableSelectIsExpensive", "true",
"Prefer likely predicted branches over selects">;
def TuneNoOptimizedZeroStrideLoad
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 05d91a283b41a9..bef8cf59f07b7b 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -1522,7 +1522,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
// Let the subtarget decide if a predictable select is more expensive than the
// corresponding branch. This information is used in CGP/SelectOpt to decide
// when to convert selects into branches.
- PredictableSelectIsExpensive = Subtarget.isPredictableSelectExpensive();
+ PredictableSelectIsExpensive = Subtarget.predictableSelectIsExpensive();
}
EVT RISCVTargetLowering::getSetCCResultType(const DataLayout &DL,
More information about the llvm-commits
mailing list