]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/54041 (-mshort ICE in convert_memory_address_addr_space, at explow...
authorJeff Law <law@redhat.com>
Tue, 11 Feb 2014 13:58:46 +0000 (06:58 -0700)
committerJeff Law <law@gcc.gnu.org>
Tue, 11 Feb 2014 13:58:46 +0000 (06:58 -0700)
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

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/m68k/pr54041.c [new file with mode: 0644]

index 6458a9b5188e225bef6bc167be10f658f95833b5..b2d0f8370f5597fa5d48423f5381671a9bc99772 100644 (file)
@@ -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
index c1f67f4e4a04d2a1b4f6e784714d30200b091d6a..f6708da20d9ea0e8920e52e07374af9a6f313371 100644 (file)
@@ -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);
 
index ae66ff54c13874a9324f2b43d3af4bc0f0496a42..2333347dee05033ff314959a1ddb993dbfa5ce65 100644 (file)
@@ -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 (file)
index 0000000..645cb6d
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O -mshort" } */
+
+extern int r[];
+
+int *fn(int i)
+{
+       return &r[i];
+}
+