From 5c76b3d03ea9b7ba49d0a0786d4546470fcf0bdf Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Fri, 14 Nov 2014 17:09:19 +0000 Subject: [PATCH] [Reassociate] Canonicalize the operands of all binary operators. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222008 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/Reassociate.cpp | 22 +++++++++++----------- test/Transforms/Reassociate/commute.ll | 19 +++++++++++++++++++ test/Transforms/Reassociate/multistep.ll | 2 +- 3 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 test/Transforms/Reassociate/commute.ll diff --git a/lib/Transforms/Scalar/Reassociate.cpp b/lib/Transforms/Scalar/Reassociate.cpp index 67659bb50b0..30e9b88226b 100644 --- a/lib/Transforms/Scalar/Reassociate.cpp +++ b/lib/Transforms/Scalar/Reassociate.cpp @@ -2078,19 +2078,19 @@ void Reassociate::OptimizeInst(Instruction *I) { 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 diff --git a/test/Transforms/Reassociate/commute.ll b/test/Transforms/Reassociate/commute.ll new file mode 100644 index 00000000000..760e51b05e1 --- /dev/null +++ b/test/Transforms/Reassociate/commute.ll @@ -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 +} diff --git a/test/Transforms/Reassociate/multistep.ll b/test/Transforms/Reassociate/multistep.ll index 12eaeeea7b7..c499646a8b6 100644 --- a/test/Transforms/Reassociate/multistep.ll +++ b/test/Transforms/Reassociate/multistep.ll @@ -9,7 +9,7 @@ define i64 @multistep1(i64 %a, i64 %b, i64 %c) { %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