re PR rtl-optimization/91173 (ICE: in int_mode_for_mode, at stor-layout.c:403)
authorJeff Law <law@redhat.com>
Tue, 16 Jul 2019 14:44:44 +0000 (08:44 -0600)
committerJeff Law <law@gcc.gnu.org>
Tue, 16 Jul 2019 14:44:44 +0000 (08:44 -0600)
PR rtl-optimization/91173
* tree-ssa-address.c (addr_for_mem_ref): If the base is an
SSA_NAME with a constant value, fold its value into the offset
and clear the base before calling gen_addr_rtx.

From-SVN: r273529

gcc/ChangeLog
gcc/tree-ssa-address.c

index 1eb2797d85fe883f231d9fc3fc9a87aab522ed50..2bce569e320d74b3db484aa50f746fd69118e1a8 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-16  Jeff Law  <law@redhat.com>
+
+       PR rtl-optimization/91173
+       * tree-ssa-address.c (addr_for_mem_ref): If the base is an
+       SSA_NAME with a constant value, fold its value into the offset
+       and clear the base before calling gen_addr_rtx.
+
 2019-07-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/91164
index e83e1b9296fc3fa2c55ddd5998c562624936084c..8004951d2e875241eebc37cb22d10fd70307c43d 100644 (file)
@@ -259,6 +259,20 @@ addr_for_mem_ref (struct mem_address *addr, addr_space_t as,
         ? expand_expr (addr->index, NULL_RTX, pointer_mode, EXPAND_NORMAL)
         : NULL_RTX);
 
+  /* addr->base could be an SSA_NAME that was set to a constant value.  The
+     call to expand_expr may expose that constant.  If so, fold the value
+     into OFF and clear BSE.  Otherwise we may later try to pull a mode from
+     BSE to generate a REG, which won't work with constants because they
+     are modeless.  */
+  if (bse && GET_CODE (bse) == CONST_INT)
+    {
+      if (off)
+       off = simplify_gen_binary (PLUS, pointer_mode, bse, off);
+      else
+       off = bse;
+      gcc_assert (GET_CODE (off) == CONST_INT);
+      bse = NULL_RTX;
+    }
   gen_addr_rtx (pointer_mode, sym, bse, idx, st, off, &address, NULL, NULL);
   if (pointer_mode != address_mode)
     address = convert_memory_address (address_mode, address);