diff --git a/src/cmd/gc/swt.c b/src/cmd/gc/swt.c
index ca5455d4790143829be8bbdcd2a88ab82ae495b1..e75971d477214a568dd6f50e52ed55b475729bcc 100644
--- a/src/cmd/gc/swt.c
+++ b/src/cmd/gc/swt.c
@@ -503,7 +503,7 @@ exprbsw(Case *c0, int ncase, int arg)
 
 /*
  * normal (expression) switch.
- * rebulid case statements into if .. goto
+ * rebuild case statements into if .. goto
  */
 static void
 exprswitch(Node *sw)
@@ -533,12 +533,15 @@ exprswitch(Node *sw)
 	 */
 	exprname = N;
 	cas = nil;
-	if(arg != Strue && arg != Sfalse) {
+	if(arg == Strue || arg == Sfalse)
+		exprname = nodbool(arg == Strue);
+	else if(consttype(sw->ntest) >= 0)
+		// leave constants to enable dead code elimination (issue 9608)
+		exprname = sw->ntest;
+	else {
 		exprname = temp(sw->ntest->type);
 		cas = list1(nod(OAS, exprname, sw->ntest));
 		typechecklist(cas, Etop);
-	} else {
-		exprname = nodbool(arg == Strue);
 	}
 
 	c0 = mkcaselist(sw, arg);
diff --git a/test/fixedbugs/issue9608.dir/issue9608.go b/test/fixedbugs/issue9608.dir/issue9608.go
new file mode 100644
index 0000000000000000000000000000000000000000..56b52cc606512be821da103151c6c366d3375b4f
--- /dev/null
+++ b/test/fixedbugs/issue9608.dir/issue9608.go
@@ -0,0 +1,73 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+func fail() // unimplemented, to test dead code elimination
+
+// Test dead code elimination in if statements
+func init() {
+	if false {
+		fail()
+	}
+	if 0 == 1 {
+		fail()
+	}
+}
+
+// Test dead code elimination in ordinary switch statements
+func init() {
+	const x = 0
+	switch x {
+	case 1:
+		fail()
+	}
+
+	switch 1 {
+	case x:
+		fail()
+	}
+
+	switch {
+	case false:
+		fail()
+	}
+
+	const a = "a"
+	switch a {
+	case "b":
+		fail()
+	}
+
+	const snowman = '☃'
+	switch snowman {
+	case '☀':
+		fail()
+	}
+
+	const zero = float64(0.0)
+	const one = float64(1.0)
+	switch one {
+	case -1.0:
+		fail()
+	case zero:
+		fail()
+	}
+
+	switch 1.0i {
+	case 1:
+		fail()
+	case -1i:
+		fail()
+	}
+
+	const no = false
+	switch no {
+	case true:
+		fail()
+	}
+}
+
+func main() {
+}
diff --git a/test/fixedbugs/issue9608.go b/test/fixedbugs/issue9608.go
new file mode 100644
index 0000000000000000000000000000000000000000..92592d76ee3f7481e12776fe0e78f464f1146613
--- /dev/null
+++ b/test/fixedbugs/issue9608.go
@@ -0,0 +1,14 @@
+// rundir
+
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 9608: dead code elimination in switch statements.
+
+// This has to be done as a package rather than as a file,
+// because run.go runs files with 'go run', which passes the
+// -complete flag to compiler, causing it to complain about
+// the intentionally unimplemented function fail.
+
+package ignored