[llvm-commits] [llvm] r52440 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/sext-misc.ll

Dan Gohman gohman at apple.com
Wed Jun 18 09:14:18 PDT 2008


Hi Chris

sext-misc.ll now fails with three sext instructions that aren't
being eliminated that previously were. Can you investigate?

Thanks,

Dan

On Tue, June 17, 2008 9:00 pm, Chris Lattner wrote:
> Author: lattner
> Date: Tue Jun 17 23:00:49 2008
> New Revision: 52440
>
> URL: http://llvm.org/viewvc/llvm-project?rev=52440&view=rev
> Log:
> make truncate/sext elimination capable of changing phi's.  This
> implements rdar://6013816 and the testcase in
> Transforms/InstCombine/sext-misc.ll.
>
> Modified:
>     llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
>     llvm/trunk/test/Transforms/InstCombine/sext-misc.ll
>
> Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=52440&r1=52439&r2=52440&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Tue Jun 17
> 23:00:49 2008
> @@ -6838,6 +6838,16 @@
>  ///
>  /// This is a truncation operation if Ty is smaller than V->getType(), or
> an
>  /// extension operation if Ty is larger.
> +///
> +/// If CastOpc is a truncation, then Ty will be a type smaller than V.
> We
> +/// should return true if trunc(V) can be computed by computing V in the
> smaller
> +/// type.  If V is an instruction, then trunc(inst(x,y)) can be computed
> as
> +/// inst(trunc(x),trunc(y)), which only makes sense if x and y can be
> +/// efficiently truncated.
> +///
> +/// If CastOpc is a sext or zext, we are asking if the low bits of the
> value can
> +/// bit computed in a larger type, which is then and'd or sext_in_reg'd
> to get
> +/// the final result.
>  bool InstCombiner::CanEvaluateInDifferentType(Value *V, const IntegerType
> *Ty,
>                                                unsigned CastOpc,
>                                                int &NumCastsRemoved) {
> @@ -6858,7 +6868,7 @@
>        // If the first operand is itself a cast, and is eliminable, do not
> count
>        // this as an eliminable cast.  We would prefer to eliminate those
> two
>        // casts first.
> -      if (!isa<CastInst>(I->getOperand(0)))
> +      if (!isa<CastInst>(I->getOperand(0)) && I->hasOneUse())
>          ++NumCastsRemoved;
>        return true;
>      }
> @@ -6923,8 +6933,17 @@
>      // of casts in the input.
>      if (I->getOpcode() == CastOpc)
>        return true;
> -
>      break;
> +
> +  case Instruction::PHI: {
> +    // We can change a phi if we can change all operands.
> +    PHINode *PN = cast<PHINode>(I);
> +    for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
> +      if (!CanEvaluateInDifferentType(PN->getIncomingValue(i), Ty,
> CastOpc,
> +                                      NumCastsRemoved))
> +        return false;
> +    return true;
> +  }
>    default:
>      // TODO: Can handle more cases here.
>      break;
> @@ -6957,7 +6976,7 @@
>      Value *LHS = EvaluateInDifferentType(I->getOperand(0), Ty, isSigned);
>      Value *RHS = EvaluateInDifferentType(I->getOperand(1), Ty, isSigned);
>      Res = BinaryOperator::Create((Instruction::BinaryOps)I->getOpcode(),
> -                                 LHS, RHS, I->getName());
> +                                 LHS, RHS);
>      break;
>    }
>    case Instruction::Trunc:
> @@ -6969,16 +6988,27 @@
>      if (I->getOperand(0)->getType() == Ty)
>        return I->getOperand(0);
>
> -    // Otherwise, must be the same type of case, so just reinsert a new
> one.
> +    // Otherwise, must be the same type of cast, so just reinsert a new
> one.
>      Res = CastInst::Create(cast<CastInst>(I)->getOpcode(),
> I->getOperand(0),
> -                           Ty, I->getName());
> +                           Ty);
>      break;
> +  case Instruction::PHI: {
> +    PHINode *OPN = cast<PHINode>(I);
> +    PHINode *NPN = PHINode::Create(Ty);
> +    for (unsigned i = 0, e = OPN->getNumIncomingValues(); i != e; ++i) {
> +      Value *V =EvaluateInDifferentType(OPN->getIncomingValue(i), Ty,
> isSigned);
> +      NPN->addIncoming(V, OPN->getIncomingBlock(i));
> +    }
> +    Res = NPN;
> +    break;
> +  }
>    default:
>      // TODO: Can handle more cases here.
>      assert(0 && "Unreachable!");
>      break;
>    }
>
> +  Res->takeName(I);
>    return InsertNewInstBefore(Res, *I);
>  }
>
>
> Modified: llvm/trunk/test/Transforms/InstCombine/sext-misc.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/sext-misc.ll?rev=52440&r1=52439&r2=52440&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/sext-misc.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/sext-misc.ll Tue Jun 17
> 23:00:49 2008
> @@ -1,6 +1,4 @@
>  ; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep sext
> -; RUN: llvm-as < %s | llc -march=x86-64 | not grep movslq
> -; RUN: llvm-as < %s | llc -march=x86 | not grep sar
>
>  declare i32 @llvm.ctpop.i32(i32)
>  declare i32 @llvm.ctlz.i32(i32)
> @@ -50,3 +48,18 @@
>    %n = sext i16 %s to i32
>    ret i32 %n
>  }
> +
> +; rdar://6013816
> +define i16 @test(i16 %t, i1 %cond) nounwind {
> +entry:
> +	br i1 %cond, label %T, label %F
> +T:
> +	%t2 = sext i16 %t to i32
> +	br label %F
> +
> +F:
> +	%V = phi i32 [%t2, %T], [42, %entry]
> +	%W = trunc i32 %V to i16
> +	ret i16 %W
> +}
> +
>
>
> _______________________________________________
> 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