[llvm-commits] [llvm] r69870 - in /llvm/trunk: lib/Analysis/ScalarEvolution.cpp test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll
Nick Lewycky
nicholas at mxc.ca
Wed Apr 22 22:15:09 PDT 2009
Author: nicholas
Date: Thu Apr 23 00:15:08 2009
New Revision: 69870
URL: http://llvm.org/viewvc/llvm-project?rev=69870&view=rev
Log:
Simplify trunc(extend(x)) in SCEVs, just for completeness. Also fix some odd
whitespace in the same file.
Added:
llvm/trunk/test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll
Modified:
llvm/trunk/lib/Analysis/ScalarEvolution.cpp
Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=69870&r1=69869&r2=69870&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Thu Apr 23 00:15:08 2009
@@ -658,6 +658,14 @@
if (SCEVTruncateExpr *ST = dyn_cast<SCEVTruncateExpr>(Op))
return getTruncateExpr(ST->getOperand(), Ty);
+ // trunc(sext(x)) --> sext(x) if widening or trunc(x) if narrowing
+ if (SCEVSignExtendExpr *SS = dyn_cast<SCEVSignExtendExpr>(Op))
+ return getTruncateOrSignExtend(SS->getOperand(), Ty);
+
+ // trunc(zext(x)) --> zext(x) if widening or trunc(x) if narrowing
+ if (SCEVZeroExtendExpr *SZ = dyn_cast<SCEVZeroExtendExpr>(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<SCEVAddRecExpr>(Op)) {
@@ -1152,7 +1160,7 @@
/// SCEVAddRecExpr::get - Get a add recurrence expression for the
/// specified loop. Simplify the expression as much as possible.
SCEVHandle ScalarEvolution::getAddRecExpr(std::vector<SCEVHandle> &Operands,
- const Loop *L) {
+ const Loop *L) {
if (Operands.size() == 1) return Operands[0];
if (Operands.back()->isZero()) {
@@ -1484,7 +1492,7 @@
/// 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 @@
/// extended.
SCEVHandle
ScalarEvolution::getTruncateOrZeroExtend(const SCEVHandle &V,
- const Type *Ty) {
+ const Type *Ty) {
const Type *SrcTy = V->getType();
assert((SrcTy->isInteger() || (TD && isa<PointerType>(SrcTy))) &&
(Ty->isInteger() || (TD && isa<PointerType>(Ty))) &&
@@ -1511,7 +1519,7 @@
/// extended.
SCEVHandle
ScalarEvolution::getTruncateOrSignExtend(const SCEVHandle &V,
- const Type *Ty) {
+ const Type *Ty) {
const Type *SrcTy = V->getType();
assert((SrcTy->isInteger() || (TD && isa<PointerType>(SrcTy))) &&
(Ty->isInteger() || (TD && isa<PointerType>(Ty))) &&
Added: llvm/trunk/test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll?rev=69870&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll (added)
+++ llvm/trunk/test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll Thu Apr 23 00:15:08 2009
@@ -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
+}
More information about the llvm-commits
mailing list