diff options
Diffstat (limited to 'llvm/tools/llvm-c-test/echo.cpp')
-rw-r--r-- | llvm/tools/llvm-c-test/echo.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp index 97883863ed6..3e25d0e7702 100644 --- a/llvm/tools/llvm-c-test/echo.cpp +++ b/llvm/tools/llvm-c-test/echo.cpp @@ -216,8 +216,19 @@ struct FunCloner { break; } case LLVMBr: { - LLVMBasicBlockRef SrcBB = LLVMValueAsBasicBlock(LLVMGetOperand(Src, 0)); - Dst = LLVMBuildBr(Builder, DeclareBB(SrcBB)); + if (!LLVMIsConditional(Src)) { + LLVMValueRef SrcOp = LLVMGetOperand(Src, 0); + LLVMBasicBlockRef SrcBB = LLVMValueAsBasicBlock(SrcOp); + Dst = LLVMBuildBr(Builder, DeclareBB(SrcBB)); + break; + } + + LLVMValueRef Cond = LLVMGetCondition(Src); + LLVMValueRef Else = LLVMGetOperand(Src, 1); + LLVMBasicBlockRef ElseBB = DeclareBB(LLVMValueAsBasicBlock(Else)); + LLVMValueRef Then = LLVMGetOperand(Src, 2); + LLVMBasicBlockRef ThenBB = DeclareBB(LLVMValueAsBasicBlock(Then)); + Dst = LLVMBuildCondBr(Builder, Cond, ThenBB, ElseBB); break; } case LLVMSwitch: @@ -311,6 +322,13 @@ struct FunCloner { Dst = LLVMBuildAlloca(Builder, Ty, Name); break; } + case LLVMICmp: { + LLVMIntPredicate Pred = LLVMGetICmpPredicate(Src); + LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder); + LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder); + Dst = LLVMBuildICmp(Builder, Pred, LHS, RHS, Name); + break; + } case LLVMCall: { int ArgCount = LLVMGetNumOperands(Src) - 1; SmallVector<LLVMValueRef, 8> Args; |