[llvm] [InstCombine] Do not use operand info in `replaceInInstruction` (PR #99492)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 21 07:53:47 PDT 2024
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/99492
>From 3ecf0765803455928ad3397566d59dcd4a9b5442 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 18 Jul 2024 22:23:58 +0800
Subject: [PATCH 1/5] [InstCombine] Add pre-commit tests. NFC.
---
.../Transforms/InstCombine/select-binop-cmp.ll | 13 +++++++++++++
llvm/test/Transforms/InstCombine/select.ll | 16 ++++++++++++++++
2 files changed, 29 insertions(+)
diff --git a/llvm/test/Transforms/InstCombine/select-binop-cmp.ll b/llvm/test/Transforms/InstCombine/select-binop-cmp.ll
index 1fa0c09a9e987..fb56764598e2d 100644
--- a/llvm/test/Transforms/InstCombine/select-binop-cmp.ll
+++ b/llvm/test/Transforms/InstCombine/select-binop-cmp.ll
@@ -1315,6 +1315,19 @@ define i32 @select_replace_call_speculatable(i32 %x, i32 %y) {
ret i32 %s
}
+define i32 @select_replace_call_speculatable_intrinsic(i32 %x, i32 %y) {
+; CHECK-LABEL: @select_replace_call_speculatable_intrinsic(
+; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], 0
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.smax.i32(i32 [[Y:%.*]], i32 0)
+; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 [[CALL]], i32 [[Y]]
+; CHECK-NEXT: ret i32 [[S]]
+;
+ %c = icmp eq i32 %x, 0
+ %call = call i32 @llvm.smax.i32(i32 %x, i32 %y)
+ %s = select i1 %c, i32 %call, i32 %y
+ ret i32 %s
+}
+
; We can't replace the call arguments, as the call is not speculatable. We
; may end up changing side-effects or causing undefined behavior.
define i32 @select_replace_call_non_speculatable(i32 %x, i32 %y) {
diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll
index d66ffb9a63ac1..4f20b9d5d795d 100644
--- a/llvm/test/Transforms/InstCombine/select.ll
+++ b/llvm/test/Transforms/InstCombine/select.ll
@@ -4713,3 +4713,19 @@ define i8 @select_knownbits_simplify_missing_noundef(i8 %x) {
%res = select i1 %cmp, i8 %and, i8 0
ret i8 %res
}
+
+ at g_ext = external global i8
+
+; Make sure we don't replace %ptr with @g_ext, which may cause the load to trigger UB.
+define i32 @pr99436(ptr align 4 dereferenceable(4) %ptr) {
+; CHECK-LABEL: @pr99436(
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[PTR:%.*]], @g_ext
+; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr @g_ext, align 4
+; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[VAL]], i32 0
+; CHECK-NEXT: ret i32 [[RET]]
+;
+ %cmp = icmp eq ptr %ptr, @g_ext
+ %val = load i32, ptr %ptr, align 4
+ %ret = select i1 %cmp, i32 %val, i32 0
+ ret i32 %ret
+}
>From 4d557fd4a2cdc4dacb5be76179739208363c3fd3 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 18 Jul 2024 22:28:12 +0800
Subject: [PATCH 2/5] [InstCombine] Do not use operand info in
`replaceInInstruction`
---
llvm/include/llvm/Analysis/ValueTracking.h | 26 +++++++++++++------
llvm/lib/Analysis/ValueTracking.cpp | 21 ++++++++++-----
.../InstCombine/InstCombineSelect.cpp | 3 ++-
.../InstCombine/select-binop-cmp.ll | 2 +-
llvm/test/Transforms/InstCombine/select.ll | 2 +-
5 files changed, 37 insertions(+), 17 deletions(-)
diff --git a/llvm/include/llvm/Analysis/ValueTracking.h b/llvm/include/llvm/Analysis/ValueTracking.h
index 2c2f965a3cd6f..63ff2fe6341d5 100644
--- a/llvm/include/llvm/Analysis/ValueTracking.h
+++ b/llvm/include/llvm/Analysis/ValueTracking.h
@@ -822,15 +822,25 @@ bool isSafeToSpeculativelyExecute(const Instruction *I,
const Instruction *CtxI = nullptr,
AssumptionCache *AC = nullptr,
const DominatorTree *DT = nullptr,
- const TargetLibraryInfo *TLI = nullptr);
+ const TargetLibraryInfo *TLI = nullptr,
+ bool UseOperandInfo = true);
+
+inline bool isSafeToSpeculativelyExecute(const Instruction *I,
+ BasicBlock::iterator CtxI,
+ AssumptionCache *AC = nullptr,
+ const DominatorTree *DT = nullptr,
+ const TargetLibraryInfo *TLI = nullptr,
+ bool UseOperandInfo = true) {
+ // Take an iterator, and unwrap it into an Instruction *.
+ return isSafeToSpeculativelyExecute(I, &*CtxI, AC, DT, TLI, UseOperandInfo);
+}
+/// Don't use information from its operands. This helper is used when its
+/// operands are going to be replaced.
inline bool
-isSafeToSpeculativelyExecute(const Instruction *I, BasicBlock::iterator CtxI,
- AssumptionCache *AC = nullptr,
- const DominatorTree *DT = nullptr,
- const TargetLibraryInfo *TLI = nullptr) {
- // Take an iterator, and unwrap it into an Instruction *.
- return isSafeToSpeculativelyExecute(I, &*CtxI, AC, DT, TLI);
+isSafeToSpeculativelyExecuteWithOperandsReplaced(const Instruction *I) {
+ return isSafeToSpeculativelyExecute(I, nullptr, nullptr, nullptr, nullptr,
+ /*UseOperandInfo=*/false);
}
/// This returns the same result as isSafeToSpeculativelyExecute if Opcode is
@@ -853,7 +863,7 @@ isSafeToSpeculativelyExecute(const Instruction *I, BasicBlock::iterator CtxI,
bool isSafeToSpeculativelyExecuteWithOpcode(
unsigned Opcode, const Instruction *Inst, const Instruction *CtxI = nullptr,
AssumptionCache *AC = nullptr, const DominatorTree *DT = nullptr,
- const TargetLibraryInfo *TLI = nullptr);
+ const TargetLibraryInfo *TLI = nullptr, bool UseInstrInfo = true);
/// Returns true if the result or effects of the given instructions \p I
/// depend values not reachable through the def use graph.
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 535a248a5f1a2..f56afa91f1f9a 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -6760,15 +6760,16 @@ bool llvm::isSafeToSpeculativelyExecute(const Instruction *Inst,
const Instruction *CtxI,
AssumptionCache *AC,
const DominatorTree *DT,
- const TargetLibraryInfo *TLI) {
+ const TargetLibraryInfo *TLI,
+ bool UseOperandInfo) {
return isSafeToSpeculativelyExecuteWithOpcode(Inst->getOpcode(), Inst, CtxI,
- AC, DT, TLI);
+ AC, DT, TLI, UseOperandInfo);
}
bool llvm::isSafeToSpeculativelyExecuteWithOpcode(
unsigned Opcode, const Instruction *Inst, const Instruction *CtxI,
- AssumptionCache *AC, const DominatorTree *DT,
- const TargetLibraryInfo *TLI) {
+ AssumptionCache *AC, const DominatorTree *DT, const TargetLibraryInfo *TLI,
+ bool UseOperandInfo) {
#ifndef NDEBUG
if (Inst->getOpcode() != Opcode) {
// Check that the operands are actually compatible with the Opcode override.
@@ -6796,12 +6797,15 @@ bool llvm::isSafeToSpeculativelyExecuteWithOpcode(
case Instruction::URem: {
// x / y is undefined if y == 0.
const APInt *V;
- if (match(Inst->getOperand(1), m_APInt(V)))
+ if (UseOperandInfo && match(Inst->getOperand(1), m_APInt(V)))
return *V != 0;
return false;
}
case Instruction::SDiv:
case Instruction::SRem: {
+ if (!UseOperandInfo)
+ return false;
+
// x / y is undefined if y == 0 or x == INT_MIN and y == -1
const APInt *Numerator, *Denominator;
if (!match(Inst->getOperand(1), m_APInt(Denominator)))
@@ -6820,6 +6824,9 @@ bool llvm::isSafeToSpeculativelyExecuteWithOpcode(
return false;
}
case Instruction::Load: {
+ if (!UseOperandInfo)
+ return false;
+
const LoadInst *LI = dyn_cast<LoadInst>(Inst);
if (!LI)
return false;
@@ -6838,7 +6845,9 @@ bool llvm::isSafeToSpeculativelyExecuteWithOpcode(
// The called function could have undefined behavior or side-effects, even
// if marked readnone nounwind.
- return Callee && Callee->isSpeculatable();
+ // NOTE: Intrinsic cannot be replaced.
+ return Callee && Callee->isSpeculatable() &&
+ (UseOperandInfo || Callee->isIntrinsic());
}
case Instruction::VAArg:
case Instruction::Alloca:
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index e387034110df9..bfae0e9c1393e 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -1248,7 +1248,8 @@ bool InstCombinerImpl::replaceInInstruction(Value *V, Value *Old, Value *New,
return false;
auto *I = dyn_cast<Instruction>(V);
- if (!I || !I->hasOneUse() || !isSafeToSpeculativelyExecute(I))
+ if (!I || !I->hasOneUse() ||
+ !isSafeToSpeculativelyExecuteWithOperandsReplaced(I))
return false;
bool Changed = false;
diff --git a/llvm/test/Transforms/InstCombine/select-binop-cmp.ll b/llvm/test/Transforms/InstCombine/select-binop-cmp.ll
index fb56764598e2d..f71159970b150 100644
--- a/llvm/test/Transforms/InstCombine/select-binop-cmp.ll
+++ b/llvm/test/Transforms/InstCombine/select-binop-cmp.ll
@@ -1305,7 +1305,7 @@ define <2 x i32> @select_replace_undef(<2 x i32> %x, <2 x i32> %y) {
define i32 @select_replace_call_speculatable(i32 %x, i32 %y) {
; CHECK-LABEL: @select_replace_call_speculatable(
; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], 0
-; CHECK-NEXT: [[CALL:%.*]] = call i32 @call_speculatable(i32 0, i32 0)
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @call_speculatable(i32 [[X]], i32 [[X]])
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 [[CALL]], i32 [[Y:%.*]]
; CHECK-NEXT: ret i32 [[S]]
;
diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll
index 4f20b9d5d795d..1369be305ec13 100644
--- a/llvm/test/Transforms/InstCombine/select.ll
+++ b/llvm/test/Transforms/InstCombine/select.ll
@@ -4720,7 +4720,7 @@ define i8 @select_knownbits_simplify_missing_noundef(i8 %x) {
define i32 @pr99436(ptr align 4 dereferenceable(4) %ptr) {
; CHECK-LABEL: @pr99436(
; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[PTR:%.*]], @g_ext
-; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr @g_ext, align 4
+; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
; CHECK-NEXT: [[RET:%.*]] = select i1 [[CMP]], i32 [[VAL]], i32 0
; CHECK-NEXT: ret i32 [[RET]]
;
>From 556c50adb2a651b1ee967badc224a1d611e8a370 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw at qq.com>
Date: Thu, 18 Jul 2024 22:43:46 +0800
Subject: [PATCH 3/5] Update llvm/include/llvm/Analysis/ValueTracking.h
Co-authored-by: Nikita Popov <github at npopov.com>
---
llvm/include/llvm/Analysis/ValueTracking.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/Analysis/ValueTracking.h b/llvm/include/llvm/Analysis/ValueTracking.h
index 63ff2fe6341d5..6c3d8df7db780 100644
--- a/llvm/include/llvm/Analysis/ValueTracking.h
+++ b/llvm/include/llvm/Analysis/ValueTracking.h
@@ -863,7 +863,7 @@ isSafeToSpeculativelyExecuteWithOperandsReplaced(const Instruction *I) {
bool isSafeToSpeculativelyExecuteWithOpcode(
unsigned Opcode, const Instruction *Inst, const Instruction *CtxI = nullptr,
AssumptionCache *AC = nullptr, const DominatorTree *DT = nullptr,
- const TargetLibraryInfo *TLI = nullptr, bool UseInstrInfo = true);
+ const TargetLibraryInfo *TLI = nullptr, bool UseOperandInfo = true);
/// Returns true if the result or effects of the given instructions \p I
/// depend values not reachable through the def use graph.
>From bc4eee1ae9d24a9e84fd8d7193ae8fc898780283 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Fri, 19 Jul 2024 01:00:08 +0800
Subject: [PATCH 4/5] [InstCombine] Don't replace constant exprs
---
llvm/include/llvm/Analysis/ValueTracking.h | 4 ++--
llvm/lib/Analysis/ValueTracking.cpp | 9 ++-------
llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp | 4 +++-
llvm/test/Transforms/InstCombine/select-binop-cmp.ll | 2 +-
4 files changed, 8 insertions(+), 11 deletions(-)
diff --git a/llvm/include/llvm/Analysis/ValueTracking.h b/llvm/include/llvm/Analysis/ValueTracking.h
index 6c3d8df7db780..596dc8a487d21 100644
--- a/llvm/include/llvm/Analysis/ValueTracking.h
+++ b/llvm/include/llvm/Analysis/ValueTracking.h
@@ -835,8 +835,8 @@ inline bool isSafeToSpeculativelyExecute(const Instruction *I,
return isSafeToSpeculativelyExecute(I, &*CtxI, AC, DT, TLI, UseOperandInfo);
}
-/// Don't use information from its operands. This helper is used when its
-/// operands are going to be replaced.
+/// Don't use information from its non-constant operands. This helper is used
+/// when its operands are going to be replaced.
inline bool
isSafeToSpeculativelyExecuteWithOperandsReplaced(const Instruction *I) {
return isSafeToSpeculativelyExecute(I, nullptr, nullptr, nullptr, nullptr,
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index f56afa91f1f9a..c250c18366cf3 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -6797,15 +6797,12 @@ bool llvm::isSafeToSpeculativelyExecuteWithOpcode(
case Instruction::URem: {
// x / y is undefined if y == 0.
const APInt *V;
- if (UseOperandInfo && match(Inst->getOperand(1), m_APInt(V)))
+ if (match(Inst->getOperand(1), m_APInt(V)))
return *V != 0;
return false;
}
case Instruction::SDiv:
case Instruction::SRem: {
- if (!UseOperandInfo)
- return false;
-
// x / y is undefined if y == 0 or x == INT_MIN and y == -1
const APInt *Numerator, *Denominator;
if (!match(Inst->getOperand(1), m_APInt(Denominator)))
@@ -6845,9 +6842,7 @@ bool llvm::isSafeToSpeculativelyExecuteWithOpcode(
// The called function could have undefined behavior or side-effects, even
// if marked readnone nounwind.
- // NOTE: Intrinsic cannot be replaced.
- return Callee && Callee->isSpeculatable() &&
- (UseOperandInfo || Callee->isIntrinsic());
+ return Callee && Callee->isSpeculatable();
}
case Instruction::VAArg:
case Instruction::Alloca:
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index bfae0e9c1393e..ba16859e1bbb6 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -1247,6 +1247,8 @@ bool InstCombinerImpl::replaceInInstruction(Value *V, Value *Old, Value *New,
if (Depth == 2)
return false;
+ assert(!isa<Constant>(Old) && "Only replace non-constant values");
+
auto *I = dyn_cast<Instruction>(V);
if (!I || !I->hasOneUse() ||
!isSafeToSpeculativelyExecuteWithOperandsReplaced(I))
@@ -1332,7 +1334,7 @@ Instruction *InstCombinerImpl::foldSelectValueEquivalence(SelectInst &Sel,
// profitability is not clear for other cases.
// FIXME: Support vectors.
if (OldOp == CmpLHS && match(NewOp, m_ImmConstant()) &&
- !match(OldOp, m_ImmConstant()) && !Cmp.getType()->isVectorTy() &&
+ !match(OldOp, m_Constant()) && !Cmp.getType()->isVectorTy() &&
isGuaranteedNotToBeUndef(NewOp, SQ.AC, &Sel, &DT))
if (replaceInInstruction(TrueVal, OldOp, NewOp))
return &Sel;
diff --git a/llvm/test/Transforms/InstCombine/select-binop-cmp.ll b/llvm/test/Transforms/InstCombine/select-binop-cmp.ll
index f71159970b150..fb56764598e2d 100644
--- a/llvm/test/Transforms/InstCombine/select-binop-cmp.ll
+++ b/llvm/test/Transforms/InstCombine/select-binop-cmp.ll
@@ -1305,7 +1305,7 @@ define <2 x i32> @select_replace_undef(<2 x i32> %x, <2 x i32> %y) {
define i32 @select_replace_call_speculatable(i32 %x, i32 %y) {
; CHECK-LABEL: @select_replace_call_speculatable(
; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], 0
-; CHECK-NEXT: [[CALL:%.*]] = call i32 @call_speculatable(i32 [[X]], i32 [[X]])
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @call_speculatable(i32 0, i32 0)
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 [[CALL]], i32 [[Y:%.*]]
; CHECK-NEXT: ret i32 [[S]]
;
>From e1e8722ec15321ba82aaf349eea38a541a9ad820 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw at qq.com>
Date: Sun, 21 Jul 2024 22:53:38 +0800
Subject: [PATCH 5/5] [InstCombine] Address review comments. NFC.
Co-authored-by: Nikita Popov <github at npopov.com>
---
llvm/include/llvm/Analysis/ValueTracking.h | 12 ++++++------
llvm/lib/Analysis/ValueTracking.cpp | 8 ++++----
.../lib/Transforms/InstCombine/InstCombineSelect.cpp | 2 +-
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/llvm/include/llvm/Analysis/ValueTracking.h b/llvm/include/llvm/Analysis/ValueTracking.h
index 596dc8a487d21..44e27234aa90d 100644
--- a/llvm/include/llvm/Analysis/ValueTracking.h
+++ b/llvm/include/llvm/Analysis/ValueTracking.h
@@ -823,24 +823,24 @@ bool isSafeToSpeculativelyExecute(const Instruction *I,
AssumptionCache *AC = nullptr,
const DominatorTree *DT = nullptr,
const TargetLibraryInfo *TLI = nullptr,
- bool UseOperandInfo = true);
+ bool UseVariableInfo = true);
inline bool isSafeToSpeculativelyExecute(const Instruction *I,
BasicBlock::iterator CtxI,
AssumptionCache *AC = nullptr,
const DominatorTree *DT = nullptr,
const TargetLibraryInfo *TLI = nullptr,
- bool UseOperandInfo = true) {
+ bool UseVariableInfo = true) {
// Take an iterator, and unwrap it into an Instruction *.
- return isSafeToSpeculativelyExecute(I, &*CtxI, AC, DT, TLI, UseOperandInfo);
+ return isSafeToSpeculativelyExecute(I, &*CtxI, AC, DT, TLI, UseVariableInfo);
}
/// Don't use information from its non-constant operands. This helper is used
/// when its operands are going to be replaced.
inline bool
-isSafeToSpeculativelyExecuteWithOperandsReplaced(const Instruction *I) {
+isSafeToSpeculativelyExecuteWithVariableReplaced(const Instruction *I) {
return isSafeToSpeculativelyExecute(I, nullptr, nullptr, nullptr, nullptr,
- /*UseOperandInfo=*/false);
+ /*UseVariableInfo=*/false);
}
/// This returns the same result as isSafeToSpeculativelyExecute if Opcode is
@@ -863,7 +863,7 @@ isSafeToSpeculativelyExecuteWithOperandsReplaced(const Instruction *I) {
bool isSafeToSpeculativelyExecuteWithOpcode(
unsigned Opcode, const Instruction *Inst, const Instruction *CtxI = nullptr,
AssumptionCache *AC = nullptr, const DominatorTree *DT = nullptr,
- const TargetLibraryInfo *TLI = nullptr, bool UseOperandInfo = true);
+ const TargetLibraryInfo *TLI = nullptr, bool UseVariableInfo = true);
/// Returns true if the result or effects of the given instructions \p I
/// depend values not reachable through the def use graph.
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index c250c18366cf3..0563ab1901dc0 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -6761,15 +6761,15 @@ bool llvm::isSafeToSpeculativelyExecute(const Instruction *Inst,
AssumptionCache *AC,
const DominatorTree *DT,
const TargetLibraryInfo *TLI,
- bool UseOperandInfo) {
+ bool UseVariableInfo) {
return isSafeToSpeculativelyExecuteWithOpcode(Inst->getOpcode(), Inst, CtxI,
- AC, DT, TLI, UseOperandInfo);
+ AC, DT, TLI, UseVariableInfo);
}
bool llvm::isSafeToSpeculativelyExecuteWithOpcode(
unsigned Opcode, const Instruction *Inst, const Instruction *CtxI,
AssumptionCache *AC, const DominatorTree *DT, const TargetLibraryInfo *TLI,
- bool UseOperandInfo) {
+ bool UseVariableInfo) {
#ifndef NDEBUG
if (Inst->getOpcode() != Opcode) {
// Check that the operands are actually compatible with the Opcode override.
@@ -6821,7 +6821,7 @@ bool llvm::isSafeToSpeculativelyExecuteWithOpcode(
return false;
}
case Instruction::Load: {
- if (!UseOperandInfo)
+ if (!UseVariableInfo)
return false;
const LoadInst *LI = dyn_cast<LoadInst>(Inst);
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index ba16859e1bbb6..aaf4ece3249a2 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -1251,7 +1251,7 @@ bool InstCombinerImpl::replaceInInstruction(Value *V, Value *Old, Value *New,
auto *I = dyn_cast<Instruction>(V);
if (!I || !I->hasOneUse() ||
- !isSafeToSpeculativelyExecuteWithOperandsReplaced(I))
+ !isSafeToSpeculativelyExecuteWithVariableReplaced(I))
return false;
bool Changed = false;
More information about the llvm-commits
mailing list