[llvm-commits] [llvm] r170226 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineMulDivRem.cpp test/Transforms/InstCombine/fast-math.ll

Jakub Staszak kubastaszak at gmail.com
Fri Dec 14 11:28:41 PST 2012


Shuxin,

I made an comment in a thread where you sent the patch:
http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20121210/159263.html

- Kuba

On Dec 14, 2012, at 7:55 PM, Matt Beaumont-Gay <matthewbg at google.com> wrote:

> On Fri, Dec 14, 2012 at 10:46 AM, Shuxin Yang <shuxin.llvm at gmail.com> wrote:
>> Author: shuxin_yang
>> Date: Fri Dec 14 12:46:06 2012
>> New Revision: 170226
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=170226&view=rev
>> Log:
>> rdar://12753946
>> 
>> Implement rule : "x * (select cond 1.0, 0.0) -> select cond x, 0.0"
>> 
>> Modified:
>>    llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
>>    llvm/trunk/test/Transforms/InstCombine/fast-math.ll
>> 
>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp?rev=170226&r1=170225&r2=170226&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp (original)
>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp Fri Dec 14 12:46:06 2012
>> @@ -341,6 +341,38 @@
>>     }
>>   }
>> 
>> +  // 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)))) {
> 
> Formatting nit: This should be indented to the open paren of m_Select.
> 
>> +      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;
>> }
>> 
>> 
>> Modified: llvm/trunk/test/Transforms/InstCombine/fast-math.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fast-math.ll?rev=170226&r1=170225&r2=170226&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/InstCombine/fast-math.ll (original)
>> +++ llvm/trunk/test/Transforms/InstCombine/fast-math.ll Fri Dec 14 12:46:06 2012
>> @@ -3,19 +3,17 @@
>> ; testing-case "float fold(float a) { return 1.2f * a * 2.3f; }"
>> ; 1.2f and 2.3f is supposed to be fold.
>> define float @fold(float %a) {
>> -fold:
>>   %mul = fmul fast float %a, 0x3FF3333340000000
>>   %mul1 = fmul fast float %mul, 0x4002666660000000
>>   ret float %mul1
>> -; CHECK: fold
>> +; CHECK: @fold
>> ; CHECK: fmul float %a, 0x4006147AE0000000
>> }
>> 
>> ; Same testing-case as the one used in fold() except that the operators have
>> ; fixed FP mode.
>> define float @notfold(float %a) {
>> -notfold:
>> -; CHECK: notfold
>> +; CHECK: @notfold
>> ; CHECK: %mul = fmul fast float %a, 0x3FF3333340000000
>>   %mul = fmul fast float %a, 0x3FF3333340000000
>>   %mul1 = fmul float %mul, 0x4002666660000000
>> @@ -23,10 +21,40 @@
>> }
>> 
>> define float @fold2(float %a) {
>> -fold2:
>> -; CHECK: fold2
>> +; CHECK: @fold2
>> ; CHECK: fmul float %a, 0x4006147AE0000000
>>   %mul = fmul float %a, 0x3FF3333340000000
>>   %mul1 = fmul fast float %mul, 0x4002666660000000
>>   ret float %mul1
>> }
>> +
>> +; rdar://12753946:  x * cond ? 1.0 : 0.0 => cond ? x : 0.0
>> +define double @select1(i32 %cond, double %x, double %y) {
>> +  %tobool = icmp ne i32 %cond, 0
>> +  %cond1 = select i1 %tobool, double 1.000000e+00, double 0.000000e+00
>> +  %mul = fmul nnan nsz double %cond1, %x
>> +  %add = fadd double %mul, %y
>> +  ret double %add
>> +; CHECK: @select1
>> +; CHECK: select i1 %tobool, double %x, double 0.000000e+00
>> +}
>> +
>> +define double @select2(i32 %cond, double %x, double %y) {
>> +  %tobool = icmp ne i32 %cond, 0
>> +  %cond1 = select i1 %tobool, double 0.000000e+00, double 1.000000e+00
>> +  %mul = fmul nnan nsz double %cond1, %x
>> +  %add = fadd double %mul, %y
>> +  ret double %add
>> +; CHECK: @select2
>> +; CHECK: select i1 %tobool, double 0.000000e+00, double %x
>> +}
>> +
>> +define double @select3(i32 %cond, double %x, double %y) {
>> +  %tobool = icmp ne i32 %cond, 0
>> +  %cond1 = select i1 %tobool, double 0.000000e+00, double 2.000000e+00
>> +  %mul = fmul nnan nsz double %cond1, %x
>> +  %add = fadd double %mul, %y
>> +  ret double %add
>> +; CHECK: @select3
>> +; CHECK: fmul nnan nsz double %cond1, %x
>> +}
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121214/e189221c/attachment.html>


More information about the llvm-commits mailing list