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

Kevin Qin kevinqindev at gmail.com
Tue Nov 18 07:19:06 PST 2014


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141118/7ec33f4f/attachment.html>


More information about the llvm-commits mailing list