mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:50:30 +00:00
Canonicalize ConstantInts to the right operand of commutative
operators. The test difference is just due to the multiplication operands being commuted (and thus requiring a more elaborate match). In optimized code, that expression would be folded. llvm-svn: 96816
This commit is contained in:
parent
e4d3e9772a
commit
97481fb5e0
@ -794,8 +794,8 @@ Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, const Type *DestTy,
|
||||
// it is casted back to a pointer, see if the expression can be
|
||||
// converted into a GEP.
|
||||
if (CE->getOpcode() == Instruction::Add)
|
||||
if (ConstantInt *L = dyn_cast<ConstantInt>(CE->getOperand(0)))
|
||||
if (ConstantExpr *R = dyn_cast<ConstantExpr>(CE->getOperand(1)))
|
||||
if (ConstantInt *L = dyn_cast<ConstantInt>(CE->getOperand(1)))
|
||||
if (ConstantExpr *R = dyn_cast<ConstantExpr>(CE->getOperand(0)))
|
||||
if (R->getOpcode() == Instruction::PtrToInt)
|
||||
if (GlobalVariable *GV =
|
||||
dyn_cast<GlobalVariable>(R->getOperand(0))) {
|
||||
|
@ -1105,6 +1105,10 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
|
||||
return ConstantExpr::getLShr(C1, C2);
|
||||
break;
|
||||
}
|
||||
} else if (isa<ConstantInt>(C1)) {
|
||||
// If C1 is a ConstantInt and C2 is not, swap the operands.
|
||||
if (Instruction::isCommutative(Opcode))
|
||||
return ConstantExpr::get(Opcode, C2, C1);
|
||||
}
|
||||
|
||||
// At this point we know neither constant is an UndefValue.
|
||||
|
@ -9,6 +9,6 @@
|
||||
|
||||
; CHECK: .globl x
|
||||
; CHECK: x:
|
||||
; CHECK: .quad 3
|
||||
; CHECK: .quad ((0+1)&4294967295)*3
|
||||
|
||||
@x = global i64 mul (i64 3, i64 ptrtoint (i2* getelementptr (i2* null, i64 1) to i64))
|
||||
|
Loading…
Reference in New Issue
Block a user