summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorJohn Criswell <criswell@uiuc.edu>2005-05-11 21:16:42 +0000
committerJohn Criswell <criswell@uiuc.edu>2005-05-11 21:16:42 +0000
commit72002e87cc7bcd2e1be60ffa158cd61c88c80696 (patch)
tree03871f02b957dbc6ca8bfe53542da81e8dbc6042 /llvm/lib
parent991ce367980b4d9980c13a387c0d3a39290f3ba4 (diff)
downloadbcm5719-llvm-72002e87cc7bcd2e1be60ffa158cd61c88c80696.tar.gz
bcm5719-llvm-72002e87cc7bcd2e1be60ffa158cd61c88c80696.zip
Added support for decomposing constant expressions containing shr and shl
instructions. Review of this commit would be greatly appreciated. llvm-svn: 21876
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp b/llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp
index 7e801243ae3..a13019e2061 100644
--- a/llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp
+++ b/llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp
@@ -146,6 +146,30 @@ static Instruction* DecomposeConstantExpr(ConstantExpr* CE,
return new SelectInst (C, S1, S2, "constantSelect", &insertBefore);
}
+ case Instruction::Shr: {
+ getArg1 = CE->getOperand(0);
+ if (ConstantExpr* CEarg = dyn_cast<ConstantExpr>(getArg1))
+ getArg1 = DecomposeConstantExpr(CEarg, insertBefore);
+ getArg2 = CE->getOperand(1);
+ if (ConstantExpr* CEarg = dyn_cast<ConstantExpr>(getArg2))
+ getArg2 = DecomposeConstantExpr(CEarg, insertBefore);
+ return new ShiftInst (static_cast<Instruction::OtherOps>(CE->getOpcode()),
+ getArg1, getArg2,
+ "constantShr:" + getArg1->getName(), &insertBefore);
+ }
+
+ case Instruction::Shl: {
+ getArg1 = CE->getOperand(0);
+ if (ConstantExpr* CEarg = dyn_cast<ConstantExpr>(getArg1))
+ getArg1 = DecomposeConstantExpr(CEarg, insertBefore);
+ getArg2 = CE->getOperand(1);
+ if (ConstantExpr* CEarg = dyn_cast<ConstantExpr>(getArg2))
+ getArg2 = DecomposeConstantExpr(CEarg, insertBefore);
+ return new ShiftInst (static_cast<Instruction::OtherOps>(CE->getOpcode()),
+ getArg1, getArg2,
+ "constantShl:" + getArg1->getName(), &insertBefore);
+ }
+
default: // must be a binary operator
assert(CE->getOpcode() >= Instruction::BinaryOpsBegin &&
CE->getOpcode() < Instruction::BinaryOpsEnd &&
OpenPOWER on IntegriCloud