aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2010-07-02 11:48:30 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2010-07-02 11:48:30 +0000
commit1a4fc49d7fccd1048eec7c73153e5de4da0a5885 (patch)
tree6f82b49dda63de30e711545eed096b715a9481f4 /gcc
parentd1f736a2d7b21c9fcc19355e8dcd82c99051c107 (diff)
downloadgcc-1a4fc49d7fccd1048eec7c73153e5de4da0a5885.zip
gcc-1a4fc49d7fccd1048eec7c73153e5de4da0a5885.tar.gz
gcc-1a4fc49d7fccd1048eec7c73153e5de4da0a5885.tar.bz2
re PR target/44707 (operand requires impossible reload)
ChangeLog: PR target/44707 * config/rs6000/rs6000.c (rs6000_legitimize_reload_address): Recognize (lo_sum (high ...) ...) patterns generated by earlier passes. testsuite/ChangeLog: PR target/44707 * gcc.c-torture/compile/pr44707.c: New test. From-SVN: r161703
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr44707.c14
4 files changed, 36 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c1e0ae7..4d05ea2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-07-02 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+
+ PR target/44707
+ * config/rs6000/rs6000.c (rs6000_legitimize_reload_address): Recognize
+ (lo_sum (high ...) ...) patterns generated by earlier passes.
+
2010-07-02 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* doc/install.texi (Prerequisites): Document Perl requirement on
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 36187c9..a98b4dd 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -5934,6 +5934,17 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
return x;
}
+ /* Likewise for (lo_sum (high ...) ...) output we have generated. */
+ if (GET_CODE (x) == LO_SUM
+ && GET_CODE (XEXP (x, 0)) == HIGH)
+ {
+ push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
+ BASE_REG_CLASS, Pmode, VOIDmode, 0, 0,
+ opnum, (enum reload_type)type);
+ *win = 1;
+ return x;
+ }
+
#if TARGET_MACHO
if (DEFAULT_ABI == ABI_DARWIN && flag_pic
&& GET_CODE (x) == LO_SUM
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c1a291d..9fe76bc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-07-02 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+
+ PR target/44707
+ * gcc.c-torture/compile/pr44707.c: New test.
+
2010-07-02 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/44039
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44707.c b/gcc/testsuite/gcc.c-torture/compile/pr44707.c
new file mode 100644
index 0000000..9031f00
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr44707.c
@@ -0,0 +1,14 @@
+extern struct { int a, b, c, d; } v;
+extern int w;
+
+void
+foo (void)
+{
+ int e1 = v.a;
+ int e2 = w;
+ int e3 = v.b;
+ int e4 = v.c;
+ int e5 = v.d;
+ __asm__ volatile ("/* %0 %1 %2 %3 %4 */" : : "nro" (e1), "nro" (e2), "nro" (e3), "nro" (e4), "nro" (e5));
+}
+