OSDN Git Service

PR c++/39786
[pf3gnuchains/gcc-fork.git] / gcc / var-tracking.c
index acc4d13..5cc8ced 100644 (file)
@@ -4359,7 +4359,9 @@ replace_expr_with_values (rtx loc)
     return NULL;
   else if (MEM_P (loc))
     {
-      cselib_val *addr = cselib_lookup (XEXP (loc, 0), Pmode, 0);
+      enum machine_mode address_mode
+       = targetm.addr_space.address_mode (MEM_ADDR_SPACE (loc));
+      cselib_val *addr = cselib_lookup (XEXP (loc, 0), address_mode, 0);
       if (addr)
        return replace_equiv_address_nv (loc, addr->val_rtx);
       else
@@ -4493,7 +4495,9 @@ count_uses (rtx *loc, void *cuip)
          if (MEM_P (*loc)
              && !REG_P (XEXP (*loc, 0)) && !MEM_P (XEXP (*loc, 0)))
            {
-             val = cselib_lookup (XEXP (*loc, 0), Pmode, false);
+             enum machine_mode address_mode
+               = targetm.addr_space.address_mode (MEM_ADDR_SPACE (*loc));
+             val = cselib_lookup (XEXP (*loc, 0), address_mode, false);
 
              if (val && !cselib_preserved_value_p (val))
                {
@@ -4613,7 +4617,10 @@ add_uses (rtx *loc, void *data)
              && !REG_P (XEXP (vloc, 0)) && !MEM_P (XEXP (vloc, 0)))
            {
              rtx mloc = vloc;
-             cselib_val *val = cselib_lookup (XEXP (mloc, 0), Pmode, 0);
+             enum machine_mode address_mode
+               = targetm.addr_space.address_mode (MEM_ADDR_SPACE (mloc));
+             cselib_val *val
+               = cselib_lookup (XEXP (mloc, 0), address_mode, 0);
 
              if (val && !cselib_preserved_value_p (val))
                {
@@ -4624,7 +4631,8 @@ add_uses (rtx *loc, void *data)
                  cselib_preserve_value (val);
                  mo->type = MO_VAL_USE;
                  mloc = cselib_subst_to_values (XEXP (mloc, 0));
-                 mo->u.loc = gen_rtx_CONCAT (Pmode, val->val_rtx, mloc);
+                 mo->u.loc = gen_rtx_CONCAT (address_mode,
+                                             val->val_rtx, mloc);
                  if (dump_file && (dump_flags & TDF_DETAILS))
                    log_op_type (mo->u.loc, cui->bb, cui->insn,
                                 mo->type, dump_file);
@@ -4680,7 +4688,10 @@ add_uses (rtx *loc, void *data)
              && !REG_P (XEXP (oloc, 0)) && !MEM_P (XEXP (oloc, 0)))
            {
              rtx mloc = oloc;
-             cselib_val *val = cselib_lookup (XEXP (mloc, 0), Pmode, 0);
+             enum machine_mode address_mode
+               = targetm.addr_space.address_mode (MEM_ADDR_SPACE (mloc));
+             cselib_val *val
+               = cselib_lookup (XEXP (mloc, 0), address_mode, 0);
 
              if (val && !cselib_preserved_value_p (val))
                {
@@ -4691,7 +4702,8 @@ add_uses (rtx *loc, void *data)
                  cselib_preserve_value (val);
                  mo->type = MO_VAL_USE;
                  mloc = cselib_subst_to_values (XEXP (mloc, 0));
-                 mo->u.loc = gen_rtx_CONCAT (Pmode, val->val_rtx, mloc);
+                 mo->u.loc = gen_rtx_CONCAT (address_mode,
+                                             val->val_rtx, mloc);
                  mo->insn = cui->insn;
                  if (dump_file && (dump_flags & TDF_DETAILS))
                    log_op_type (mo->u.loc, cui->bb, cui->insn,
@@ -4824,14 +4836,16 @@ add_stores (rtx loc, const_rtx expr, void *cuip)
          && !REG_P (XEXP (loc, 0)) && !MEM_P (XEXP (loc, 0)))
        {
          rtx mloc = loc;
-         cselib_val *val = cselib_lookup (XEXP (mloc, 0), Pmode, 0);
+         enum machine_mode address_mode
+           = targetm.addr_space.address_mode (MEM_ADDR_SPACE (mloc));
+         cselib_val *val = cselib_lookup (XEXP (mloc, 0), address_mode, 0);
 
          if (val && !cselib_preserved_value_p (val))
            {
              cselib_preserve_value (val);
              mo->type = MO_VAL_USE;
              mloc = cselib_subst_to_values (XEXP (mloc, 0));
-             mo->u.loc = gen_rtx_CONCAT (Pmode, val->val_rtx, mloc);
+             mo->u.loc = gen_rtx_CONCAT (address_mode, val->val_rtx, mloc);
              mo->insn = cui->insn;
              if (dump_file && (dump_flags & TDF_DETAILS))
                log_op_type (mo->u.loc, cui->bb, cui->insn,
@@ -6246,24 +6260,6 @@ delete_variable_part (dataflow_set *set, rtx loc, decl_or_value dv,
   slot = delete_slot_part (set, loc, slot, offset);
 }
 
-/* Wrap result in CONST:MODE if needed to preserve the mode.  */
-
-static rtx
-check_wrap_constant (enum machine_mode mode, rtx result)
-{
-  if (!result || GET_MODE (result) == mode)
-    return result;
-
-  if (dump_file && (dump_flags & TDF_DETAILS))
-    fprintf (dump_file, "  wrapping result in const to preserve mode %s\n",
-            GET_MODE_NAME (mode));
-
-  result = wrap_constant (mode, result);
-  gcc_assert (GET_MODE (result) == mode);
-
-  return result;
-}
-
 /* Callback for cselib_expand_value, that looks for expressions
    holding the value in the var-tracking hash tables.  Return X for
    standard processing, anything else is to be used as-is.  */
@@ -6337,7 +6333,6 @@ vt_expand_loc_callback (rtx x, bitmap regs, int max_depth, void *data)
     {
       result = cselib_expand_value_rtx_cb (loc->loc, regs, max_depth,
                                           vt_expand_loc_callback, vars);
-      result = check_wrap_constant (GET_MODE (loc->loc), result);
       if (result)
        break;
     }
@@ -6355,14 +6350,11 @@ vt_expand_loc_callback (rtx x, bitmap regs, int max_depth, void *data)
 static rtx
 vt_expand_loc (rtx loc, htab_t vars)
 {
-  rtx newloc;
-
   if (!MAY_HAVE_DEBUG_INSNS)
     return loc;
 
-  newloc = cselib_expand_value_rtx_cb (loc, scratch_regs, 5,
-                                      vt_expand_loc_callback, vars);
-  loc = check_wrap_constant (GET_MODE (loc), newloc);
+  loc = cselib_expand_value_rtx_cb (loc, scratch_regs, 5,
+                                   vt_expand_loc_callback, vars);
 
   if (loc && MEM_P (loc))
     loc = targetm.delegitimize_address (loc);
@@ -6424,7 +6416,7 @@ emit_note_insn_var_location (void **varp, void *data)
          continue;
        }
       loc[n_var_parts] = loc2;
-      mode = GET_MODE (loc[n_var_parts]);
+      mode = GET_MODE (var->var_part[i].loc_chain->loc);
       initialized = var->var_part[i].loc_chain->init;
       last_limit = offsets[n_var_parts] + GET_MODE_SIZE (mode);
 
@@ -6435,9 +6427,10 @@ emit_note_insn_var_location (void **varp, void *data)
          break;
       if (j < var->n_var_parts
          && wider_mode != VOIDmode
+         && mode == GET_MODE (var->var_part[j].loc_chain->loc)
+         && (REG_P (loc[n_var_parts]) || MEM_P (loc[n_var_parts]))
          && (loc2 = vt_expand_loc (var->var_part[j].loc_chain->loc, vars))
          && GET_CODE (loc[n_var_parts]) == GET_CODE (loc2)
-         && mode == GET_MODE (loc2)
          && last_limit == var->var_part[j].offset)
        {
          rtx new_loc = NULL;