diff options
author | Amaury Sechet <deadalnix@gmail.com> | 2016-02-11 21:37:54 +0000 |
---|---|---|
committer | Amaury Sechet <deadalnix@gmail.com> | 2016-02-11 21:37:54 +0000 |
commit | c2e77df6b8baf8ffb49bf96ce296f71736cab0b6 (patch) | |
tree | e356253396a79aee79a90419bc9a64ed883db0e6 /tools/llvm-c-test | |
parent | c83ca6a674886ea348f8c1612b49dfe26776c21f (diff) |
Add support for phi nodes in the LLVM C API test
Summary: This required to add binding to Instruction::removeFromParent so that instruction can be forward declared and then moved at the right place.
Reviewers: bogner, chandlerc, echristo, dblaikie, joker.eph, Wallbraker
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D17057
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260597 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-c-test')
-rw-r--r-- | tools/llvm-c-test/echo.cpp | 55 |
1 files changed, 37 insertions, 18 deletions
diff --git a/tools/llvm-c-test/echo.cpp b/tools/llvm-c-test/echo.cpp index 47f366c2f8a..8d679b6928a 100644 --- a/tools/llvm-c-test/echo.cpp +++ b/tools/llvm-c-test/echo.cpp @@ -206,24 +206,20 @@ struct FunCloner { } // Function argument should always be in the map already. - if (LLVMIsAArgument(Src)) { - auto i = VMap.find(Src); - if (i != VMap.end()) - return i->second; - } + auto i = VMap.find(Src); + if (i != VMap.end()) + return i->second; - if (LLVMIsAInstruction(Src)) { - auto Ctx = LLVMGetModuleContext(M); - auto Builder = LLVMCreateBuilderInContext(Ctx); - auto BB = DeclareBB(LLVMGetInstructionParent(Src)); - LLVMPositionBuilderAtEnd(Builder, BB); - auto Dst = CloneInstruction(Src, Builder); - LLVMDisposeBuilder(Builder); - return Dst; - } + if (!LLVMIsAInstruction(Src)) + report_fatal_error("Expected an instruction"); - fprintf(stderr, "Could not determine the type of %s\n", Name); - exit(-1); + auto Ctx = LLVMGetModuleContext(M); + auto Builder = LLVMCreateBuilderInContext(Ctx); + auto BB = DeclareBB(LLVMGetInstructionParent(Src)); + LLVMPositionBuilderAtEnd(Builder, BB); + auto Dst = CloneInstruction(Src, Builder); + LLVMDisposeBuilder(Builder); + return Dst; } LLVMValueRef CloneInstruction(LLVMValueRef Src, LLVMBuilderRef Builder) { @@ -234,8 +230,15 @@ struct FunCloner { // Check if this is something we already computed. { auto i = VMap.find(Src); - if (i != VMap.end()) - return i->second; + if (i != VMap.end()) { + // If we have a hit, it means we already generated the instruction + // as a dependancy to somethign else. We need to make sure + // it is ordered properly. + auto I = i->second; + LLVMInstructionRemoveFromParent(I); + LLVMInsertIntoBuilderWithName(Builder, I, Name); + return I; + } } // We tried everything, it must be an instruction @@ -365,6 +368,22 @@ struct FunCloner { Dst = LLVMBuildICmp(Builder, Pred, LHS, RHS, Name); break; } + case LLVMPHI: { + // We need to agressively set things here because of loops. + VMap[Src] = Dst = LLVMBuildPhi(Builder, CloneType(Src), Name); + + SmallVector<LLVMValueRef, 8> Values; + SmallVector<LLVMBasicBlockRef, 8> Blocks; + + unsigned IncomingCount = LLVMCountIncoming(Src); + for (unsigned i = 0; i < IncomingCount; ++i) { + Blocks.push_back(DeclareBB(LLVMGetIncomingBlock(Src, i))); + Values.push_back(CloneValue(LLVMGetIncomingValue(Src, i))); + } + + LLVMAddIncoming(Dst, Values.data(), Blocks.data(), IncomingCount); + return Dst; + } case LLVMCall: { SmallVector<LLVMValueRef, 8> Args; int ArgCount = LLVMGetNumArgOperands(Src); |