[llvm-commits] [llvm] r85085 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/or.ll test/Transforms/InstCombine/xor-demorgans.ll
Evan Cheng
evan.cheng at apple.com
Sun Oct 25 20:40:02 PDT 2009
Chris, this is causing an infinite looping during llvm-gcc build. I'll
revert it.
Evan
On Oct 25, 2009, at 6:06 PM, Chris Lattner wrote:
> Author: lattner
> Date: Sun Oct 25 20:06:31 2009
> New Revision: 85085
>
> URL: http://llvm.org/viewvc/llvm-project?rev=85085&view=rev
> Log:
> Implement PR3266 & PR5276, folding:
> not (or (icmp, icmp)) -> and(icmp, icmp)
>
>
> Removed:
> llvm/trunk/test/Transforms/InstCombine/xor-demorgans.ll
> Modified:
> llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
> llvm/trunk/test/Transforms/InstCombine/or.ll
>
> Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=85085&r1=85084&r2=85085&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Sun
> Oct 25 20:06:31 2009
> @@ -631,9 +631,32 @@
> return 0;
> }
>
> -static inline Value *dyn_castNotVal(Value *V) {
> +/// isFreeToInvert - Return true if the specified value is free to
> invert (apply
> +/// ~ to). This happens in cases where the ~ can be eliminated.
> +static inline bool isFreeToInvert(Value *V) {
> + // ~(~(X)) -> X.
> if (BinaryOperator::isNot(V))
> - return BinaryOperator::getNotArgument(V);
> + return true;
> +
> + // Constants can be considered to be not'ed values.
> + if (isa<ConstantInt>(V))
> + return true;
> +
> + // Compares can be inverted if they have a single use.
> + if (CmpInst *CI = dyn_cast<CmpInst>(V))
> + return CI->hasOneUse();
> +
> + return false;
> +}
> +
> +static inline Value *dyn_castNotVal(Value *V) {
> + // If this is not(not(x)) don't return that this is a not: we
> want the two
> + // not's to be folded first.
> + if (BinaryOperator::isNot(V)) {
> + Value *Operand = BinaryOperator::getNotArgument(V);
> + if (!isFreeToInvert(Operand))
> + return Operand;
> + }
>
> // Constants can be considered to be not'ed values...
> if (ConstantInt *C = dyn_cast<ConstantInt>(V))
> @@ -641,6 +664,8 @@
> return 0;
> }
>
> +
> +
> // dyn_castFoldableMul - If this value is a multiply that can be
> folded into
> // other computations (because it has a constant operand), return the
> // non-constant operand of the multiply, and set CST to point to the
> multiplier.
> @@ -4166,7 +4191,7 @@
> if (Instruction *CastOp = dyn_cast<Instruction>(CI->getOperand
> (0))) {
> if ((isa<TruncInst>(CI) || isa<BitCastInst>(CI)) &&
> CastOp->getNumOperands() == 2)
> - if (ConstantInt *AndCI = dyn_cast<ConstantInt>(CastOp-
> >getOperand(1))) {
> + if (ConstantInt *AndCI =dyn_cast<ConstantInt>(CastOp-
> >getOperand(1))){
> if (CastOp->getOpcode() == Instruction::And) {
> // Change: and (cast (and X, C1) to T), C2
> // into : and (cast X to T), trunc_or_bitcast(C1)&C2
> @@ -5064,12 +5089,13 @@
>
> // Is this a ~ operation?
> if (Value *NotOp = dyn_castNotVal(&I)) {
> - // ~(~X & Y) --> (X | ~Y) - De Morgan's Law
> - // ~(~X | Y) === (X & ~Y) - De Morgan's Law
> if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(NotOp)) {
> if (Op0I->getOpcode() == Instruction::And ||
> Op0I->getOpcode() == Instruction::Or) {
> - if (dyn_castNotVal(Op0I->getOperand(1))) Op0I->swapOperands
> ();
> + // ~(~X & Y) --> (X | ~Y) - De Morgan's Law
> + // ~(~X | Y) === (X & ~Y) - De Morgan's Law
> + if (dyn_castNotVal(Op0I->getOperand(1)))
> + Op0I->swapOperands();
> if (Value *Op0NotVal = dyn_castNotVal(Op0I->getOperand(0))) {
> Value *NotY =
> Builder->CreateNot(Op0I->getOperand(1),
> @@ -5078,6 +5104,19 @@
> return BinaryOperator::CreateOr(Op0NotVal, NotY);
> return BinaryOperator::CreateAnd(Op0NotVal, NotY);
> }
> +
> + // ~(X & Y) --> (~X | ~Y) - De Morgan's Law
> + // ~(X | Y) === (~X & ~Y) - De Morgan's Law
> + if (isFreeToInvert(Op0I->getOperand(0)) &&
> + isFreeToInvert(Op0I->getOperand(1))) {
> + Value *NotX =
> + Builder->CreateNot(Op0I->getOperand(0), "notlhs");
> + Value *NotY =
> + Builder->CreateNot(Op0I->getOperand(1), "notrhs");
> + if (Op0I->getOpcode() == Instruction::And)
> + return BinaryOperator::CreateOr(NotX, NotY);
> + return BinaryOperator::CreateAnd(NotX, NotY);
> + }
> }
> }
> }
>
> Modified: llvm/trunk/test/Transforms/InstCombine/or.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/or.ll?rev=85085&r1=85084&r2=85085&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/test/Transforms/InstCombine/or.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/or.ll Sun Oct 25 20:06:31
> 2009
> @@ -237,4 +237,19 @@
> ; CHECK: @test24
> ; CHECK: %bothcond = fcmp uno double %Y, %X ; <i1>
> [#uses=1]
> ; CHECK: ret i1 %bothcond
> -}
> \ No newline at end of file
> +}
> +
> +; PR3266 & PR5276
> +define i1 @test25(i32 %A, i32 %B) {
> + %C = icmp eq i32 %A, 0
> + %D = icmp eq i32 %B, 57
> + %E = or i1 %C, %D
> + %F = xor i1 %E, -1
> + ret i1 %F
> +
> +; CHECK: @test25
> +; CHECK: icmp ne i32 %A, 0
> +; CHECK-NEXT: icmp ne i32 %B, 57
> +; CHECK-NEXT: %F = and i1
> +; CHECK-NEXT: ret i1 %F
> +}
>
> Removed: llvm/trunk/test/Transforms/InstCombine/xor-demorgans.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/xor-demorgans.ll?rev=85084&view=auto
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/test/Transforms/InstCombine/xor-demorgans.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/xor-demorgans.ll (removed)
> @@ -1,12 +0,0 @@
> -; RUN: opt < %s -instcombine -S | not grep {= or}
> -; PR3266
> -; XFAIL: *
> -
> -define i1 @foo(i32 %x, i32 %y) nounwind {
> -.summary:
> - %0 = icmp sgt i32 %x, 4 ; <i1> [#uses=1]
> - %1 = icmp sgt i32 %y, 0 ; <i1> [#uses=1]
> - %.demorgan = or i1 %1, %0 ; <i1> [#uses=1]
> - %2 = xor i1 %.demorgan, true ; <i1> [#uses=1]
> - ret i1 %2
> -}
>
>
> _______________________________________________
> 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