From 0e5f32e66e6bd98e67956723f44f2ae2d1c07dcf Mon Sep 17 00:00:00 2001
From: Andrea Shepard <andrea@persephoneslair.org>
Date: Wed, 9 Nov 2016 20:58:46 +0000
Subject: [PATCH] Phis in ch_llvm()

---
 src/parsers/ch.c | 29 ++++++++++++-----------------
 1 file changed, 12 insertions(+), 17 deletions(-)

diff --git a/src/parsers/ch.c b/src/parsers/ch.c
index 65b951d7..a7ac9bec 100644
--- a/src/parsers/ch.c
+++ b/src/parsers/ch.c
@@ -61,14 +61,10 @@ static bool ch_llvm(LLVMBuilderRef builder, LLVMValueRef func, LLVMModuleRef mod
   // Set up basic blocks: entry, success and failure branches, then exit
   LLVMBasicBlockRef entry = LLVMAppendBasicBlock(func, "ch_entry");
   LLVMBasicBlockRef success = LLVMAppendBasicBlock(func, "ch_success");
-  LLVMBasicBlockRef fail = LLVMAppendBasicBlock(func, "ch_fail");
   LLVMBasicBlockRef end = LLVMAppendBasicBlock(func, "ch_end");
 
   // Basic block: entry
   LLVMPositionBuilderAtEnd(builder, entry);
-  // Allocate stack space for our return value
-  // %ret = alloca %struct.HParseResult_*, align 8
-  LLVMValueRef ret = LLVMBuildAlloca(builder, llvm_parseresultptr, "ret");
 
   // Call to h_read_bits()
   // %read_bits = call i64 @h_read_bits(%struct.HInputStream_* %8, i32 8, i8 signext 0)
@@ -84,7 +80,7 @@ static bool ch_llvm(LLVMBuilderRef builder, LLVMValueRef func, LLVMModuleRef mod
 
   // Branch so success or failure basic block, as appropriate
   // br i1 %"c == r", label %ch_success, label %ch_fail
-  LLVMBuildCondBr(builder, icmp, success, fail);
+  LLVMBuildCondBr(builder, icmp, success, end);
 
   // Basic block: success
   LLVMPositionBuilderAtEnd(builder, success);
@@ -126,23 +122,22 @@ static bool ch_llvm(LLVMBuilderRef builder, LLVMValueRef func, LLVMModuleRef mod
   LLVMValueRef result_args[] = { arena, tok };
   LLVMValueRef mr = LLVMBuildCall(builder, LLVMGetNamedFunction(mod, "make_result"), result_args, 2, "make_result");
 
-  // Store for return
-  // store %struct.HParseResult_.3* %make_result, %struct.HParseResult_.3** %ret
-  LLVMBuildStore(builder, mr, ret);
   // br label %ch_end
   LLVMBuildBr(builder, end);
   
-  // Basic block: failure
-  LLVMPositionBuilderAtEnd(builder, fail);
-  // store %struct.HParseResult_.3* null, %struct.HParseResult_.3** %ret
-  LLVMBuildStore(builder, LLVMConstNull(llvm_parseresultptr), ret);
-  // br label %ch_end
-  LLVMBuildBr(builder, end);
-
   // Basic block: end
   LLVMPositionBuilderAtEnd(builder, end);
-  // %rv = load %struct.HParseResult_.3*, %struct.HParseResult_.3** %ret
-  LLVMValueRef rv = LLVMBuildLoad(builder, ret, "rv");
+  // %rv = phi %struct.HParseResult_.3* [ %make_result, %ch_success ], [ null, %ch_entry ]
+  LLVMValueRef rv = LLVMBuildPhi(builder, llvm_parseresultptr, "rv");
+  LLVMBasicBlockRef rv_phi_incoming_blocks[] = {
+    success,
+    entry
+    };
+  LLVMValueRef rv_phi_incoming_values[] = {
+    mr,
+    LLVMConstNull(llvm_parseresultptr)
+    };
+  LLVMAddIncoming(rv, rv_phi_incoming_values, rv_phi_incoming_blocks, 2);
   // ret %struct.HParseResult_.3* %rv
   LLVMBuildRet(builder, rv);
   return true;
-- 
GitLab