mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-15 06:29:05 +00:00
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
This commit is contained in:
@@ -658,6 +658,14 @@ SCEVHandle ScalarEvolution::getTruncateExpr(const SCEVHandle &Op, const Type *Ty
|
|||||||
if (SCEVTruncateExpr *ST = dyn_cast<SCEVTruncateExpr>(Op))
|
if (SCEVTruncateExpr *ST = dyn_cast<SCEVTruncateExpr>(Op))
|
||||||
return getTruncateExpr(ST->getOperand(), Ty);
|
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
|
// If the input value is a chrec scev made out of constants, truncate
|
||||||
// all of the constants.
|
// all of the constants.
|
||||||
if (SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Op)) {
|
if (SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Op)) {
|
||||||
@@ -1152,7 +1160,7 @@ SCEVHandle ScalarEvolution::getAddRecExpr(const SCEVHandle &Start,
|
|||||||
/// SCEVAddRecExpr::get - Get a add recurrence expression for the
|
/// SCEVAddRecExpr::get - Get a add recurrence expression for the
|
||||||
/// specified loop. Simplify the expression as much as possible.
|
/// specified loop. Simplify the expression as much as possible.
|
||||||
SCEVHandle ScalarEvolution::getAddRecExpr(std::vector<SCEVHandle> &Operands,
|
SCEVHandle ScalarEvolution::getAddRecExpr(std::vector<SCEVHandle> &Operands,
|
||||||
const Loop *L) {
|
const Loop *L) {
|
||||||
if (Operands.size() == 1) return Operands[0];
|
if (Operands.size() == 1) return Operands[0];
|
||||||
|
|
||||||
if (Operands.back()->isZero()) {
|
if (Operands.back()->isZero()) {
|
||||||
@@ -1484,7 +1492,7 @@ SCEVHandle ScalarEvolution::getNotSCEV(const SCEVHandle &V) {
|
|||||||
/// getMinusSCEV - Return a SCEV corresponding to LHS - RHS.
|
/// getMinusSCEV - Return a SCEV corresponding to LHS - RHS.
|
||||||
///
|
///
|
||||||
SCEVHandle ScalarEvolution::getMinusSCEV(const SCEVHandle &LHS,
|
SCEVHandle ScalarEvolution::getMinusSCEV(const SCEVHandle &LHS,
|
||||||
const SCEVHandle &RHS) {
|
const SCEVHandle &RHS) {
|
||||||
// X - Y --> X + -Y
|
// X - Y --> X + -Y
|
||||||
return getAddExpr(LHS, getNegativeSCEV(RHS));
|
return getAddExpr(LHS, getNegativeSCEV(RHS));
|
||||||
}
|
}
|
||||||
@@ -1494,7 +1502,7 @@ SCEVHandle ScalarEvolution::getMinusSCEV(const SCEVHandle &LHS,
|
|||||||
/// extended.
|
/// extended.
|
||||||
SCEVHandle
|
SCEVHandle
|
||||||
ScalarEvolution::getTruncateOrZeroExtend(const SCEVHandle &V,
|
ScalarEvolution::getTruncateOrZeroExtend(const SCEVHandle &V,
|
||||||
const Type *Ty) {
|
const Type *Ty) {
|
||||||
const Type *SrcTy = V->getType();
|
const Type *SrcTy = V->getType();
|
||||||
assert((SrcTy->isInteger() || (TD && isa<PointerType>(SrcTy))) &&
|
assert((SrcTy->isInteger() || (TD && isa<PointerType>(SrcTy))) &&
|
||||||
(Ty->isInteger() || (TD && isa<PointerType>(Ty))) &&
|
(Ty->isInteger() || (TD && isa<PointerType>(Ty))) &&
|
||||||
@@ -1511,7 +1519,7 @@ ScalarEvolution::getTruncateOrZeroExtend(const SCEVHandle &V,
|
|||||||
/// extended.
|
/// extended.
|
||||||
SCEVHandle
|
SCEVHandle
|
||||||
ScalarEvolution::getTruncateOrSignExtend(const SCEVHandle &V,
|
ScalarEvolution::getTruncateOrSignExtend(const SCEVHandle &V,
|
||||||
const Type *Ty) {
|
const Type *Ty) {
|
||||||
const Type *SrcTy = V->getType();
|
const Type *SrcTy = V->getType();
|
||||||
assert((SrcTy->isInteger() || (TD && isa<PointerType>(SrcTy))) &&
|
assert((SrcTy->isInteger() || (TD && isa<PointerType>(SrcTy))) &&
|
||||||
(Ty->isInteger() || (TD && isa<PointerType>(Ty))) &&
|
(Ty->isInteger() || (TD && isa<PointerType>(Ty))) &&
|
||||||
|
37
test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll
Normal file
37
test/Analysis/ScalarEvolution/2009-04-22-TruncCast.ll
Normal file
@@ -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
|
||||||
|
}
|
Reference in New Issue
Block a user