mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
Multiply can be evaluated in a different type, so long as the target type has
a smaller bitwidth. llvm-svn: 46244
This commit is contained in:
parent
c964ccb2c4
commit
78780f175b
@ -6512,6 +6512,15 @@ static bool CanEvaluateInDifferentType(Value *V, const IntegerType *Ty,
|
|||||||
CanEvaluateInDifferentType(I->getOperand(1), Ty, CastOpc,
|
CanEvaluateInDifferentType(I->getOperand(1), Ty, CastOpc,
|
||||||
NumCastsRemoved);
|
NumCastsRemoved);
|
||||||
|
|
||||||
|
case Instruction::Mul:
|
||||||
|
break;
|
||||||
|
// A multiply can be truncated by truncating its operands.
|
||||||
|
return Ty->getBitWidth() < OrigTy->getBitWidth() &&
|
||||||
|
CanEvaluateInDifferentType(I->getOperand(0), Ty, CastOpc,
|
||||||
|
NumCastsRemoved) &&
|
||||||
|
CanEvaluateInDifferentType(I->getOperand(1), Ty, CastOpc,
|
||||||
|
NumCastsRemoved);
|
||||||
|
|
||||||
case Instruction::Shl:
|
case Instruction::Shl:
|
||||||
// If we are truncating the result of this SHL, and if it's a shift of a
|
// If we are truncating the result of this SHL, and if it's a shift of a
|
||||||
// constant amount, we can always perform a SHL in a smaller type.
|
// constant amount, we can always perform a SHL in a smaller type.
|
||||||
@ -6571,6 +6580,7 @@ Value *InstCombiner::EvaluateInDifferentType(Value *V, const Type *Ty,
|
|||||||
switch (I->getOpcode()) {
|
switch (I->getOpcode()) {
|
||||||
case Instruction::Add:
|
case Instruction::Add:
|
||||||
case Instruction::Sub:
|
case Instruction::Sub:
|
||||||
|
case Instruction::Mul:
|
||||||
case Instruction::And:
|
case Instruction::And:
|
||||||
case Instruction::Or:
|
case Instruction::Or:
|
||||||
case Instruction::Xor:
|
case Instruction::Xor:
|
||||||
|
11
test/Transforms/InstCombine/2008-01-21-MulTrunc.ll
Normal file
11
test/Transforms/InstCombine/2008-01-21-MulTrunc.ll
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | notcast
|
||||||
|
|
||||||
|
define i16 @test1(i16 %a) {
|
||||||
|
%tmp = zext i16 %a to i32 ; <i32> [#uses=2]
|
||||||
|
%tmp21 = lshr i32 %tmp, 8 ; <i32> [#uses=1]
|
||||||
|
%tmp5 = mul i32 %tmp, 5 ; <i32> [#uses=1]
|
||||||
|
%tmp.upgrd.32 = or i32 %tmp21, %tmp5 ; <i32> [#uses=1]
|
||||||
|
%tmp.upgrd.3 = trunc i32 %tmp.upgrd.32 to i16 ; <i16> [#uses=1]
|
||||||
|
ret i16 %tmp.upgrd.3
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user