<div dir="ltr">This looks like the incorrect transformation:<div><span style="color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px">-  %div.i = urem i64 -1, %add</span><br style="color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px"><span style="color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px">-  %sub.i = sub i64 -2, %div.i</span><br style="color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px"><span style="color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px">+  %div.i = urem i64 1, %add</span><br style="color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px"><span style="color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px">+  %sub.i1 = add i64 %div.i, -2</span><br></div><div><span style="color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px"><br></span></div><div><span style="color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px">`urem i64 -1, %add` should produce something interesting, while `urem i64 1, %add` will always produce 1. David fed this into Alive and it also produces this counterexample.</span></div><div><span style="color:rgb(38,38,38);font-family:arial,sans-serif;font-size:13px;line-height:16px"><br></span></div><div><font color="#262626" face="arial, sans-serif"><span style="line-height:16px">I went ahead and reverted this in r221317.</span></font></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 4, 2014 at 3:21 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I don't have a reduction, but I can confirm that reverting this change causes the test to pass.</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 4, 2014 at 2:55 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I suspect that this change has broken some random number generation tests in Chromium:<div><a href="http://build.chromium.org/p/chromium.fyi/builders/Cr%20Win%20Clang%20tester/builds/755" target="_blank">http://build.chromium.org/p/chromium.fyi/builders/Cr%20Win%20Clang%20tester/builds/755</a><br></div><div><br></div><div>The LLVM revision window was 221173 to 221166, and this looks like the most culpable commit. The LLVM changes in that revision window were an R600 change, yours, my noexcept change, an optnone change, and an MDNode=>Value change.</div><div><br></div><div>I'll try to get a reduction.</div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 3, 2014 at 11:11 AM, Chad Rosier <span dir="ltr"><<a href="mailto:mcrosier@codeaurora.org" target="_blank">mcrosier@codeaurora.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mcrosier<br>
Date: Mon Nov  3 13:11:30 2014<br>
New Revision: 221171<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=221171&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=221171&view=rev</a><br>
Log:<br>
[Reassociate] Canonicalize negative constants out of expressions.<br>
<br>
This gives CSE/GVN more options to eliminate duplicate expressions.<br>
This is a follow up patch to <a href="http://reviews.llvm.org/D4904" target="_blank">http://reviews.llvm.org/D4904</a>.<br>
<br>
<a href="http://reviews.llvm.org/D5363" target="_blank">http://reviews.llvm.org/D5363</a><br>
<br>
Added:<br>
    llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll<br>
Removed:<br>
    llvm/trunk/test/Transforms/Reassociate/liftsign.ll<br>
Modified:<br>
    llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp<br>
    llvm/trunk/test/Transforms/Reassociate/basictest.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp?rev=221171&r1=221170&r2=221171&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp?rev=221171&r1=221170&r2=221171&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp Mon Nov  3 13:11:30 2014<br>
@@ -193,9 +193,8 @@ namespace {<br>
     Value *OptimizeMul(BinaryOperator *I, SmallVectorImpl<ValueEntry> &Ops);<br>
     Value *RemoveFactorFromExpression(Value *V, Value *Factor);<br>
     void EraseInst(Instruction *I);<br>
-    void optimizeFAddNegExpr(ConstantFP *ConstOperand, Instruction *I,<br>
-                             int OperandNr);<br>
     void OptimizeInst(Instruction *I);<br>
+    Instruction *canonicalizeNegConstExpr(Instruction *I);<br>
   };<br>
 }<br>
<br>
@@ -1930,31 +1929,105 @@ void Reassociate::EraseInst(Instruction<br>
     }<br>
 }<br>
