mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 20:29:48 +00:00
Fix PR1932 by disabling an xform invalid for fdiv.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46429 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5ec898399f
commit
25feae555d
@ -2494,14 +2494,15 @@ Instruction *InstCombiner::commonDivTransforms(BinaryOperator &I) {
|
|||||||
if (isa<UndefValue>(Op1))
|
if (isa<UndefValue>(Op1))
|
||||||
return ReplaceInstUsesWith(I, Op1);
|
return ReplaceInstUsesWith(I, Op1);
|
||||||
|
|
||||||
// Handle cases involving: div X, (select Cond, Y, Z)
|
// Handle cases involving: [su]div X, (select Cond, Y, Z)
|
||||||
|
// This does not apply for fdiv.
|
||||||
if (SelectInst *SI = dyn_cast<SelectInst>(Op1)) {
|
if (SelectInst *SI = dyn_cast<SelectInst>(Op1)) {
|
||||||
// div X, (Cond ? 0 : Y) -> div X, Y. If the div and the select are in the
|
// [su]div X, (Cond ? 0 : Y) -> div X, Y. If the div and the select are in
|
||||||
// same basic block, then we replace the select with Y, and the condition
|
// the same basic block, then we replace the select with Y, and the
|
||||||
// of the select with false (if the cond value is in the same BB). If the
|
// condition of the select with false (if the cond value is in the same BB).
|
||||||
// select has uses other than the div, this allows them to be simplified
|
// If the select has uses other than the div, this allows them to be
|
||||||
// also. Note that div X, Y is just as good as div X, 0 (undef)
|
// simplified also. Note that div X, Y is just as good as div X, 0 (undef)
|
||||||
if (Constant *ST = dyn_cast<Constant>(SI->getOperand(1)))
|
if (ConstantInt *ST = dyn_cast<ConstantInt>(SI->getOperand(1)))
|
||||||
if (ST->isNullValue()) {
|
if (ST->isNullValue()) {
|
||||||
Instruction *CondI = dyn_cast<Instruction>(SI->getOperand(0));
|
Instruction *CondI = dyn_cast<Instruction>(SI->getOperand(0));
|
||||||
if (CondI && CondI->getParent() == I.getParent())
|
if (CondI && CondI->getParent() == I.getParent())
|
||||||
@ -2513,8 +2514,8 @@ Instruction *InstCombiner::commonDivTransforms(BinaryOperator &I) {
|
|||||||
return &I;
|
return &I;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Likewise for: div X, (Cond ? Y : 0) -> div X, Y
|
// Likewise for: [su]div X, (Cond ? Y : 0) -> div X, Y
|
||||||
if (Constant *ST = dyn_cast<Constant>(SI->getOperand(2)))
|
if (ConstantInt *ST = dyn_cast<ConstantInt>(SI->getOperand(2)))
|
||||||
if (ST->isNullValue()) {
|
if (ST->isNullValue()) {
|
||||||
Instruction *CondI = dyn_cast<Instruction>(SI->getOperand(0));
|
Instruction *CondI = dyn_cast<Instruction>(SI->getOperand(0));
|
||||||
if (CondI && CondI->getParent() == I.getParent())
|
if (CondI && CondI->getParent() == I.getParent())
|
||||||
|
7
test/Transforms/InstCombine/2008-01-27-FloatSelect.ll
Normal file
7
test/Transforms/InstCombine/2008-01-27-FloatSelect.ll
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep select
|
||||||
|
|
||||||
|
define double @fold(i1 %a, double %b) {
|
||||||
|
%s = select i1 %a, double 0., double 1.
|
||||||
|
%c = fdiv double %b, %s
|
||||||
|
ret double %c
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user