From b6edff93aecdc9fb6a3dede4e79181469ea680b8 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Sun, 28 Dec 2014 22:39:01 +0000 Subject: [PATCH] irgen: do not emit an extra terminator for panic thunks Found with GoSmith. Differential Revision: http://reviews.llvm.org/D6714 llvm-svn: 224904 --- llgo/irgen/builtins.go | 6 ++++-- llgo/irgen/ssa.go | 4 ++-- llgo/test/irgen/go-panic.go | 10 ++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 llgo/test/irgen/go-panic.go diff --git a/llgo/irgen/builtins.go b/llgo/irgen/builtins.go index 404962fd85b1..8e4dc8722105 100644 --- a/llgo/irgen/builtins.go +++ b/llgo/irgen/builtins.go @@ -110,7 +110,9 @@ func (fr *frame) callRecover(isDeferredRecover bool) *govalue { return newValue(llv, eface) } -func (fr *frame) callPanic(arg *govalue) { +func (fr *frame) callPanic(arg *govalue, term bool) { fr.runtime.panic.call(fr, arg.value) - fr.builder.CreateUnreachable() + if term { + fr.builder.CreateUnreachable() + } } diff --git a/llgo/irgen/ssa.go b/llgo/irgen/ssa.go index 2c7c20200bde..706eb7790e75 100644 --- a/llgo/irgen/ssa.go +++ b/llgo/irgen/ssa.go @@ -1079,7 +1079,7 @@ func (fr *frame) instruction(instr ssa.Instruction) { case *ssa.Panic: arg := fr.value(instr.X) - fr.callPanic(arg) + fr.callPanic(arg, true) case *ssa.Phi: typ := instr.Type() @@ -1190,7 +1190,7 @@ func (fr *frame) callBuiltin(typ types.Type, builtin *ssa.Builtin, args []ssa.Va return nil case "panic": - fr.callPanic(fr.value(args[0])) + fr.callPanic(fr.value(args[0]), false) return nil case "recover": diff --git a/llgo/test/irgen/go-panic.go b/llgo/test/irgen/go-panic.go new file mode 100644 index 000000000000..35b0a47bb9b5 --- /dev/null +++ b/llgo/test/irgen/go-panic.go @@ -0,0 +1,10 @@ +// RUN: llgo -S -emit-llvm -o - %s | FileCheck %s + +package foo + +func F() { + // CHECK: call void @__go_panic + // CHECK-NEXT: ret void + // CHECK-NEXT: } + go panic("") +}