diff options
| author | Shuxin Yang <shuxin.llvm@gmail.com> | 2012-12-14 18:46:06 +0000 | 
|---|---|---|
| committer | Shuxin Yang <shuxin.llvm@gmail.com> | 2012-12-14 18:46:06 +0000 | 
| commit | f8e9a5a061734115bbf43a1e859a5da9d7b6ea1d (patch) | |
| tree | 6d149624c98e332b0f24bd9a525d97dfd250c86e /llvm/lib/Transforms | |
| parent | 92eb254c3cd5376bc8a8c412bdd8c36d833a4e15 (diff) | |
| download | bcm5719-llvm-f8e9a5a061734115bbf43a1e859a5da9d7b6ea1d.tar.gz bcm5719-llvm-f8e9a5a061734115bbf43a1e859a5da9d7b6ea1d.zip | |
rdar://12753946
Implement rule : "x * (select cond 1.0, 0.0) -> select cond x, 0.0"
llvm-svn: 170226
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 32 | 
1 files changed, 32 insertions, 0 deletions
| diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index b95da85a7f3..964297a5eab 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -341,6 +341,38 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {      }    } +  // X * cond ? 1.0 : 0.0 => cond ? X : 0.0 +  if (I.hasNoNaNs() && I.hasNoSignedZeros()) { +    Value *V0 = I.getOperand(0); +    Value *V1 = I.getOperand(1); +    Value *Cond, *SLHS, *SRHS; +    bool Match = false; + +    if (match(V0, m_Select(m_Value(Cond), m_Value(SLHS), m_Value(SRHS)))) { +      Match = true; +    } else if (match(V1, m_Select(m_Value(Cond), m_Value(SLHS),  +                     m_Value(SRHS)))) { +      Match = true; +      std::swap(V0, V1); +    } + +    if (Match) { +      ConstantFP *C0 = dyn_cast<ConstantFP>(SLHS); +      ConstantFP *C1 = dyn_cast<ConstantFP>(SRHS); + +      if (C0 && C1 && +          ((C0->isZero() && C1->isExactlyValue(1.0)) || +           (C1->isZero() && C0->isExactlyValue(1.0)))) { +        Value *T; +        if (C0->isZero()) +          T = Builder->CreateSelect(Cond, SLHS, V1); +        else +          T = Builder->CreateSelect(Cond, V1, SRHS); +        return ReplaceInstUsesWith(I, T); +      } +    } +  } +    return Changed ? &I : 0;  } | 

