[llvm] [SimplifyCFG] Remove conservative fcmp guard from speculativelyExecuteBB (PR #211611)
Guy David via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 19 05:29:03 PDT 2026
https://github.com/guy-david updated https://github.com/llvm/llvm-project/pull/211611
>From 572b2901ff260ff312e1f550c80267bde73443c0 Mon Sep 17 00:00:00 2001
From: Guy David <guyda96 at gmail.com>
Date: Tue, 21 Jul 2026 12:38:43 -0700
Subject: [PATCH 1/3] [NFC][SimplifyCFG] Add tests
---
.../SimplifyCFG/fcmp-branch-phi-to-select.ll | 154 ++++++++++++++++++
1 file changed, 154 insertions(+)
create mode 100644 llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll
diff --git a/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll b/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll
new file mode 100644
index 0000000000000..d3202e479a45d
--- /dev/null
+++ b/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll
@@ -0,0 +1,154 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s
+
+define float @spec_fcmp_multi_pred(float %x, float %scale, i1 %other) {
+; CHECK-LABEL: @spec_fcmp_multi_pred(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br i1 [[OTHER:%.*]], label [[MERGE:%.*]], label [[CHECK:%.*]]
+; CHECK: check:
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[MERGE]]
+; CHECK: then:
+; CHECK-NEXT: [[SCALED:%.*]] = fmul float [[X]], [[SCALE:%.*]]
+; CHECK-NEXT: br label [[MERGE]]
+; CHECK: merge:
+; CHECK-NEXT: [[R:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[SCALED]], [[THEN]] ], [ 1.000000e+00, [[CHECK]] ]
+; CHECK-NEXT: ret float [[R]]
+;
+entry:
+ br i1 %other, label %merge, label %check
+
+check:
+ %cmp = fcmp ogt float %x, 0.0
+ br i1 %cmp, label %then, label %merge
+
+then:
+ %scaled = fmul float %x, %scale
+ br label %merge
+
+merge:
+ %r = phi float [ 0.0, %entry ], [ %scaled, %then ], [ 1.0, %check ]
+ ret float %r
+}
+
+define float @spec_fcmp_multi_pred_fmf(float %x, float %scale, i1 %other) {
+; CHECK-LABEL: @spec_fcmp_multi_pred_fmf(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br i1 [[OTHER:%.*]], label [[MERGE:%.*]], label [[CHECK:%.*]]
+; CHECK: check:
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[MERGE]]
+; CHECK: then:
+; CHECK-NEXT: [[ADD:%.*]] = fadd float [[X]], [[SCALE:%.*]]
+; CHECK-NEXT: br label [[MERGE]]
+; CHECK: merge:
+; CHECK-NEXT: [[R:%.*]] = phi nsz float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[ADD]], [[THEN]] ], [ 1.000000e+00, [[CHECK]] ]
+; CHECK-NEXT: ret float [[R]]
+;
+entry:
+ br i1 %other, label %merge, label %check
+
+check:
+ %cmp = fcmp ogt float %x, 0.0
+ br i1 %cmp, label %then, label %merge
+
+then:
+ %add = fadd float %x, %scale
+ br label %merge
+
+merge:
+ %r = phi nsz float [ 0.0, %entry ], [ %add, %then ], [ 1.0, %check ]
+ ret float %r
+}
+
+define double @spec_fcmp_double(double %x, double %scale, i1 %other) {
+; CHECK-LABEL: @spec_fcmp_double(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br i1 [[OTHER:%.*]], label [[MERGE:%.*]], label [[CHECK:%.*]]
+; CHECK: check:
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[MERGE]]
+; CHECK: then:
+; CHECK-NEXT: [[SCALED:%.*]] = fmul double [[X]], [[SCALE:%.*]]
+; CHECK-NEXT: br label [[MERGE]]
+; CHECK: merge:
+; CHECK-NEXT: [[R:%.*]] = phi double [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[SCALED]], [[THEN]] ], [ 1.000000e+00, [[CHECK]] ]
+; CHECK-NEXT: ret double [[R]]
+;
+entry:
+ br i1 %other, label %merge, label %check
+
+check:
+ %cmp = fcmp ogt double %x, 0.0
+ br i1 %cmp, label %then, label %merge
+
+then:
+ %scaled = fmul double %x, %scale
+ br label %merge
+
+merge:
+ %r = phi double [ 0.0, %entry ], [ %scaled, %then ], [ 1.0, %check ]
+ ret double %r
+}
+
+define float @spec_fcmp_inverted(float %x, float %scale, i1 %other) {
+; CHECK-LABEL: @spec_fcmp_inverted(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br i1 [[OTHER:%.*]], label [[MERGE:%.*]], label [[CHECK:%.*]]
+; CHECK: check:
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: br i1 [[CMP]], label [[MERGE]], label [[THEN:%.*]]
+; CHECK: then:
+; CHECK-NEXT: [[SCALED:%.*]] = fmul float [[X]], [[SCALE:%.*]]
+; CHECK-NEXT: br label [[MERGE]]
+; CHECK: merge:
+; CHECK-NEXT: [[R:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[SCALED]], [[THEN]] ], [ 1.000000e+00, [[CHECK]] ]
+; CHECK-NEXT: ret float [[R]]
+;
+entry:
+ br i1 %other, label %merge, label %check
+
+check:
+ %cmp = fcmp ogt float %x, 0.0
+ br i1 %cmp, label %merge, label %then
+
+then:
+ %scaled = fmul float %x, %scale
+ br label %merge
+
+merge:
+ %r = phi float [ 0.0, %entry ], [ %scaled, %then ], [ 1.0, %check ]
+ ret float %r
+}
+
+define float @no_fold_too_many_insts(float %x, float %scale, i1 %other) {
+; CHECK-LABEL: @no_fold_too_many_insts(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br i1 [[OTHER:%.*]], label [[MERGE:%.*]], label [[CHECK:%.*]]
+; CHECK: check:
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[MERGE]]
+; CHECK: then:
+; CHECK-NEXT: [[A:%.*]] = fmul float [[X]], [[SCALE:%.*]]
+; CHECK-NEXT: [[B:%.*]] = fmul float [[A]], [[SCALE]]
+; CHECK-NEXT: br label [[MERGE]]
+; CHECK: merge:
+; CHECK-NEXT: [[R:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ], [ 1.000000e+00, [[CHECK]] ]
+; CHECK-NEXT: ret float [[R]]
+;
+entry:
+ br i1 %other, label %merge, label %check
+
+check:
+ %cmp = fcmp ogt float %x, 0.0
+ br i1 %cmp, label %then, label %merge
+
+then:
+ %a = fmul float %x, %scale
+ %b = fmul float %a, %scale
+ br label %merge
+
+merge:
+ %r = phi float [ 0.0, %entry ], [ %b, %then ], [ 1.0, %check ]
+ ret float %r
+}
>From 02a267ac353982cf97a01c1759b226f863d2d3bb Mon Sep 17 00:00:00 2001
From: Guy David <guyda96 at gmail.com>
Date: Tue, 21 Jul 2026 12:39:42 -0700
Subject: [PATCH 2/3] [SimplifyCFG] Remove conservative fcmp guard from
speculativelyExecuteBB
Previously it rejected to perform if conversion when the condition was
an FCmpInst. That guard predated the current cost model which now takes
into consideration target-dependent knobs such as getCmpSelInstrCost()
via validateAndCostRequiredSelects.
Also propagate fast-math flags from the phi to the replacement select using
CreateSelectFMF instead of CreateSelect.
---
llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 9 +++--
.../SimplifyCFG/fcmp-branch-phi-to-select.ll | 36 +++++--------------
.../fold-branch-to-common-dest-phis.ll | 5 ++-
3 files changed, 14 insertions(+), 36 deletions(-)
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index ca6ae94a9a8d9..3702dcc6cc2a0 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -3234,11 +3234,7 @@ bool SimplifyCFGOpt::speculativelyExecuteBB(CondBrInst *BI,
if (!Options.SpeculateBlocks)
return false;
- // Be conservative for now. FP select instruction can often be expensive.
Value *BrCond = BI->getCondition();
- if (isa<FCmpInst>(BrCond))
- return false;
-
BasicBlock *BB = BI->getParent();
BasicBlock *EndBB = ThenBB->getTerminator()->getSuccessor(0);
InstructionCost Budget =
@@ -3454,7 +3450,10 @@ bool SimplifyCFGOpt::speculativelyExecuteBB(CondBrInst *BI,
Value *TrueV = ThenV, *FalseV = OrigV;
if (Invert)
std::swap(TrueV, FalseV);
- Value *V = Builder.CreateSelect(BrCond, TrueV, FalseV, "spec.select", BI);
+ // Propagate fast-math flags from the phi node to the replacement select.
+ Value *V = Builder.CreateSelectFMF(BrCond, TrueV, FalseV,
+ isa<FPMathOperator>(PN) ? &PN : nullptr,
+ "spec.select", BI);
PN.setIncomingValue(OrigI, V);
PN.setIncomingValue(ThenI, V);
}
diff --git a/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll b/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll
index d3202e479a45d..20e6eff48cb8b 100644
--- a/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll
+++ b/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll
@@ -4,15 +4,10 @@
define float @spec_fcmp_multi_pred(float %x, float %scale, i1 %other) {
; CHECK-LABEL: @spec_fcmp_multi_pred(
; CHECK-NEXT: entry:
-; CHECK-NEXT: br i1 [[OTHER:%.*]], label [[MERGE:%.*]], label [[CHECK:%.*]]
-; CHECK: check:
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[MERGE]]
-; CHECK: then:
; CHECK-NEXT: [[SCALED:%.*]] = fmul float [[X]], [[SCALE:%.*]]
-; CHECK-NEXT: br label [[MERGE]]
-; CHECK: merge:
-; CHECK-NEXT: [[R:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[SCALED]], [[THEN]] ], [ 1.000000e+00, [[CHECK]] ]
+; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[CMP]], float [[SCALED]], float 1.000000e+00
+; CHECK-NEXT: [[R:%.*]] = select i1 [[OTHER:%.*]], float 0.000000e+00, float [[SPEC_SELECT]]
; CHECK-NEXT: ret float [[R]]
;
entry:
@@ -34,15 +29,10 @@ merge:
define float @spec_fcmp_multi_pred_fmf(float %x, float %scale, i1 %other) {
; CHECK-LABEL: @spec_fcmp_multi_pred_fmf(
; CHECK-NEXT: entry:
-; CHECK-NEXT: br i1 [[OTHER:%.*]], label [[MERGE:%.*]], label [[CHECK:%.*]]
-; CHECK: check:
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[MERGE]]
-; CHECK: then:
; CHECK-NEXT: [[ADD:%.*]] = fadd float [[X]], [[SCALE:%.*]]
-; CHECK-NEXT: br label [[MERGE]]
-; CHECK: merge:
-; CHECK-NEXT: [[R:%.*]] = phi nsz float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[ADD]], [[THEN]] ], [ 1.000000e+00, [[CHECK]] ]
+; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select nsz i1 [[CMP]], float [[ADD]], float 1.000000e+00
+; CHECK-NEXT: [[R:%.*]] = select nsz i1 [[OTHER:%.*]], float 0.000000e+00, float [[SPEC_SELECT]]
; CHECK-NEXT: ret float [[R]]
;
entry:
@@ -64,15 +54,10 @@ merge:
define double @spec_fcmp_double(double %x, double %scale, i1 %other) {
; CHECK-LABEL: @spec_fcmp_double(
; CHECK-NEXT: entry:
-; CHECK-NEXT: br i1 [[OTHER:%.*]], label [[MERGE:%.*]], label [[CHECK:%.*]]
-; CHECK: check:
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[MERGE]]
-; CHECK: then:
; CHECK-NEXT: [[SCALED:%.*]] = fmul double [[X]], [[SCALE:%.*]]
-; CHECK-NEXT: br label [[MERGE]]
-; CHECK: merge:
-; CHECK-NEXT: [[R:%.*]] = phi double [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[SCALED]], [[THEN]] ], [ 1.000000e+00, [[CHECK]] ]
+; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[CMP]], double [[SCALED]], double 1.000000e+00
+; CHECK-NEXT: [[R:%.*]] = select i1 [[OTHER:%.*]], double 0.000000e+00, double [[SPEC_SELECT]]
; CHECK-NEXT: ret double [[R]]
;
entry:
@@ -94,15 +79,10 @@ merge:
define float @spec_fcmp_inverted(float %x, float %scale, i1 %other) {
; CHECK-LABEL: @spec_fcmp_inverted(
; CHECK-NEXT: entry:
-; CHECK-NEXT: br i1 [[OTHER:%.*]], label [[MERGE:%.*]], label [[CHECK:%.*]]
-; CHECK: check:
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: br i1 [[CMP]], label [[MERGE]], label [[THEN:%.*]]
-; CHECK: then:
; CHECK-NEXT: [[SCALED:%.*]] = fmul float [[X]], [[SCALE:%.*]]
-; CHECK-NEXT: br label [[MERGE]]
-; CHECK: merge:
-; CHECK-NEXT: [[R:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[SCALED]], [[THEN]] ], [ 1.000000e+00, [[CHECK]] ]
+; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[CMP]], float 1.000000e+00, float [[SCALED]]
+; CHECK-NEXT: [[R:%.*]] = select i1 [[OTHER:%.*]], float 0.000000e+00, float [[SPEC_SELECT]]
; CHECK-NEXT: ret float [[R]]
;
entry:
diff --git a/llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-phis.ll b/llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-phis.ll
index e281e9bcc5e4d..eaad45ceeb17f 100644
--- a/llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-phis.ll
+++ b/llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-phis.ll
@@ -465,12 +465,11 @@ define float @D139275_c4001580(float %val) {
; ALL-NEXT: br i1 [[CMP1]], label [[IF_END3:%.*]], label [[RETURN]]
; ALL: if.end3:
; ALL-NEXT: [[CMP4:%.*]] = fcmp olt float [[VAL]], 2.000000e-01
-; ALL-NEXT: br i1 [[CMP4]], label [[RETURN]], label [[IF_END6:%.*]]
-; ALL: if.end6:
; ALL-NEXT: [[SUB:%.*]] = fadd float [[VAL]], -1.000000e-01
+; ALL-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[CMP4]], float 0.000000e+00, float [[SUB]]
; ALL-NEXT: br label [[RETURN]]
; ALL: return:
-; ALL-NEXT: [[RETVAL_0:%.*]] = phi float [ [[SUB]], [[IF_END6]] ], [ 0.000000e+00, [[ENTRY:%.*]] ], [ 1.000000e-01, [[IF_END]] ], [ 0.000000e+00, [[IF_END3]] ]
+; ALL-NEXT: [[RETVAL_0:%.*]] = phi float [ [[SPEC_SELECT]], [[IF_END3]] ], [ 0.000000e+00, [[ENTRY:%.*]] ], [ 1.000000e-01, [[IF_END]] ]
; ALL-NEXT: ret float [[RETVAL_0]]
;
entry:
>From 59135dd6384a7e9ae290a75dd48c8071a04cd06d Mon Sep 17 00:00:00 2001
From: Guy David <guyda96 at gmail.com>
Date: Wed, 19 Aug 2026 14:13:07 +0300
Subject: [PATCH 3/3] Address comments 1
---
.../X86/fcmp-branch-phi-to-select.ll | 59 ++++++++++++++++
.../SimplifyCFG/fcmp-branch-phi-to-select.ll | 69 ++++++++++---------
2 files changed, 96 insertions(+), 32 deletions(-)
create mode 100644 llvm/test/Transforms/SimplifyCFG/X86/fcmp-branch-phi-to-select.ll
diff --git a/llvm/test/Transforms/SimplifyCFG/X86/fcmp-branch-phi-to-select.ll b/llvm/test/Transforms/SimplifyCFG/X86/fcmp-branch-phi-to-select.ll
new file mode 100644
index 0000000000000..4cf5913aba769
--- /dev/null
+++ b/llvm/test/Transforms/SimplifyCFG/X86/fcmp-branch-phi-to-select.ll
@@ -0,0 +1,59 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -mtriple=x86_64-unknown-linux-gnu -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S < %s | FileCheck %s
+
+define double @no_fold_expensive_fp_select(double %x, double %scale, i1 %other) {
+; CHECK-LABEL: define double @no_fold_expensive_fp_select(
+; CHECK-SAME: double [[X:%.*]], double [[SCALE:%.*]], i1 [[OTHER:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: br i1 [[OTHER]], label %[[MERGE:.*]], label %[[CHECK:.*]]
+; CHECK: [[CHECK]]:
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X]], 0.000000e+00
+; CHECK-NEXT: br i1 [[CMP]], label %[[THEN:.*]], label %[[MERGE]]
+; CHECK: [[THEN]]:
+; CHECK-NEXT: [[SCALED:%.*]] = fmul double [[X]], [[SCALE]]
+; CHECK-NEXT: br label %[[MERGE]]
+; CHECK: [[MERGE]]:
+; CHECK-NEXT: [[R:%.*]] = phi double [ 0.000000e+00, %[[ENTRY]] ], [ [[SCALED]], %[[THEN]] ], [ 1.000000e+00, %[[CHECK]] ]
+; CHECK-NEXT: ret double [[R]]
+;
+entry:
+ br i1 %other, label %merge, label %check
+
+check:
+ %cmp = fcmp ogt double %x, 0.0
+ br i1 %cmp, label %then, label %merge
+
+then:
+ %scaled = fmul double %x, %scale
+ br label %merge
+
+merge:
+ %r = phi double [ 0.0, %entry ], [ %scaled, %then ], [ 1.0, %check ]
+ ret double %r
+}
+
+define i64 @fold_cheap_int_select(double %x, i64 %a, i64 %b, i1 %other) {
+; CHECK-LABEL: define i64 @fold_cheap_int_select(
+; CHECK-SAME: double [[X:%.*]], i64 [[A:%.*]], i64 [[B:%.*]], i1 [[OTHER:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X]], 0.000000e+00
+; CHECK-NEXT: [[SCALED:%.*]] = mul i64 [[A]], [[B]]
+; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[CMP]], i64 [[SCALED]], i64 1
+; CHECK-NEXT: [[R:%.*]] = select i1 [[OTHER]], i64 0, i64 [[SPEC_SELECT]]
+; CHECK-NEXT: ret i64 [[R]]
+;
+entry:
+ br i1 %other, label %merge, label %check
+
+check:
+ %cmp = fcmp ogt double %x, 0.0
+ br i1 %cmp, label %then, label %merge
+
+then:
+ %scaled = mul i64 %a, %b
+ br label %merge
+
+merge:
+ %r = phi i64 [ 0, %entry ], [ %scaled, %then ], [ 1, %check ]
+ ret i64 %r
+}
diff --git a/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll b/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll
index 20e6eff48cb8b..43a721c55bb28 100644
--- a/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll
+++ b/llvm/test/Transforms/SimplifyCFG/fcmp-branch-phi-to-select.ll
@@ -1,13 +1,14 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s
define float @spec_fcmp_multi_pred(float %x, float %scale, i1 %other) {
-; CHECK-LABEL: @spec_fcmp_multi_pred(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: [[SCALED:%.*]] = fmul float [[X]], [[SCALE:%.*]]
+; CHECK-LABEL: define float @spec_fcmp_multi_pred(
+; CHECK-SAME: float [[X:%.*]], float [[SCALE:%.*]], i1 [[OTHER:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X]], 0.000000e+00
+; CHECK-NEXT: [[SCALED:%.*]] = fmul float [[X]], [[SCALE]]
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[CMP]], float [[SCALED]], float 1.000000e+00
-; CHECK-NEXT: [[R:%.*]] = select i1 [[OTHER:%.*]], float 0.000000e+00, float [[SPEC_SELECT]]
+; CHECK-NEXT: [[R:%.*]] = select i1 [[OTHER]], float 0.000000e+00, float [[SPEC_SELECT]]
; CHECK-NEXT: ret float [[R]]
;
entry:
@@ -27,12 +28,13 @@ merge:
}
define float @spec_fcmp_multi_pred_fmf(float %x, float %scale, i1 %other) {
-; CHECK-LABEL: @spec_fcmp_multi_pred_fmf(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: [[ADD:%.*]] = fadd float [[X]], [[SCALE:%.*]]
+; CHECK-LABEL: define float @spec_fcmp_multi_pred_fmf(
+; CHECK-SAME: float [[X:%.*]], float [[SCALE:%.*]], i1 [[OTHER:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X]], 0.000000e+00
+; CHECK-NEXT: [[ADD:%.*]] = fadd float [[X]], [[SCALE]]
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select nsz i1 [[CMP]], float [[ADD]], float 1.000000e+00
-; CHECK-NEXT: [[R:%.*]] = select nsz i1 [[OTHER:%.*]], float 0.000000e+00, float [[SPEC_SELECT]]
+; CHECK-NEXT: [[R:%.*]] = select nsz i1 [[OTHER]], float 0.000000e+00, float [[SPEC_SELECT]]
; CHECK-NEXT: ret float [[R]]
;
entry:
@@ -52,12 +54,13 @@ merge:
}
define double @spec_fcmp_double(double %x, double %scale, i1 %other) {
-; CHECK-LABEL: @spec_fcmp_double(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: [[SCALED:%.*]] = fmul double [[X]], [[SCALE:%.*]]
+; CHECK-LABEL: define double @spec_fcmp_double(
+; CHECK-SAME: double [[X:%.*]], double [[SCALE:%.*]], i1 [[OTHER:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X]], 0.000000e+00
+; CHECK-NEXT: [[SCALED:%.*]] = fmul double [[X]], [[SCALE]]
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[CMP]], double [[SCALED]], double 1.000000e+00
-; CHECK-NEXT: [[R:%.*]] = select i1 [[OTHER:%.*]], double 0.000000e+00, double [[SPEC_SELECT]]
+; CHECK-NEXT: [[R:%.*]] = select i1 [[OTHER]], double 0.000000e+00, double [[SPEC_SELECT]]
; CHECK-NEXT: ret double [[R]]
;
entry:
@@ -77,12 +80,13 @@ merge:
}
define float @spec_fcmp_inverted(float %x, float %scale, i1 %other) {
-; CHECK-LABEL: @spec_fcmp_inverted(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: [[SCALED:%.*]] = fmul float [[X]], [[SCALE:%.*]]
+; CHECK-LABEL: define float @spec_fcmp_inverted(
+; CHECK-SAME: float [[X:%.*]], float [[SCALE:%.*]], i1 [[OTHER:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X]], 0.000000e+00
+; CHECK-NEXT: [[SCALED:%.*]] = fmul float [[X]], [[SCALE]]
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[CMP]], float 1.000000e+00, float [[SCALED]]
-; CHECK-NEXT: [[R:%.*]] = select i1 [[OTHER:%.*]], float 0.000000e+00, float [[SPEC_SELECT]]
+; CHECK-NEXT: [[R:%.*]] = select i1 [[OTHER]], float 0.000000e+00, float [[SPEC_SELECT]]
; CHECK-NEXT: ret float [[R]]
;
entry:
@@ -102,18 +106,19 @@ merge:
}
define float @no_fold_too_many_insts(float %x, float %scale, i1 %other) {
-; CHECK-LABEL: @no_fold_too_many_insts(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: br i1 [[OTHER:%.*]], label [[MERGE:%.*]], label [[CHECK:%.*]]
-; CHECK: check:
-; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[MERGE]]
-; CHECK: then:
-; CHECK-NEXT: [[A:%.*]] = fmul float [[X]], [[SCALE:%.*]]
+; CHECK-LABEL: define float @no_fold_too_many_insts(
+; CHECK-SAME: float [[X:%.*]], float [[SCALE:%.*]], i1 [[OTHER:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: br i1 [[OTHER]], label %[[MERGE:.*]], label %[[CHECK:.*]]
+; CHECK: [[CHECK]]:
+; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X]], 0.000000e+00
+; CHECK-NEXT: br i1 [[CMP]], label %[[THEN:.*]], label %[[MERGE]]
+; CHECK: [[THEN]]:
+; CHECK-NEXT: [[A:%.*]] = fmul float [[X]], [[SCALE]]
; CHECK-NEXT: [[B:%.*]] = fmul float [[A]], [[SCALE]]
-; CHECK-NEXT: br label [[MERGE]]
-; CHECK: merge:
-; CHECK-NEXT: [[R:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[B]], [[THEN]] ], [ 1.000000e+00, [[CHECK]] ]
+; CHECK-NEXT: br label %[[MERGE]]
+; CHECK: [[MERGE]]:
+; CHECK-NEXT: [[R:%.*]] = phi float [ 0.000000e+00, %[[ENTRY]] ], [ [[B]], %[[THEN]] ], [ 1.000000e+00, %[[CHECK]] ]
; CHECK-NEXT: ret float [[R]]
;
entry:
More information about the llvm-commits
mailing list