<br>
-void Reassociate::optimizeFAddNegExpr(ConstantFP *ConstOperand, Instruction *I,<br>
-                                      int OperandNr) {<br>
+// Canonicalize expressions of the following form:<br>
+//  x + (-Constant * y) -> x - (Constant * y)<br>
+//  x - (-Constant * y) -> x + (Constant * y)<br>
+Instruction *Reassociate::canonicalizeNegConstExpr(Instruction *I) {<br>
+  if (!I->hasOneUse() || I->getType()->isVectorTy())<br>
+    return nullptr;<br>
+<br>
+  // Must have at least one constant operand.<br>
+  Constant *C0 = dyn_cast<Constant>(I->getOperand(0));<br>
+  Constant *C1 = dyn_cast<Constant>(I->getOperand(1));<br>
+  if (!C0 && !C1)<br>
+    return nullptr;<br>
+<br>
+  // Must be a negative ConstantInt or ConstantFP.<br>
+  Constant *C = C0 ? C0 : C1;<br>
+  unsigned ConstIdx = C0 ? 0 : 1;<br>
+  if (auto *CI = dyn_cast<ConstantInt>(C)) {<br>
+    if (!CI->isNegative())<br>
+      return nullptr;<br>
+  } else if (auto *CF = dyn_cast<ConstantFP>(C)) {<br>
+    if (!CF->isNegative())<br>
+      return nullptr;<br>
+  } else<br>
+    return nullptr;<br>
+<br>
+  // User must be a binary operator with one or more uses.<br>
+  Instruction *User = I->user_back();<br>
+  if (!isa<BinaryOperator>(User) || !User->getNumUses())<br>
+    return nullptr;<br>
+<br>
+  // Must be a binary operator with higher precedence that add/sub.<br>
+  switch(I->getOpcode()) {<br>
+  default:<br>
+    return nullptr;<br>
+  case Instruction::Mul:<br>
+  case Instruction::FMul:<br>
+  case Instruction::UDiv:<br>
+  case Instruction::SDiv:<br>
+  case Instruction::FDiv:<br>
+  case Instruction::URem:<br>
+  case Instruction::SRem:<br>
+  case Instruction::FRem:<br>
+   break;<br>
+  }<br>
+<br>
+  unsigned UserOpcode = User->getOpcode();<br>
+  if (UserOpcode != Instruction::Add && UserOpcode != Instruction::FAdd &&<br>
+      UserOpcode != Instruction::Sub && UserOpcode != Instruction::FSub)<br>
+    return nullptr;<br>
+<br>
+  // Subtraction is not commutative. Explicitly, the following transform is<br>
+  // not valid: (-Constant * y) - x  -> x + (Constant * y)<br>
+  if (!User->isCommutative() && User->getOperand(1) != I)<br>
+    return nullptr;<br>
+<br>
   // Change the sign of the constant.<br>
-  APFloat Val = ConstOperand->getValueAPF();<br>
-  Val.changeSign();<br>
-  I->setOperand(0, ConstantFP::get(ConstOperand->getContext(), Val));<br>
-<br>
-  assert(I->hasOneUse() && "Only a single use can be replaced.");<br>
-  Instruction *Parent = I->user_back();<br>
-<br>
-  Value *OtherOperand = Parent->getOperand(1 - OperandNr);<br>
-<br>
-  unsigned Opcode = Parent->getOpcode();<br>
-  assert(Opcode == Instruction::FAdd ||<br>
-         (Opcode == Instruction::FSub && Parent->getOperand(1) == I));<br>
-<br>
-  BinaryOperator *NI = Opcode == Instruction::FAdd<br>
-                           ? BinaryOperator::CreateFSub(OtherOperand, I)<br>
-                           : BinaryOperator::CreateFAdd(OtherOperand, I);<br>
-  NI->setFastMathFlags(cast<FPMathOperator>(Parent)->getFastMathFlags());<br>
-  NI->insertBefore(Parent);<br>
-  NI->setName(Parent->getName() + ".repl");<br>
-  Parent->replaceAllUsesWith(NI);<br>
+  if (ConstantInt *CI = dyn_cast<ConstantInt>(C))<br>
+    I->setOperand(ConstIdx, ConstantInt::get(CI->getContext(), -CI->getValue()));<br>
+  else {<br>
+    ConstantFP *CF = cast<ConstantFP>(C);<br>
+    APFloat Val = CF->getValueAPF();<br>
+    Val.changeSign();<br>
+    I->setOperand(ConstIdx, ConstantFP::get(CF->getContext(), Val));<br>
+  }<br>
+<br>
+  // Canonicalize I to RHS to simplify the next bit of logic. E.g.,<br>
+  // ((-Const*y) + x) -> (x + (-Const*y)).<br>
+  if (User->getOperand(0) == I && User->isCommutative())<br>
+    cast<BinaryOperator>(User)->swapOperands();<br>
+<br>
+  Value *Op0 = User->getOperand(0);<br>
+  Value *Op1 = User->getOperand(1);<br>
+  BinaryOperator *NI;<br>
+  switch(UserOpcode) {<br>
+  default:<br>
+    llvm_unreachable("Unexpected Opcode!");<br>
+  case Instruction::Add:<br>
+    NI = BinaryOperator::CreateSub(Op0, Op1);<br>
+    break;<br>
+  case Instruction::Sub:<br>
+    NI = BinaryOperator::CreateAdd(Op0, Op1);<br>
+    break;<br>
+  case Instruction::FAdd:<br>
+    NI = BinaryOperator::CreateFSub(Op0, Op1);<br>
+    NI->setFastMathFlags(cast<FPMathOperator>(User)->getFastMathFlags());<br>
+    break;<br>
+  case Instruction::FSub:<br>
+    NI = BinaryOperator::CreateFAdd(Op0, Op1);<br>
+    NI->setFastMathFlags(cast<FPMathOperator>(User)->getFastMathFlags());<br>
+    break;<br>
+  }<br>
+<br>
+  NI->insertBefore(User);<br>
+  NI->setName(User->getName());<br>
+  User->replaceAllUsesWith(NI);<br>
   NI->setDebugLoc(I->getDebugLoc());<br>
+  RedoInsts.insert(I);<br>
   MadeChange = true;<br>
+  return NI;<br>
 }<br>
<br>
 /// OptimizeInst - Inspect and optimize the given instruction. Note that erasing<br>
@@ -1977,6 +2050,10 @@ void Reassociate::OptimizeInst(Instructi<br>
       I = NI;<br>
     }<br>
<br>
+  // Canonicalize negative constants out of expressions.<br>
+  if (Instruction *Res = canonicalizeNegConstExpr(I))<br>
+    I = Res;<br>
+<br>
   // Commute floating point binary operators, to canonicalize the order of their<br>
   // operands.  This can potentially expose more CSE opportunities, and makes<br>
   // writing other transformations simpler.<br>
@@ -1997,24 +2074,6 @@ void Reassociate::OptimizeInst(Instructi<br>
       }<br>
     }<br>
