From: Nick Lewycky Date: Thu, 23 Apr 2009 05:15:08 +0000 (+0000) Subject: Simplify trunc(extend(x)) in SCEVs, just for completeness. Also fix some odd X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=5cd28fad15b3bab840dac5ecdc2bdfde4f74816a Simplify trunc(extend(x)) in SCEVs, just for completeness. Also fix some odd whitespace in the same file. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69870 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index cebf4d704fe..409bad91669 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -658,6 +658,14 @@ SCEVHandle ScalarEvolution::getTruncateExpr(const SCEVHandle &Op, const Type *Ty if (SCEVTruncateExpr *ST = dyn_cast(Op)) return getTruncateExpr(ST->getOperand(), Ty); + // trunc(sext(x)) --> sext(x) if widening or trunc(x) if narrowing + if (SCEVSignExtendExpr *SS = dyn_cast(Op)) + return getTruncateOrSignExtend(SS->getOperand(), Ty); + + // trunc(zext(x)) --> zext(x) if widening or trunc(x) if narrowing + if (SCEVZeroExtendExpr *SZ = dyn_cast(Op)) + return getTruncateOrZeroExtend(SZ->getOperand(), Ty); + // If the input value is a chrec scev made out of constants, truncate // all of the constants. if (SCEVAddRecExpr *AddRec = dyn_cast(Op)) { @@ -1152,7 +1160,7 @@ SCEVHandle ScalarEvolution::getAddRecExpr(const SCEVHandle &Start, /// SCEVAddRecExpr::get - Get a add recurrence expression for the /// specified loop. Simplify the expression as much as possible. SCEVHandle ScalarEvolution::getAddRecExpr(std::vector &Operands, - const Loop *L) { + const Loop *L) { if (Operands.size() == 1) return Operands[0]; if (Operands.back()->isZero()) { @@ -1484,7 +1492,7 @@ SCEVHandle ScalarEvolution::getNotSCEV(const SCEVHandle &V) { /// getMinusSCEV - Return a SCEV corresponding to LHS - RHS. /// SCEVHandle ScalarEvolution::getMinusSCEV(const SCEVHandle &LHS, - const SCEVHandle &RHS) { + const SCEVHandle &RHS) { // X - Y --> X + -Y return getAddExpr(LHS, getNegativeSCEV(RHS)); } @@ -1494,7 +1502,7 @@ SCEVHandle ScalarEvolution::getMinusSCEV(const SCEVHandle &LHS, /// extended. SCEVHandle ScalarEvolution::getTruncateOrZeroExtend(const SCEVHandle &V, - const Type *Ty) { + const Type *Ty) { const Type *SrcTy = V->getType(); assert((SrcTy->isInteger() || (TD && isa(SrcTy))) && (Ty->isInteger() || (TD && isa(Ty))) && @@ -1511,7 +1519,7 @@ ScalarEvolution::getTruncateOrZeroExtend(const SCEVHandle &V, /// extended. SCEVHandle ScalarEvolution::getTruncateOrSignExtend(const SCEVHandle &V, - const Type *Ty) { + const Type *Ty) { const Type *SrcTy = V->getType(); assert((SrcTy->isInteger() || (TD && isa(SrcTy))) && (Ty->isInteger() || (TD && isa(Ty))) && diff --git a/test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll b/test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll new file mode 100644 index 00000000000..4af79af84db --- /dev/null +++ b/test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll @@ -0,0 +1,37 @@ +; RUN: llvm-as < %s | opt -analyze -scalar-evolution | grep truncate | not grep extend + +define i16 @test1(i8 %x) { + %A = sext i8 %x to i32 + %B = trunc i32 %A to i16 + ret i16 %B +} + +define i8 @test2(i16 %x) { + %A = sext i16 %x to i32 + %B = trunc i32 %A to i8 + ret i8 %B +} + +define i16 @test3(i16 %x) { + %A = sext i16 %x to i32 + %B = trunc i32 %A to i16 + ret i16 %B +} + +define i16 @test4(i8 %x) { + %A = zext i8 %x to i32 + %B = trunc i32 %A to i16 + ret i16 %B +} + +define i8 @test5(i16 %x) { + %A = zext i16 %x to i32 + %B = trunc i32 %A to i8 + ret i8 %B +} + +define i16 @test6(i16 %x) { + %A = zext i16 %x to i32 + %B = trunc i32 %A to i16 + ret i16 %B +}