aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2014-02-11 06:58:46 -0700
committerJeff Law <law@gcc.gnu.org>2014-02-11 06:58:46 -0700
commitcddddfff5b66e27088a746554aaa6f6315022ce8 (patch)
tree38c201a84cc798976a515d8d0938e4c6456ab86d
parent7c1aef7e398228f37d8dae0aa3b36d75a8316d15 (diff)
downloadgcc-cddddfff5b66e27088a746554aaa6f6315022ce8.zip
gcc-cddddfff5b66e27088a746554aaa6f6315022ce8.tar.gz
gcc-cddddfff5b66e27088a746554aaa6f6315022ce8.tar.bz2
re PR middle-end/54041 (-mshort ICE in convert_memory_address_addr_space, at explow.c:327)
PR middle-end/54041 * expr.c (expand_expr_addr_expr_1): Handle expand_expr returning an object with an undesirable mode. PR middle-end/54041 * gcc.target/m68k/pr54041.c: New test. From-SVN: r207689
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/m68k/pr54041.c10
4 files changed, 26 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6458a9b..b2d0f83 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-02-11 Jeff Law <law@redhat.com>
+
+ PR middle-end/54041
+ * expr.c (expand_expr_addr_expr_1): Handle expand_expr returning an
+ object with an undesirable mode.
+
2014-02-11 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR libgomp/60107
diff --git a/gcc/expr.c b/gcc/expr.c
index c1f67f4..f6708da 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -7708,6 +7708,11 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
modifier == EXPAND_INITIALIZER
? EXPAND_INITIALIZER : EXPAND_NORMAL);
+ /* expand_expr is allowed to return an object in a mode other
+ than TMODE. If it did, we need to convert. */
+ if (GET_MODE (tmp) != VOIDmode && tmode != GET_MODE (tmp))
+ tmp = convert_modes (tmode, GET_MODE (tmp),
+ tmp, TYPE_UNSIGNED (TREE_TYPE (offset)));
result = convert_memory_address_addr_space (tmode, result, as);
tmp = convert_memory_address_addr_space (tmode, tmp, as);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ae66ff5..2333347 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-02-11 Jeff Law <law@redhat.com>
+
+ PR middle-end/54041
+ * gcc.target/m68k/pr54041.c: New test.
+
2014-02-11 Jakub Jelinek <jakub@redhat.com>
PR target/59927
diff --git a/gcc/testsuite/gcc.target/m68k/pr54041.c b/gcc/testsuite/gcc.target/m68k/pr54041.c
new file mode 100644
index 0000000..645cb6d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/m68k/pr54041.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O -mshort" } */
+
+extern int r[];
+
+int *fn(int i)
+{
+ return &r[i];
+}
+