<br>
-    // Reassociate: x + -ConstantFP * y -> x - ConstantFP * y<br>
-    // The FMul can also be an FDiv, and FAdd can be a FSub.<br>
-    if (Opcode == Instruction::FMul || Opcode == Instruction::FDiv) {<br>
-      if (ConstantFP *LHSConst = dyn_cast<ConstantFP>(I->getOperand(0))) {<br>
-        if (LHSConst->isNegative() && I->hasOneUse()) {<br>
-          Instruction *Parent = I->user_back();<br>
-          if (Parent->getOpcode() == Instruction::FAdd) {<br>
-            if (Parent->getOperand(0) == I)<br>
-              optimizeFAddNegExpr(LHSConst, I, 0);<br>
-            else if (Parent->getOperand(1) == I)<br>
-              optimizeFAddNegExpr(LHSConst, I, 1);<br>
-          } else if (Parent->getOpcode() == Instruction::FSub)<br>
-            if (Parent->getOperand(1) == I)<br>
-              optimizeFAddNegExpr(LHSConst, I, 1);<br>
-        }<br>
-      }<br>
-    }<br>
-<br>
     // FIXME: We should commute vector instructions as well.  However, this<br>
     // requires further analysis to determine the effect on later passes.<br>
<br>
<br>
Modified: llvm/trunk/test/Transforms/Reassociate/basictest.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Reassociate/basictest.ll?rev=221171&r1=221170&r2=221171&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Reassociate/basictest.ll?rev=221171&r1=221170&r2=221171&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/Reassociate/basictest.ll (original)<br>
+++ llvm/trunk/test/Transforms/Reassociate/basictest.ll Mon Nov  3 13:11:30 2014<br>
@@ -203,7 +203,7 @@ define i32 @test14(i32 %X1, i32 %X2) {<br>
<br>
 ; CHECK-LABEL: @test14<br>
 ; CHECK-NEXT: sub i32 %X1, %X2<br>
-; CHECK-NEXT: mul i32 %tmp, 47<br>
+; CHECK-NEXT: mul i32 %B2, 47<br>
 ; CHECK-NEXT: ret i32<br>
 }<br>
