mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +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,
|
||||
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:
|
||||
// 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.
|
||||
@ -6571,6 +6580,7 @@ Value *InstCombiner::EvaluateInDifferentType(Value *V, const Type *Ty,
|
||||
switch (I->getOpcode()) {
|
||||
case Instruction::Add:
|
||||
case Instruction::Sub:
|
||||
case Instruction::Mul:
|
||||
case Instruction::And:
|
||||
case Instruction::Or:
|
||||
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