[llvm] r222008 - [Reassociate] Canonicalize the operands of all binary operators.

Chad Rosier mcrosier at codeaurora.org
Tue Nov 18 12:03:53 PST 2014


Hi Kevin,
I've summarized the issue here:
http://llvm.org/bugs/show_bug.cgi?id=21600

I'll try and commit a fix shortly.  Hopefully, the net effect will be a
fix for mcf and improvements in other code.

 Chad

> Hi Kevin,
> I'll take a look today.  If you find any other issues, please let me know.
>
>  Chad
>
>> Hi Chad,
>>
>> On cortex-a57, we found a 3.8% performance regression on 429.mcf in
>> spec2006 due to this commit, would you have a look of this?
>>
>> The branch order changed by this commit.
>>
>> Before:
>>   tbz x8, #63, 4028e0 <primal_bea_mpp+0x250>
>>   cmp w12, #0x1
>>   b.eq 4028ec <primal_bea_mpp+0x25c>
>>
>>
>> After:
>>   cmp w12, #0x1
>>   b.ne 40290c <primal_bea_mpp+0x250>
>>   tbnz x8, #63, 402918 <primal_bea_mpp+0x25c>
>>
>> This change happens in function primal_bea_mpp and got performance
>> worse.
>>
>> I didn't look into detail, that's all what I know from a simple
>> investigation. Hopefully this can give you a clue to fix it.
>>
>> Thanks,
>> Kevin
>>
>> 2014-11-14 17:09 GMT+00:00 Chad Rosier <mcrosier at codeaurora.org>:
>>
>>> Author: mcrosier
>>> Date: Fri Nov 14 11:09:19 2014
>>> New Revision: 222008
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=222008&view=rev
>>> Log:
>>> [Reassociate] Canonicalize the operands of all binary operators.
>>>
>>> Added:
>>>     llvm/trunk/test/Transforms/Reassociate/commute.ll
>>> Modified:
>>>     llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp
>>>     llvm/trunk/test/Transforms/Reassociate/multistep.ll
>>>
>>> Modified: llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp?rev=222008&r1=222007&r2=222008&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp Fri Nov 14
>>> 11:09:19
>>> 2014
>>> @@ -2078,19 +2078,19 @@ void Reassociate::OptimizeInst(Instructi
>>>    if (Instruction *Res = canonicalizeNegConstExpr(I))
>>>      I = Res;
>>>
>>> -  // Commute floating point binary operators, to canonicalize the
>>> order
>>> of their
>>> -  // operands.  This can potentially expose more CSE opportunities,
>>> and
>>> makes
>>> -  // writing other transformations simpler.
>>> -  if (I->getType()->isFloatingPointTy() || I->getType()->isVectorTy())
>>> {
>>> +  // Commute binary operators, to canonicalize the order of their
>>> operands.
>>> +  // This can potentially expose more CSE opportunities, and makes
>>> writing other
>>> +  // transformations simpler.
>>> +  if (I->isCommutative())
>>> +    canonicalizeOperands(I);
>>>
>>> -    if (I->isCommutative())
>>> -      canonicalizeOperands(I);
>>> +  // Don't optimize vector instructions.
>>> +  if (I->getType()->isVectorTy())
>>> +    return;
>>>
>>> -    // Don't try to optimize vector instructions or anything that
>>> doesn't
>>> have
>>> -    // unsafe algebra.
>>> -    if (I->getType()->isVectorTy() || !I->hasUnsafeAlgebra())
>>> -      return;
>>> -  }
>>> +  // Don't optimize floating point instructions that don't have unsafe
>>> algebra.
>>> +  if (I->getType()->isFloatingPointTy() && !I->hasUnsafeAlgebra())
>>> +    return;
>>>
>>>    // Do not reassociate boolean (i1) expressions.  We want to preserve
>>> the
>>>    // original order of evaluation for short-circuited comparisons that
>>>
>>> Added: llvm/trunk/test/Transforms/Reassociate/commute.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Reassociate/commute.ll?rev=222008&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Transforms/Reassociate/commute.ll (added)
>>> +++ llvm/trunk/test/Transforms/Reassociate/commute.ll Fri Nov 14
>>> 11:09:19
>>> 2014
>>> @@ -0,0 +1,19 @@
>>> +; RUN: opt -reassociate -S < %s | FileCheck %s
>>> +
>>> +declare void @use(i32)
>>> +
>>> +define void @test1(i32 %x, i32 %y) {
>>> +; CHECK-LABEL: test1
>>> +; CHECK: mul i32 %y, %x
>>> +; CHECK: mul i32 %y, %x
>>> +; CHECK: sub i32 %1, %2
>>> +; CHECK: call void @use(i32 %{{.*}})
>>> +; CHECK: call void @use(i32 %{{.*}})
>>> +
>>> +  %1 = mul i32 %x, %y
>>> +  %2 = mul i32 %y, %x
>>> +  %3 = sub i32 %1, %2
>>> +  call void @use(i32 %1)
>>> +  call void @use(i32 %3)
>>> +  ret void
>>> +}
>>>
>>> Modified: llvm/trunk/test/Transforms/Reassociate/multistep.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Reassociate/multistep.ll?rev=222008&r1=222007&r2=222008&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Transforms/Reassociate/multistep.ll (original)
>>> +++ llvm/trunk/test/Transforms/Reassociate/multistep.ll Fri Nov 14
>>> 11:09:19 2014
>>> @@ -9,7 +9,7 @@ define i64 @multistep1(i64 %a, i64 %b, i
>>>    %t3 = mul i64 %a, %t2 ; a*(a*c)
>>>    %t4 = add i64 %t1, %t3
>>>  ; CHECK-NEXT: add i64 %c, %b
>>> -; CHECK-NEXT: mul i64 %tmp{{.*}}, %a
>>> +; CHECK-NEXT: mul i64 %a, %tmp{{.*}}
>>>  ; CHECK-NEXT: mul i64 %tmp{{.*}}, %a
>>>  ; CHECK-NEXT: ret
>>>    ret i64 %t4
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>
>>
>>
>> --
>> Best Regards,
>>
>> Kevin Qin
>>
>
>
>





More information about the llvm-commits mailing list