[llvm] r181586 - InstCombine: Verify the type before transforming uitofp into select.

Bill Wendling isanbard at gmail.com
Tue May 14 11:30:23 PDT 2013


Done. Thanks!

-bw

On May 10, 2013, at 3:10 AM, Benjamin Kramer <benny.kra at gmail.com> wrote:

> 
> On 10.05.2013, at 11:16, Benjamin Kramer <benny.kra at googlemail.com> wrote:
> 
>> Author: d0k
>> Date: Fri May 10 04:16:52 2013
>> New Revision: 181586
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=181586&view=rev
>> Log:
>> InstCombine: Verify the type before transforming uitofp into select.
> 
> This fixes a bad regression in 3.3 and should be merged into the branch.
> 
> - Ben
> 
>> 
>> PR15952.
>> 
>> Modified:
>>   llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
>>   llvm/trunk/test/Transforms/InstCombine/add4.ll
>> 
>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp?rev=181586&r1=181585&r2=181586&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp (original)
>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp Fri May 10 04:16:52 2013
>> @@ -525,31 +525,32 @@ Instruction *InstCombiner::visitFMul(Bin
>>    }
>> 
>>    // B * (uitofp i1 C) -> select C, B, 0
>> -    if(I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) {
>> -        Value *LHS=Op0, *RHS=Op1;
>> -        Value *B, *C;
>> -        if (!match(RHS, m_UIToFp(m_Value(C))))
>> -            std::swap(LHS, RHS);
>> +    if (I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) {
>> +      Value *LHS = Op0, *RHS = Op1;
>> +      Value *B, *C;
>> +      if (!match(RHS, m_UIToFp(m_Value(C))))
>> +        std::swap(LHS, RHS);
>> 
>> -        if (match(RHS, m_UIToFp(m_Value(C)))) {
>> -            B=LHS;
>> -            Value *Zero = ConstantFP::getNegativeZero(B->getType());
>> -            return SelectInst::Create(C, B, Zero);
>> -        }
>> +      if (match(RHS, m_UIToFp(m_Value(C))) && C->getType()->isIntegerTy(1)) {
>> +        B = LHS;
>> +        Value *Zero = ConstantFP::getNegativeZero(B->getType());
>> +        return SelectInst::Create(C, B, Zero);
>> +      }
>>    }
>> 
>>    // A * (1 - uitofp i1 C) -> select C, 0, A
>> -    if(I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) { 
>> -        Value *LHS=Op0, *RHS=Op1;
>> -        Value *A, *C;
>> -        if (!match(RHS, m_FSub(m_FPOne(), m_UIToFp(m_Value(C)))))
>> -            std::swap(LHS, RHS);
>> +    if (I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) {
>> +      Value *LHS = Op0, *RHS = Op1;
>> +      Value *A, *C;
>> +      if (!match(RHS, m_FSub(m_FPOne(), m_UIToFp(m_Value(C)))))
>> +        std::swap(LHS, RHS);
>> 
>> -        if (match(RHS, m_FSub(m_FPOne(), m_UIToFp(m_Value(C))))) {
>> -            A=LHS;
>> -            Value *Zero = ConstantFP::getNegativeZero(A->getType());
>> -            return SelectInst::Create(C, Zero, A);
>> -        }
>> +      if (match(RHS, m_FSub(m_FPOne(), m_UIToFp(m_Value(C)))) &&
>> +          C->getType()->isIntegerTy(1)) {
>> +        A = LHS;
>> +        Value *Zero = ConstantFP::getNegativeZero(A->getType());
>> +        return SelectInst::Create(C, Zero, A);
>> +      }
>>    }
>> 
>>    if (!isa<Constant>(Op1))
>> 
>> Modified: llvm/trunk/test/Transforms/InstCombine/add4.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/add4.ll?rev=181586&r1=181585&r2=181586&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/InstCombine/add4.ll (original)
>> +++ llvm/trunk/test/Transforms/InstCombine/add4.ll Fri May 10 04:16:52 2013
>> @@ -38,3 +38,21 @@ EntryBlock:
>> ; CHECK: select i1 %C, float %B, float %A
>> }
>> 
>> +; PR15952
>> +define float @test4(float %A, float %B, i32 %C) {
>> +  %cf = uitofp i32 %C to float
>> +  %mc = fsub float 1.000000e+00, %cf
>> +  %p1 = fmul fast float %A, %mc
>> +  ret float %p1
>> +; CHECK: @test4
>> +; CHECK: uitofp
>> +}
>> +
>> +define float @test5(float %A, float %B, i32 %C) {
>> +  %cf = uitofp i32 %C to float
>> +  %p2 = fmul fast float %B, %cf
>> +  ret float %p2
>> +; CHECK: @test5
>> +; CHECK: uitofp
>> +}
>> +
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 





More information about the llvm-commits mailing list