diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 439a86d951a83..e261807bbc035 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -1729,7 +1729,8 @@ Instruction *InstCombinerImpl::FoldOpIntoSelect(Instruction &Op, SelectInst *SI, if (auto *CI = dyn_cast(SI->getCondition())) { if (CI->hasOneUse()) { Value *Op0 = CI->getOperand(0), *Op1 = CI->getOperand(1); - if ((TV == Op0 && FV == Op1) || (FV == Op0 && TV == Op1)) + if (((TV == Op0 && FV == Op1) || (FV == Op0 && TV == Op1)) && + !CI->isCommutative()) return nullptr; } } diff --git a/llvm/test/Transforms/InstCombine/fcmp-select.ll b/llvm/test/Transforms/InstCombine/fcmp-select.ll index 408bc1cdc268f..053b233cb5f04 100644 --- a/llvm/test/Transforms/InstCombine/fcmp-select.ll +++ b/llvm/test/Transforms/InstCombine/fcmp-select.ll @@ -268,3 +268,14 @@ define i1 @test_fcmp_select_var_const_unordered(double %x, double %y) { %cmp2 = fcmp ugt double %sel, 0x3E80000000000000 ret i1 %cmp2 } + +define i1 @test_fcmp_ord_select_fcmp_oeq_var_const(double %x) { +; CHECK-LABEL: @test_fcmp_ord_select_fcmp_oeq_var_const( +; CHECK-NEXT: [[CMP1:%.*]] = fcmp oeq double [[X:%.*]], 1.000000e+00 +; CHECK-NEXT: ret i1 [[CMP1]] +; + %cmp1 = fcmp ord double %x, 0.000000e+00 + %sel = select i1 %cmp1, double %x, double 0.000000e+00 + %cmp2 = fcmp oeq double %sel, 1.000000e+00 + ret i1 %cmp2 +}