From: Chris Lattner Date: Sun, 10 Jan 2010 02:22:12 +0000 (+0000) Subject: enhance CanEvaluateZExtd to handle shift left and sext, allowing X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d26c9e183e56d09f48d7074be4cacce099338316;p=oota-llvm.git enhance CanEvaluateZExtd to handle shift left and sext, allowing more expressions to be promoted and casts eliminated. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93096 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/InstCombine/InstCombineCasts.cpp b/lib/Transforms/InstCombine/InstCombineCasts.cpp index a6833b88257..3ad786b6bdd 100644 --- a/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -643,17 +643,31 @@ static int CanEvaluateZExtd(Value *V, const Type *Ty,unsigned &NumCastsRemoved, if (Tmp1 == -1) return -1; Tmp2 = CanEvaluateZExtd(I->getOperand(1), Ty, NumCastsRemoved, TD); if (Tmp2 == -1) return -1; + return 0; // TODO: Could be improved. + + case Instruction::Shl: + Tmp1 = CanEvaluateZExtd(I->getOperand(0), Ty, NumCastsRemoved, TD); + if (Tmp1 == -1) return -1; + + if (ConstantInt *CI = dyn_cast(I->getOperand(1))) + return Tmp1 - CI->getZExtValue(); + + // Variable shift, no known zext bits. + Tmp2 = CanEvaluateZExtd(I->getOperand(1), Ty, NumCastsRemoved, TD); + if (Tmp2 == -1) return -1; return 0; - //case Instruction::Shl: //case Instruction::LShr: case Instruction::ZExt: // zext(zext(x)) -> zext(x). Since we're replacing it, it isn't eliminated. Tmp1 = Ty->getScalarSizeInBits()-OrigTy->getScalarSizeInBits(); return GetLeadingZeros(I, TD)+Tmp1; - //case Instruction::SExt: zext(sext(x)) -> sext(x) with no upper bits known. - //case Instruction::Trunc: + case Instruction::SExt: + // zext(sext(x)) -> sext(x) with no upper bits known. + return 0; + //case Instruction::Trunc: -> Could turn into AND. + case Instruction::Select: Tmp1 = CanEvaluateZExtd(I->getOperand(1), Ty, NumCastsRemoved, TD); if (Tmp1 == -1) return -1; diff --git a/test/Transforms/InstCombine/cast.ll b/test/Transforms/InstCombine/cast.ll index b6dc4642b8e..490df8fab6e 100644 --- a/test/Transforms/InstCombine/cast.ll +++ b/test/Transforms/InstCombine/cast.ll @@ -403,3 +403,31 @@ define i64 @test44(i8 %T) { ; CHECK-NEXT: %B = or i64 %A, 1234 ; CHECK-NEXT: ret i64 %B } + +define i64 @test45(i8 %A, i64 %Q) { + %D = trunc i64 %Q to i32 ;; should be removed + %B = sext i8 %A to i32 + %C = or i32 %B, %D + %E = zext i32 %C to i64 + ret i64 %E +; CHECK: @test45 +; CHECK-NEXT: %B = sext i8 %A to i64 +; CHECK-NEXT: %C = or i64 %B, %Q +; CHECK-NEXT: %E = and i64 %C, 4294967295 +; CHECK-NEXT: ret i64 %E +} + + +define i64 @test46(i64 %A) { + %B = trunc i64 %A to i32 + %C = and i32 %B, 42 + %D = shl i32 %C, 8 + %E = zext i32 %D to i64 + ret i64 %E +; CHECK: @test46 +; CHECK-NEXT: %C = shl i64 %A, 8 +; CHECK-NEXT: %D = and i64 %C, 10752 +; CHECK-NEXT: ret i64 %D +} + +