<br>
<br>
Added: llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll?rev=221171&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll?rev=221171&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll (added)<br>
+++ llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll Mon Nov  3 13:11:30 2014<br>
@@ -0,0 +1,235 @@<br>
+; RUN: opt -reassociate -gvn -S < %s | FileCheck %s<br>
+<br>
+; (x + 0.1234 * y) * (x + -0.1234 * y) -> (x + 0.1234 * y) * (x - 0.1234 * y)<br>
+define double @test1(double %x, double %y) {<br>
+; CHECK-LABEL: @test1<br>
+; CHECK-NEXT: fmul double 1.234000e-01, %y<br>
+; CHECK-NEXT: fadd double %x, %mul<br>
+; CHECK-NEXT: fsub double %x, %mul<br>
+; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}<br>
+; CHECK-NEXT: ret double %mul<br>
+<br>
+  %mul = fmul double 1.234000e-01, %y<br>
+  %add = fadd double %mul, %x<br>
+  %mul1 = fmul double -1.234000e-01, %y<br>
+  %add2 = fadd double %mul1, %x<br>
+  %mul3 = fmul double %add, %add2<br>
+  ret double %mul3<br>
+}<br>
+<br>
+; (x + -0.1234 * y) * (x + -0.1234 * y) -> (x - 0.1234 * y) * (x - 0.1234 * y)<br>
+define double @test2(double %x, double %y) {<br>
+; CHECK-LABEL: @test2<br>
+; CHECK-NEXT: fmul double 1.234000e-01, %y<br>
+; CHECK-NEXT: fsub double %x, %mul<br>
+; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}<br>
+; CHECK-NEXT: ret double %mul<br>
+<br>
+  %mul = fmul double %y, -1.234000e-01<br>
+  %add = fadd double %mul, %x<br>
+  %mul1 = fmul double %y, -1.234000e-01<br>
+  %add2 = fadd double %mul1, %x<br>
+  %mul3 = fmul double %add, %add2<br>
+  ret double %mul3<br>
+}<br>
+<br>
+; (x + 0.1234 / y) * (x + -0.1234 / y) -> (x + 0.1234 / y) * (x - 0.1234 / y)<br>
+define double @test3(double %x, double %y) {<br>
+; CHECK-LABEL: @test3<br>
+; CHECK-NEXT: fdiv double 1.234000e-01, %y<br>
+; CHECK-NEXT: fadd double %x, %div<br>
+; CHECK-NEXT: fsub double %x, %div<br>
+; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}<br>
+; CHECK-NEXT: ret double<br>
+<br>
+  %div = fdiv double 1.234000e-01, %y<br>
+  %add = fadd double %div, %x<br>
+  %div1 = fdiv double -1.234000e-01, %y<br>
+  %add2 = fadd double %div1, %x<br>
+  %mul3 = fmul double %add, %add2<br>
+  ret double %mul3<br>
+}<br>
+<br>
+; (x + 0.1234 * y) * (x - -0.1234 * y) -> (x + 0.1234 * y) * (x + 0.1234 * y)<br>
+define double @test4(double %x, double %y) {<br>
+; CHECK-LABEL: @test4<br>
+; CHECK-NEXT: fmul double 1.234000e-01, %y<br>
+; CHECK-NEXT: fadd double %x, %mul<br>
+; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}<br>
+; CHECK-NEXT: ret double<br>
+<br>
+  %mul = fmul double %y, 1.234000e-01<br>
+  %add = fadd double %mul, %x<br>
+  %mul1 = fmul double %y, -1.234000e-01<br>
+  %add2 = fsub double %x, %mul1<br>
+  %mul3 = fmul double %add, %add2<br>
+  ret double %mul3<br>
+}<br>
+<br>
+; Canonicalize (x - -1234 * y)<br>
+define i64 @test5(i64 %x, i64 %y) {<br>
+; CHECK-LABEL: @test5<br>
+; CHECK-NEXT: mul i64 %y, 1234<br>
+; CHECK-NEXT: add i64 %mul, %x<br>
+; CHECK-NEXT: ret i64 %sub<br>
+<br>
+  %mul = mul i64 %y, -1234<br>
+  %sub = sub i64 %x, %mul<br>
+  ret i64 %sub<br>
+}<br>
+<br>
+; Canonicalize (x - -0.1234 * y)<br>
+define double @test6(double %x, double %y) {<br>
+; CHECK-LABEL: @test6<br>
+; CHECK-NEXT: fmul double 1.234000e-01, %y<br>
+; CHECK-NEXT: fadd double %x, %mul<br>
+; CHECK-NEXT: ret double<br>
+<br>
+  %mul = fmul double -1.234000e-01, %y<br>
+  %sub = fsub double %x, %mul<br>
+  ret double %sub<br>
+}<br>
+<br>
+; Don't modify (-0.1234 * y - x)<br>
+define double @test7(double %x, double %y) {<br>
+; CHECK-LABEL: @test7<br>
+; CHECK-NEXT: fmul double -1.234000e-01, %y<br>
+; CHECK-NEXT: fsub double %mul, %x<br>
+; CHECK-NEXT: ret double %sub<br>
+<br>
+  %mul = fmul double -1.234000e-01, %y<br>
+  %sub = fsub double %mul, %x<br>
+  ret double %sub<br>
+}<br>
+<br>
+; Canonicalize (-0.1234 * y + x) -> (x - 0.1234 * y)<br>
+define double @test8(double %x, double %y) {<br>
+; CHECK-LABEL: @test8<br>
+; CHECK-NEXT: fmul double 1.234000e-01, %y<br>
+; CHECK-NEXT: fsub double %x, %mul<br>
+; CHECK-NEXT: ret double %add<br>
+<br>
+  %mul = fmul double -1.234000e-01, %y<br>
+  %add = fadd double %mul, %x<br>
+  ret double %add<br>
+}<br>
+<br>
+; Canonicalize (y * -0.1234 + x) -> (x - 0.1234 * y)<br>
+define double @test9(double %x, double %y) {<br>
+; CHECK-LABEL: @test9<br>
+; CHECK-NEXT: fmul double 1.234000e-01, %y<br>
+; CHECK-NEXT: fsub double %x, %mul<br>
+; CHECK-NEXT: ret double %add<br>
+<br>
+  %mul = fmul double %y, -1.234000e-01<br>
+  %add = fadd double %mul, %x<br>
+  ret double %add<br>
+}<br>
+<br>
+; Canonicalize (x - -1234 udiv y)<br>
+define i64 @test10(i64 %x, i64 %y) {<br>
+; CHECK-LABEL: @test10<br>
+; CHECK-NEXT: udiv i64 1234, %y<br>
+; CHECK-NEXT: add i64 %div, %x<br>
+; CHECK-NEXT: ret i64 %sub<br>
+<br>
+  %div = udiv i64 -1234, %y<br>
+  %sub = sub i64 %x, %div<br>
+  ret i64 %sub<br>
+}<br>
+<br>
+; Canonicalize (x - -1234 sdiv y)<br>
+define i64 @test11(i64 %x, i64 %y) {<br>
+; CHECK-LABEL: @test11<br>
+; CHECK-NEXT: sdiv i64 1234, %y<br>
+; CHECK-NEXT: add i64 %div, %x<br>
+; CHECK-NEXT: ret i64 %sub<br>
+<br>
+  %div = sdiv i64 -1234, %y<br>
+  %sub = sub i64 %x, %div<br>
+  ret i64 %sub<br>
+}<br>
+<br>
+; Canonicalize (x - -0.1234 / y)<br>
+define double @test12(double %x, double %y) {<br>
+; CHECK-LABEL: @test12<br>
+; CHECK-NEXT: fdiv double 1.234000e-01, %y<br>
+; CHECK-NEXT: fadd double %x, %div<br>
+; CHECK-NEXT: ret double %sub<br>
+<br>
+  %div = fdiv double -1.234000e-01, %y<br>
+  %sub = fsub double %x, %div<br>
+  ret double %sub<br>
+}<br>
+<br>
+; Canonicalize (x - -0.1234 urem y)<br>
+define i64 @test13(i64 %x, i64 %y) {<br>
+; CHECK-LABEL: @test13<br>
+; CHECK-NEXT: urem i64 1234, %y<br>
+; CHECK-NEXT: add i64 %urem, %x<br>
+; CHECK-NEXT: ret i64 %sub<br>
+<br>
+  %urem = urem i64 -1234, %y<br>
+  %sub = sub i64 %x, %urem<br>
+  ret i64 %sub<br>
+}<br>
+<br>
+; Canonicalize (x + -0.1234 srem y)<br>
+define i64 @test14(i64 %x, i64 %y) {<br>
+; CHECK-LABEL: @test14<br>
+; CHECK-NEXT: srem i64 1234, %y<br>
+; CHECK-NEXT: sub i64 %x, %srem<br>
+; CHECK-NEXT: ret i64 %add<br>
+<br>
+  %srem = srem i64 -1234, %y<br>
+  %add = add i64 %x, %srem<br>
+  ret i64 %add<br>
+}<br>
+<br>
+; Don't modify (-0.1234 srem y - x)<br>
+define i64 @test15(i64 %x, i64 %y) {<br>
+; CHECK-LABEL: @test15<br>
+; CHECK-NEXT: %srem = srem i64 -1234, %y<br>
+; CHECK-NEXT: %sub = sub i64 %srem, %x<br>
+; CHECK-NEXT: ret i64 %sub<br>
+<br>
+  %srem = srem i64 -1234, %y<br>
+  %sub = sub i64 %srem, %x<br>
+  ret i64 %sub<br>
+}<br>
+<br>
+; Canonicalize (x - -0.1234 frem y)<br>
+define double @test16(double %x, double %y) {<br>
+; CHECK-LABEL: @test16<br>
+; CHECK-NEXT: frem double 1.234000e-01, %y<br>
+; CHECK-NEXT: fadd double %x, %rem<br>
+; CHECK-NEXT: ret double %sub<br>
+<br>
+  %rem = frem double -1.234000e-01, %y<br>
+  %sub = fsub double %x, %rem<br>
+  ret double %sub<br>
+}<br>
+<br>
+; Canonicalize (x + -0.1234 frem y)<br>
+define double @test17(double %x, double %y) {<br>
+; CHECK-LABEL: @test17<br>
+; CHECK-NEXT: frem double 1.234000e-01, %y<br>
+; CHECK-NEXT: fsub double %x, %rem<br>
+; CHECK-NEXT: ret double %add<br>
+<br>
+  %rem = frem double -1.234000e-01, %y<br>
+  %add = fadd double %x, %rem<br>
+  ret double %add<br>
+}<br>
+<br>
+; Canonicalize (-0.1234 frem y + x) -> (x - 0.1234 frem y)<br>
+define double @test18(double %x, double %y) {<br>
+; CHECK-LABEL: @test18<br>
+; CHECK-NEXT: frem double 1.234000e-01, %y<br>
+; CHECK-NEXT: fsub double %x, %rem<br>
+; CHECK-NEXT: ret double %add<br>
+<br>
+  %rem = frem double -1.234000e-01, %y<br>
+  %add = fadd double %x, %rem<br>
+  ret double %add<br>
+}<br>
<br>
Removed: llvm/trunk/test/Transforms/Reassociate/liftsign.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Reassociate/liftsign.ll?rev=221170&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Reassociate/liftsign.ll?rev=221170&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/Reassociate/liftsign.ll (original)<br>
+++ llvm/trunk/test/Transforms/Reassociate/liftsign.ll (removed)<br>
@@ -1,69 +0,0 @@<br>
-; RUN: opt -reassociate -gvn -S < %s | FileCheck %s<br>
-<br>
-; (x + 0.1234 * y) * (x + -0.1234 * y) -> (x + 0.1234 * y) * (x - 0.1234 * y)<br>
-; so CSE can simplify it further<br>
-define double @lift_sign1(double %x, double %y) nounwind readnone ssp uwtable {<br>
-; CHECK-LABEL: @lift_sign1(<br>
-  %mul = fmul double 1.234000e-01, %y<br>
-  %add = fadd double %mul, %x<br>
-  %mul1 = fmul double -1.234000e-01, %y<br>
-  %add2 = fadd double %mul1, %x<br>
-  %mul3 = fmul double %add, %add2<br>
-; CHECK-NOT: %mul1 = fmul double -1.234000e-01, %y<br>
-; CHECK-NOT: %add2 = fadd %mul1, %x<br>
-; CHECK: %add2.repl = fsub double %x, %mul<br>
-; CHECK: %mul3 = fmul double %add, %add2<br>
-ret double %mul3<br>
-}<br>
-<br>
-; (x + -0.1234 * y) * (x + -0.1234 * y) -> (x - 0.1234 * y) * (x - 0.1234 * y)<br>
-; GVN can then rewrite it even further<br>
-define double @lift_sign2(double %x, double %y) nounwind readnone ssp uwtable {<br>
-; CHECK-LABEL: @lift_sign2(<br>
-  %mul = fmul double %y, -1.234000e-01<br>
-  %add = fadd double %mul, %x<br>
-  %mul1 = fmul double %y, -1.234000e-01<br>
-  %add2 = fadd double %mul1, %x<br>
-  %mul3 = fmul double %add, %add2<br>
-; CHECK-NOT: %mul = fmul double %y, -1.234000e-01<br>
-; CHECK-NOT: %add = fadd double %mul, %x<br>
-; CHECK-NOT: %mul1 = fmul double %y, -1.234000e-01<br>
-; CHECK-NOT: %add2 = fadd double %mul1, %x<br>
-; CHECK-NOT: %mul3 = fmul double %add, %add2<br>
-; CHECK: %mul = fmul double 1.234000e-01, %y<br>
-; CHECK: %add.repl = fsub double %x, %mul<br>
-; CHECK: %mul3 = fmul double %add.repl, %add.repl<br>
-  ret double %mul3<br>
-}<br>
-<br>
-; (x + 0.1234 * y) * (x - -0.1234 * y) -> (x + 0.1234 * y) * (x + 0.1234 * y)<br>
-define double @lift_sign3(double %x, double %y) nounwind readnone ssp uwtable {<br>
-; CHECK-LABEL: @lift_sign3(<br>
-  %mul = fmul double %y, 1.234000e-01<br>
-  %add = fadd double %mul, %x<br>
-  %mul1 = fmul double %y, -1.234000e-01<br>
-  %add2 = fsub double %x, %mul1<br>
-  %mul3 = fmul double %add, %add2<br>
-; CHECK-NOT: %mul1 = fmul double %y, -1.234000e-01<br>
-; CHECK-NOT: %add2 = fsub double %x, %mul1<br>
-; CHECK-NOT: %mul3 = fmul double %add, %add2<br>
-; CHECK: %mul3 = fmul double %add, %add<br>
-  ret double %mul3<br>
-}<br>
-<br>
-; (x + 0.1234 / y) * (x + -0.1234 / y) -> (x + 0.1234 / y) * (x - 0.1234 / y)<br>
-; so CSE can simplify it further<br>
-define double @lift_sign4(double %x, double %y) nounwind readnone ssp uwtable {<br>
-; CHECK-LABEL: @lift_sign4(<br>
-  %div = fdiv double 1.234000e-01, %y<br>
-  %add = fadd double %div, %x<br>
-  %div1 = fdiv double -1.234000e-01, %y<br>
-  %add2 = fadd double %div1, %x<br>
-  %mul3 = fmul double %add, %add2<br>
-; CHECK-NOT: %div1 = fdiv double -1.234000e-01, %y<br>
-; CHECK-NOT: %add2 = fadd double %div1, %x<br>
-; CHECK-NOT: %mul3 = fmul double %add, %add2<br>
-; CHECK: %add2.repl = fsub double %x, %div<br>
-; CHECK: %mul3 = fmul double %add, %add2.repl<br>
-  ret double %mul3<br>
-}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>