diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a8d1591dd487a25bead18cd1182668ab0d21fe58..2af2c32edd65891f1140dea9dc609ab80451799f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-02  Richard Guenther  <rguenther@suse.de>
+
+	PR tree-optimization/47566
+	* builtins.c (builtin_save_expr): No SAVE_EXPR for SSA_NAMEs.
+
 2011-02-02  Alexandre Oliva  <aoliva@redhat.com>
 
 	PR debug/47106
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 5b7b673f90ed2ab85cee5a98c9014bd008b1fd48..106b2ca10b0ae23308c1c18252bfd95cc46b9c36 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -652,9 +652,10 @@ target_char_cast (tree cst, char *p)
 static tree
 builtin_save_expr (tree exp)
 {
-  if (TREE_ADDRESSABLE (exp) == 0
-      && (TREE_CODE (exp) == PARM_DECL
-	  || (TREE_CODE (exp) == VAR_DECL && !TREE_STATIC (exp))))
+  if (TREE_CODE (exp) == SSA_NAME
+      || (TREE_ADDRESSABLE (exp) == 0
+	  && (TREE_CODE (exp) == PARM_DECL
+	      || (TREE_CODE (exp) == VAR_DECL && !TREE_STATIC (exp)))))
     return exp;
 
   return save_expr (exp);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c2d6ef4fed690c5ac8d86160d1c960dfe607f046..4040f63e79a549ef7240aa9588665e67a720d062 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-02  Richard Guenther  <rguenther@suse.de>
+
+	PR tree-optimization/47566
+	* gcc.dg/lto/20110201-1_0.c: New testcase.
+
 2011-02-02  Alexandre Oliva  <aoliva@redhat.com>
 
 	PR debug/47498
diff --git a/gcc/testsuite/gcc.dg/lto/20110201-1_0.c b/gcc/testsuite/gcc.dg/lto/20110201-1_0.c
new file mode 100644
index 0000000000000000000000000000000000000000..f5d335572ee5a2ff0c73ba30166ea0d13b9fb0ee
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/20110201-1_0.c
@@ -0,0 +1,19 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { { -O0 -flto } } } */
+/* { dg-extra-ld-options "-O2 -ffast-math -fuse-linker-plugin" } */
+/* { dg-require-linker-plugin "" } */
+
+/* We require a linker plugin because otherwise we'd need to link
+   against libm which we are not sure here has cabs on all targets.
+   This is because collect2 invokes ld on the -O0 object code
+   which does not have folded cabs.  */
+
+double cabs(_Complex double);
+double __attribute__((used))
+foo (_Complex double x, int b)
+{
+  if (b)
+    x = 0;
+  return cabs(x);
+}
+int main() { return 0; }