From f53f07046b2cfcc92f66cc330a05ba6efd7a7f44 Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Tue, 11 Nov 2014 23:36:42 +0000 Subject: [PATCH] [Reassociate] Canonicalize negative constants out of expressions. Add support for FDiv, which was regressed by the previous commit. llvm-svn: 221738 --- llvm/lib/Transforms/Scalar/Reassociate.cpp | 3 +- .../Reassociate/canonicalize-neg-const.ll | 48 ++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Scalar/Reassociate.cpp b/llvm/lib/Transforms/Scalar/Reassociate.cpp index 7cde3ab..a24d3d4 100644 --- a/llvm/lib/Transforms/Scalar/Reassociate.cpp +++ b/llvm/lib/Transforms/Scalar/Reassociate.cpp @@ -1955,7 +1955,8 @@ Instruction *Reassociate::canonicalizeNegConstExpr(Instruction *I) { // Must be a mul instruction. unsigned Opcode = I->getOpcode(); - if (Opcode != Instruction::Mul && Opcode != Instruction::FMul) + if (Opcode != Instruction::Mul && Opcode != Instruction::FMul && + Opcode != Instruction::FDiv) return nullptr; // Must have at least one constant operand. diff --git a/llvm/test/Transforms/Reassociate/canonicalize-neg-const.ll b/llvm/test/Transforms/Reassociate/canonicalize-neg-const.ll index 5ac8a1f..80f433a 100644 --- a/llvm/test/Transforms/Reassociate/canonicalize-neg-const.ll +++ b/llvm/test/Transforms/Reassociate/canonicalize-neg-const.ll @@ -108,3 +108,51 @@ define double @test8(double %x, double %y) { %add = fadd double %mul, %x ret double %add } + +; Canonicalize (x - -0.1234 / y) +define double @test9(double %x, double %y) { +; CHECK-LABEL: @test9 +; CHECK-NEXT: fdiv double 1.234000e-01, %y +; CHECK-NEXT: fadd double %x, %div +; CHECK-NEXT: ret double + + %div = fdiv double -1.234000e-01, %y + %sub = fsub double %x, %div + ret double %sub +} + +; Don't modify (-0.1234 / y - x) +define double @test10(double %x, double %y) { +; CHECK-LABEL: @test10 +; CHECK-NEXT: fdiv double -1.234000e-01, %y +; CHECK-NEXT: fsub double %div, %x +; CHECK-NEXT: ret double %sub + + %div = fdiv double -1.234000e-01, %y + %sub = fsub double %div, %x + ret double %sub +} + +; Canonicalize (-0.1234 / y + x) -> (x - 0.1234 / y) +define double @test11(double %x, double %y) { +; CHECK-LABEL: @test11 +; CHECK-NEXT: fdiv double 1.234000e-01, %y +; CHECK-NEXT: fsub double %x, %div +; CHECK-NEXT: ret double %add + + %div = fdiv double -1.234000e-01, %y + %add = fadd double %div, %x + ret double %add +} + +; Canonicalize (y / -0.1234 + x) -> (x - y / 0.1234) +define double @test12(double %x, double %y) { +; CHECK-LABEL: @test12 +; CHECK-NEXT: fdiv double %y, 1.234000e-01 +; CHECK-NEXT: fsub double %x, %div +; CHECK-NEXT: ret double %add + + %div = fdiv double %y, -1.234000e-01 + %add = fadd double %div, %x + ret double %add +} -- 2.7.4