aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-08-09 13:18:08 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-08-09 13:18:08 +0000
commit37609bf08645fad9c5ea1cd8e06195c6d0fd2c7d (patch)
tree984aa1c2d7e2924a37b0e1cf8fc8668425da6919 /gcc
parent87d072e09a5d49a55384bdc7f38d4210c65bd343 (diff)
downloadgcc-37609bf08645fad9c5ea1cd8e06195c6d0fd2c7d.zip
gcc-37609bf08645fad9c5ea1cd8e06195c6d0fd2c7d.tar.gz
gcc-37609bf08645fad9c5ea1cd8e06195c6d0fd2c7d.tar.bz2
re PR tree-optimization/44632 (wrong code for complex division)
2010-08-09 Richard Guenther <rguenther@suse.de> PR middle-end/44632 * function.c (gimplify_parameters): Do not clear addressable bit of the original parameter. * g++.dg/opt/nrv17.C: New testcase. From-SVN: r163031
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/function.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/nrv17.C32
4 files changed, 46 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ace409d..eea2550 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2010-08-09 Richard Guenther <rguenther@suse.de>
+ PR middle-end/44632
+ * function.c (gimplify_parameters): Do not clear addressable
+ bit of the original parameter.
+
+2010-08-09 Richard Guenther <rguenther@suse.de>
+
PR middle-end/45212
* emit-rtl.c (set_mem_attributes_minus_bitpos): Adjust
alignment from MEM_REF offset only if we took it from the
diff --git a/gcc/function.c b/gcc/function.c
index e89a5c9..a540d05 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3570,12 +3570,10 @@ gimplify_parameters (void)
DECL_IGNORED_P (local) = 0;
/* If PARM was addressable, move that flag over
to the local copy, as its address will be taken,
- not the PARMs. */
+ not the PARMs. Keep the parms address taken
+ as we'll query that flag during gimplification. */
if (TREE_ADDRESSABLE (parm))
- {
- TREE_ADDRESSABLE (parm) = 0;
- TREE_ADDRESSABLE (local) = 1;
- }
+ TREE_ADDRESSABLE (local) = 1;
}
else
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4455729..93ed62f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2010-08-09 Richard Guenther <rguenther@suse.de>
+ PR middle-end/44632
+ * g++.dg/opt/nrv17.C: New testcase.
+
+2010-08-09 Richard Guenther <rguenther@suse.de>
+
PR middle-end/45212
* emit-rtl.c (set_mem_attributes_minus_bitpos): Adjust
alignment from MEM_REF offset only if we took it from the
diff --git a/gcc/testsuite/g++.dg/opt/nrv17.C b/gcc/testsuite/g++.dg/opt/nrv17.C
new file mode 100644
index 0000000..6248bca
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/nrv17.C
@@ -0,0 +1,32 @@
+// { dg-do run }
+
+#include <cstdlib>
+#include <complex>
+
+void __attribute__((noinline))
+h(std::complex<double> x)
+{
+ if (x.real() != 2.0)
+ std::abort ();
+}
+
+void __attribute__((noinline))
+g(std::complex<double> x)
+{
+ if (x.real() != 0.5)
+ std::abort ();
+}
+
+void __attribute__((noinline))
+f(std::complex<double> x)
+{
+ h (x);
+ x = 1.0 / x;
+ g (x);
+}
+
+int main()
+{
+ f(2.0);
+ return 0;
+}