diff options
author | John Criswell <criswell@uiuc.edu> | 2005-05-11 21:16:42 +0000 |
---|---|---|
committer | John Criswell <criswell@uiuc.edu> | 2005-05-11 21:16:42 +0000 |
commit | 3163e2d9f3276bdf143e940f17d94b2429b7fa4c (patch) | |
tree | 1e1a1e64dee30bcebc3b189575c844cce8220fda | |
parent | 98cf45bbf6b6efc1b90d4744082149e9b5f3e17a (diff) |
Added support for decomposing constant expressions containing shr and shl
instructions.
Review of this commit would be greatly appreciated.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21876 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/SparcV9/SparcV9PreSelection.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/Target/SparcV9/SparcV9PreSelection.cpp b/lib/Target/SparcV9/SparcV9PreSelection.cpp index 7e801243ae..a13019e206 100644 --- a/lib/Target/SparcV9/SparcV9PreSelection.cpp +++ b/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 && |