| //===-- iBranch.cpp - Implement the Branch instruction -----------*- C++ -*--=// |
| // |
| // This file implements the 'br' instruction, which can represent either a |
| // conditional or unconditional branch. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/iTerminators.h" |
| #include "llvm/BasicBlock.h" |
| #ifndef NDEBUG |
| #include "llvm/Type.h" // Only used for assertions... |
| #include "llvm/Assembly/Writer.h" |
| #endif |
| |
| BranchInst::BranchInst(BasicBlock *True, BasicBlock *False, Value *Cond) |
| : TerminatorInst(Instruction::Br), TrueDest(True, this), |
| FalseDest(False, this), Condition(Cond, this) { |
| assert(True != 0 && "True branch destination may not be null!!!"); |
| |
| #ifndef NDEBUG |
| if (Cond != 0 && Cond->getType() != Type::BoolTy) |
| cerr << "Bad Condition: " << Cond << endl; |
| #endif |
| assert((Cond == 0 || Cond->getType() == Type::BoolTy) && |
| "May only branch on boolean predicates!!!!"); |
| } |
| |
| BranchInst::BranchInst(const BranchInst &BI) |
| : TerminatorInst(Instruction::Br), TrueDest(BI.TrueDest, this), |
| FalseDest(BI.FalseDest, this), Condition(BI.Condition, this) { |
| } |
| |
| |
| void BranchInst::dropAllReferences() { |
| Condition = 0; |
| TrueDest = FalseDest = 0; |
| } |
| |
| const Value *BranchInst::getOperand(unsigned i) const { |
| return (i == 0) ? (Value*)TrueDest : |
| ((i == 1) ? (Value*)FalseDest : |
| ((i == 2) ? (Value*)Condition : 0)); |
| } |
| |
| const BasicBlock *BranchInst::getSuccessor(unsigned i) const { |
| return (i == 0) ? (const BasicBlock*)TrueDest : |
| ((i == 1) ? (const BasicBlock*)FalseDest : 0); |
| } |
| |
| bool BranchInst::setOperand(unsigned i, Value *Val) { |
| switch (i) { |
| case 0: |
| assert(Val && "Can't change primary direction to 0!"); |
| assert(Val->getType() == Type::LabelTy); |
| TrueDest = (BasicBlock*)Val; |
| return true; |
| case 1: |
| assert(Val == 0 || Val->getType() == Type::LabelTy); |
| FalseDest = (BasicBlock*)Val; |
| return true; |
| case 2: |
| Condition = Val; |
| assert(!Condition || Condition->getType() == Type::BoolTy && |
| "Condition expr must be a boolean expression!"); |
| return true; |
| } |
| |
| return false; |
| } |