[PATCH] [Reassociate] Similar to "X + -X" -> "0", added code to handle "X + ~X" -> "-1".
David Blaikie
dblaikie at gmail.com
Sat May 31 08:43:04 PDT 2014
On Sat, May 31, 2014 at 8:02 AM, Rahul Jain <rahul1.jain at samsung.com> wrote:
>
> Hi Benjamin,
>
> Thanks for the review.
> No I dont have commit access as of now, would be helpful if
> you could commit it for me. Will request for one soon!
>
> Updated patch removing the whitespace-only changes, those were
> introduced on running clang-format.
There's a script for running clang-format over a diff (or over a git
revision range) that should help cleanup your work without introducing
unrelated changes (I forget the exact name, it's somewhere in the
clang-format project directory)
> Also patched to an updated revision.
>
> Please commit it on my behalf.
>
> Thanks again for the help!
> Rahul
>
> http://reviews.llvm.org/D3835
>
> Files:
> lib/Transforms/Scalar/Reassociate.cpp
> test/Transforms/Reassociate/inverses.ll
>
> Index: lib/Transforms/Scalar/Reassociate.cpp
> ===================================================================
> --- lib/Transforms/Scalar/Reassociate.cpp
> +++ 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
> Index: test/Transforms/Reassociate/inverses.ll
> ===================================================================
> --- test/Transforms/Reassociate/inverses.ll
> +++ 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
> +}
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list