diff options
| author | Pekka Enberg <penberg@kernel.org> | 2011-08-23 20:07:30 +0300 |
|---|---|---|
| committer | Pekka Enberg <penberg@kernel.org> | 2011-08-23 20:07:30 +0300 |
| commit | b78a2674f3275e9de4a18d2302c6529ea7bec774 (patch) | |
| tree | f12be81300d3ef7b29d5947210135a1b90199c21 | |
| parent | 80e549751078e55e852965876642bca1b1f88930 (diff) | |
| download | sparse-dev-b78a2674f3275e9de4a18d2302c6529ea7bec774.tar.gz | |
llvm, sparse: Separate entry and exit basic blocks
Signed-off-by: Pekka Enberg <penberg@kernel.org>
| -rw-r--r-- | sparse-llvm.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/sparse-llvm.c b/sparse-llvm.c index 24bc6000..3ee37eb4 100644 --- a/sparse-llvm.c +++ b/sparse-llvm.c @@ -63,12 +63,16 @@ static void output_insn(struct instruction *insn) { } -static void output_bb(struct basic_block *bb, unsigned long generation) +static void output_bb(LLVMBasicBlockRef bb_ref, struct basic_block *bb, unsigned long generation) { struct instruction *insn; bb->generation = generation; + LLVMBuilderRef builder = LLVMCreateBuilder(); + + LLVMPositionBuilderAtEnd(builder, bb_ref); + FOR_EACH_PTR(bb->insns, insn) { if (!insn->bb) continue; @@ -107,18 +111,22 @@ static void output_fn(LLVMModuleRef module, struct entrypoint *ep) unssa(ep); + LLVMBuilderRef builder = LLVMCreateBuilder(); + + LLVMBasicBlockRef entry = LLVMAppendBasicBlock(function, "entry"); + LLVMBasicBlockRef exit = LLVMAppendBasicBlock(function, "exit"); + FOR_EACH_PTR(ep->bbs, bb) { if (bb->generation == generation) continue; - output_bb(bb, generation); + output_bb(entry, bb, generation); } END_FOR_EACH_PTR(bb); - LLVMBasicBlockRef entry = LLVMAppendBasicBlock(function, "entry"); - - LLVMBuilderRef builder = LLVMCreateBuilder(); - LLVMPositionBuilderAtEnd(builder, entry); + LLVMBuildBr(builder, exit); + + LLVMPositionBuilderAtEnd(builder, exit); if (ret_type == &void_ctype) LLVMBuildRetVoid(builder); |
