summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2014-12-28 22:39:01 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2014-12-28 22:39:01 +0000
commitb6edff93aecdc9fb6a3dede4e79181469ea680b8 (patch)
tree5dadcc001d7434a2c70f029874c328c8f26c2993
parent06039218f5ef078b7a815a68d2f9eca44658d7f0 (diff)
downloadbcm5719-llvm-b6edff93aecdc9fb6a3dede4e79181469ea680b8.tar.gz
bcm5719-llvm-b6edff93aecdc9fb6a3dede4e79181469ea680b8.zip
irgen: do not emit an extra terminator for panic thunks
Found with GoSmith. Differential Revision: http://reviews.llvm.org/D6714 llvm-svn: 224904
-rw-r--r--llgo/irgen/builtins.go6
-rw-r--r--llgo/irgen/ssa.go4
-rw-r--r--llgo/test/irgen/go-panic.go10
3 files changed, 16 insertions, 4 deletions
diff --git a/llgo/irgen/builtins.go b/llgo/irgen/builtins.go
index 404962fd85b..8e4dc872210 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 2c7c20200bd..706eb7790e7 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 00000000000..35b0a47bb9b
--- /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("")
+}
OpenPOWER on IntegriCloud