Mercurial > hg > CbC > CbC_gcc
diff gcc/valtrack.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/valtrack.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/valtrack.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,6 +1,6 @@ /* Infrastructure for tracking user variable locations and values throughout compilation. - Copyright (C) 2010-2017 Free Software Foundation, Inc. + Copyright (C) 2010-2018 Free Software Foundation, Inc. Contributed by Alexandre Oliva <aoliva@redhat.com>. This file is part of GCC. @@ -94,13 +94,15 @@ case PRE_INC: case PRE_DEC: - gcc_assert (mem_mode != VOIDmode && mem_mode != BLKmode); - return gen_rtx_PLUS (GET_MODE (x), - cleanup_auto_inc_dec (XEXP (x, 0), mem_mode), - gen_int_mode (code == PRE_INC - ? GET_MODE_SIZE (mem_mode) - : -GET_MODE_SIZE (mem_mode), - GET_MODE (x))); + { + gcc_assert (mem_mode != VOIDmode && mem_mode != BLKmode); + poly_int64 offset = GET_MODE_SIZE (mem_mode); + if (code == PRE_DEC) + offset = -offset; + return gen_rtx_PLUS (GET_MODE (x), + cleanup_auto_inc_dec (XEXP (x, 0), mem_mode), + gen_int_mode (offset, GET_MODE (x))); + } case POST_INC: case POST_DEC: @@ -171,10 +173,13 @@ if (REG_P (*iter) && ++cnt > 1) { rtx dval = make_debug_expr_from_rtl (old_rtx); + rtx to = pair->to; + if (volatile_insn_p (to)) + to = gen_rtx_UNKNOWN_VAR_LOC (); /* Emit a debug bind insn. */ rtx bind = gen_rtx_VAR_LOCATION (GET_MODE (old_rtx), - DEBUG_EXPR_TREE_DECL (dval), pair->to, + DEBUG_EXPR_TREE_DECL (dval), to, VAR_INIT_STATUS_INITIALIZED); rtx_insn *bind_insn = emit_debug_insn_before (bind, pair->insn); df_insn_rescan (bind_insn); @@ -211,12 +216,14 @@ { insn = next; next = NEXT_INSN (insn); - if (DEBUG_INSN_P (insn)) + if (DEBUG_BIND_INSN_P (insn)) { loc = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn), dest, propagate_for_debug_subst, &p); if (loc == INSN_VAR_LOCATION_LOC (insn)) continue; + if (volatile_insn_p (loc)) + loc = gen_rtx_UNKNOWN_VAR_LOC (); INSN_VAR_LOCATION_LOC (insn) = loc; df_insn_rescan (insn); } @@ -550,7 +557,7 @@ { if (inner_mode == VOIDmode) inner_mode = GET_MODE (expr); - int offset = subreg_lowpart_offset (outer_mode, inner_mode); + poly_int64 offset = subreg_lowpart_offset (outer_mode, inner_mode); rtx ret = simplify_gen_subreg (outer_mode, expr, inner_mode, offset); if (ret) return ret; @@ -606,10 +613,13 @@ usesp = &cur->next; *tailp = cur->next; cur->next = NULL; + /* "may" rather than "must" because we want (for example) + N V4SFs to win over plain V4SF even though N might be 1. */ + rtx candidate = *DF_REF_REAL_LOC (cur->use); if (!reg - || (GET_MODE_BITSIZE (GET_MODE (reg)) - < GET_MODE_BITSIZE (GET_MODE (*DF_REF_REAL_LOC (cur->use))))) - reg = *DF_REF_REAL_LOC (cur->use); + || maybe_lt (GET_MODE_BITSIZE (GET_MODE (reg)), + GET_MODE_BITSIZE (GET_MODE (candidate)))) + reg = candidate; } else tailp = &(*tailp)->next; @@ -660,6 +670,12 @@ } return 0; } + /* Asm in DEBUG_INSN is never useful, we can't emit debug info for + that. And for volatile_insn_p, it is actually harmful + - DEBUG_INSNs shouldn't have any side-effects. */ + else if (GET_CODE (src) == ASM_OPERANDS + || volatile_insn_p (src)) + set = NULL_RTX; } /* ??? Should we try to extract it from a PARALLEL? */