[llvm] 2827aa9 - [InstCombine] Fix evaluation order dependent fold
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 14 08:22:41 PDT 2023
Author: Nikita Popov
Date: 2023-08-14T17:22:32+02:00
New Revision: 2827aa9dafa7e0c45697bf4fc5b067cae26623c4
URL: https://github.com/llvm/llvm-project/commit/2827aa9dafa7e0c45697bf4fc5b067cae26623c4
DIFF: https://github.com/llvm/llvm-project/commit/2827aa9dafa7e0c45697bf4fc5b067cae26623c4.diff
LOG: [InstCombine] Fix evaluation order dependent fold
Make sure the function arguments are evaluated in a predictable
order.
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index 5c5d7f695fa356..01ca0894ac357b 100644
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -926,13 +926,17 @@ InstCombinerImpl::foldBinOpOfSelectAndCastOfSelectCondition(BinaryOperator &I) {
// If the value used in the zext/sext is the select condition, or the negated
// of the select condition, the binop can be simplified.
- if (CondVal == A)
- return SelectInst::Create(CondVal, NewFoldedConst(false, TrueVal),
+ if (CondVal == A) {
+ Value *NewTrueVal = NewFoldedConst(false, TrueVal);
+ return SelectInst::Create(CondVal, NewTrueVal,
NewFoldedConst(true, FalseVal));
+ }
- if (match(A, m_Not(m_Specific(CondVal))))
- return SelectInst::Create(CondVal, NewFoldedConst(true, TrueVal),
+ if (match(A, m_Not(m_Specific(CondVal)))) {
+ Value *NewTrueVal = NewFoldedConst(true, TrueVal);
+ return SelectInst::Create(CondVal, NewTrueVal,
NewFoldedConst(false, FalseVal));
+ }
return nullptr;
}
diff --git a/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll b/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll
index 0c859e5c09208b..eaec15b1672457 100644
--- a/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll
+++ b/llvm/test/Transforms/InstCombine/binop-select-cast-of-select-cond.ll
@@ -187,8 +187,8 @@ define i64 @select_non_const_sides(i1 %c, i64 %arg1, i64 %arg2) {
define i6 @sub_select_sext_op_swapped_non_const_args(i1 %c, i6 %argT, i6 %argF) {
; CHECK-LABEL: define i6 @sub_select_sext_op_swapped_non_const_args
; CHECK-SAME: (i1 [[C:%.*]], i6 [[ARGT:%.*]], i6 [[ARGF:%.*]]) {
-; CHECK-DAG: [[TMP1:%.*]] = xor i6 [[ARGT]], -1
-; CHECK-DAG: [[TMP2:%.*]] = sub i6 0, [[ARGF]]
+; CHECK-NEXT: [[TMP1:%.*]] = xor i6 [[ARGT]], -1
+; CHECK-NEXT: [[TMP2:%.*]] = sub i6 0, [[ARGF]]
; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i6 [[TMP1]], i6 [[TMP2]]
; CHECK-NEXT: ret i6 [[SUB]]
;
@@ -201,8 +201,8 @@ define i6 @sub_select_sext_op_swapped_non_const_args(i1 %c, i6 %argT, i6 %argF)
define i6 @sub_select_zext_op_swapped_non_const_args(i1 %c, i6 %argT, i6 %argF) {
; CHECK-LABEL: define i6 @sub_select_zext_op_swapped_non_const_args
; CHECK-SAME: (i1 [[C:%.*]], i6 [[ARGT:%.*]], i6 [[ARGF:%.*]]) {
-; CHECK-DAG: [[TMP1:%.*]] = sub i6 1, [[ARGT]]
-; CHECK-DAG: [[TMP2:%.*]] = sub i6 0, [[ARGF]]
+; CHECK-NEXT: [[TMP1:%.*]] = sub i6 1, [[ARGT]]
+; CHECK-NEXT: [[TMP2:%.*]] = sub i6 0, [[ARGF]]
; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i6 [[TMP1]], i6 [[TMP2]]
; CHECK-NEXT: ret i6 [[SUB]]
;
More information about the llvm-commits
mailing list