Add support for constant select expressions. Clarify the assertion failure msg.

llvm-svn: 12613
This commit is contained in:
Brian Gaeke 2004-04-02 17:52:29 +00:00
parent 3838243d04
commit cc24411c0a
1 changed files with 17 additions and 3 deletions

View File

@ -104,7 +104,7 @@ static Instruction* DecomposeConstantExpr(ConstantExpr* CE,
Instruction& insertBefore) Instruction& insertBefore)
{ {
Value *getArg1, *getArg2; Value *getArg1, *getArg2;
switch(CE->getOpcode()) switch(CE->getOpcode())
{ {
case Instruction::Cast: case Instruction::Cast:
@ -124,11 +124,25 @@ static Instruction* DecomposeConstantExpr(ConstantExpr* CE,
return new GetElementPtrInst(getArg1, return new GetElementPtrInst(getArg1,
std::vector<Value*>(CE->op_begin()+1, CE->op_end()), std::vector<Value*>(CE->op_begin()+1, CE->op_end()),
"constantGEP", &insertBefore); "constantGEP", &insertBefore);
case Instruction::Select: {
Value *C, *S1, *S2;
C = CE->getOperand (0);
if (ConstantExpr* CEarg = dyn_cast<ConstantExpr> (C))
C = DecomposeConstantExpr (CEarg, insertBefore);
S1 = CE->getOperand (1);
if (ConstantExpr* CEarg = dyn_cast<ConstantExpr> (S1))
S1 = DecomposeConstantExpr (CEarg, insertBefore);
S2 = CE->getOperand (2);
if (ConstantExpr* CEarg = dyn_cast<ConstantExpr> (S2))
S2 = DecomposeConstantExpr (CEarg, insertBefore);
return new SelectInst (C, S1, S2);
}
default: // must be a binary operator default: // must be a binary operator
assert(CE->getOpcode() >= Instruction::BinaryOpsBegin && assert(CE->getOpcode() >= Instruction::BinaryOpsBegin &&
CE->getOpcode() < Instruction::BinaryOpsEnd && CE->getOpcode() < Instruction::BinaryOpsEnd &&
"Unrecognized opcode in ConstantExpr"); "Unhandled opcode in ConstantExpr");
getArg1 = CE->getOperand(0); getArg1 = CE->getOperand(0);
if (ConstantExpr* CEarg = dyn_cast<ConstantExpr>(getArg1)) if (ConstantExpr* CEarg = dyn_cast<ConstantExpr>(getArg1))
getArg1 = DecomposeConstantExpr(CEarg, insertBefore); getArg1 = DecomposeConstantExpr(CEarg, insertBefore);