[PATCH] [Reassociate] Similar to "X + -X" -> "0", added code to handle "X + ~X" -> "-1".

Rahul Jain 1989.rahuljain at gmail.com
Sat May 31 08:20:09 PDT 2014


Thanks Benjamin!

Thanks to Suyog Sarda for working with me on this!



On Sat, May 31, 2014 at 8:40 PM, Rahul Jain <rahul1.jain at samsung.com> wrote:

> Closed by commit rL209973 (authored by d0k).
>
> http://reviews.llvm.org/D3835
>
> Files:
>   llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp
>   llvm/trunk/test/Transforms/Reassociate/inverses.ll
>
> Index: llvm/trunk/test/Transforms/Reassociate/inverses.ll
> ===================================================================
> --- llvm/trunk/test/Transforms/Reassociate/inverses.ll
> +++ llvm/trunk/test/Transforms/Reassociate/inverses.ll
> @@ -32,3 +32,15 @@
>  ; CHECK: %tmp.5 = add i32 %b, 1234
>  ; CHECK: ret i32 %tmp.5
>  }
> +
> +define i32 @test4(i32 %b, i32 %a) {
> +        %tmp.1 = add i32 %a, 1234
> +        %tmp.2 = add i32 %b, %tmp.1
> +        %tmp.4 = xor i32 %a, -1
> +        ; (b+(a+1234))+~a -> b+1233
> +        %tmp.5 = add i32 %tmp.2, %tmp.4
> +        ret i32 %tmp.5
> +; CHECK-LABEL: @test4(
> +; CHECK: %tmp.5 = add i32 %b, 1233
> +; CHECK: ret i32 %tmp.5
> +}
> Index: llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp
> ===================================================================
> --- llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp
> +++ llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp
> @@ -1368,11 +1368,10 @@
>  Value *Reassociate::OptimizeAdd(Instruction *I,
>                                  SmallVectorImpl<ValueEntry> &Ops) {
>    // Scan the operand lists looking for X and -X pairs.  If we find any,
> we
> -  // can simplify the expression. X+-X == 0.  While we're at it, scan for
> any
> +  // can simplify expressions like X+-X == 0 and X+~X ==-1.  While we're
> at it,
> +  // scan for any
>    // duplicates.  We want to canonicalize Y+Y+Y+Z -> 3*Y+Z.
> -  //
> -  // TODO: We could handle "X + ~X" -> "-1" if we wanted, since "-X =
> ~X+1".
> -  //
> +
>    for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
>      Value *TheOp = Ops[i].Op;
>      // Check to see if we've seen this operand before.  If so, we factor
> all
> @@ -1412,19 +1411,28 @@
>        continue;
>      }
>
> -    // Check for X and -X in the operand list.
> -    if (!BinaryOperator::isNeg(TheOp))
> +    // Check for X and -X or X and ~X in the operand list.
> +    if (!BinaryOperator::isNeg(TheOp) && !BinaryOperator::isNot(TheOp))
>        continue;
>
> -    Value *X = BinaryOperator::getNegArgument(TheOp);
> +    Value *X = nullptr;
> +    if (BinaryOperator::isNeg(TheOp))
> +      X = BinaryOperator::getNegArgument(TheOp);
> +    else if (BinaryOperator::isNot(TheOp))
> +      X = BinaryOperator::getNotArgument(TheOp);
> +
>      unsigned FoundX = FindInOperandList(Ops, i, X);
>      if (FoundX == i)
>        continue;
>
>      // Remove X and -X from the operand list.
> -    if (Ops.size() == 2)
> +    if (Ops.size() == 2 && BinaryOperator::isNeg(TheOp))
>        return Constant::getNullValue(X->getType());
>
> +    // Remove X and ~X from the operand list.
> +    if (Ops.size() == 2 && BinaryOperator::isNot(TheOp))
> +      return Constant::getAllOnesValue(X->getType());
> +
>      Ops.erase(Ops.begin()+i);
>      if (i < FoundX)
>        --FoundX;
> @@ -1434,6 +1442,13 @@
>      ++NumAnnihil;
>      --i;     // Revisit element.
>      e -= 2;  // Removed two elements.
> +
> +    // if X and ~X we append -1 to the operand list.
> +    if (BinaryOperator::isNot(TheOp)) {
> +      Value *V = Constant::getAllOnesValue(X->getType());
> +      Ops.insert(Ops.end(), ValueEntry(getRank(V), V));
> +      e += 1;
> +    }
>    }
>
>    // Scan the operand list, checking to see if there are any common
> factors
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140531/ef44aa50/attachment.html>


More information about the llvm-commits mailing list