4520524ba0
With this commit we're starting a series of updates of ARC tools. Significantly rewritten arc-2016.03 tools introduced way too many problems highlighted by Buildroot autobuilder. Now in attempt to resolve as many issues as possible by the time final release of arc-2016.09 tools is cut we'll be executing arc-2016.09 series with engineering snapshots like this one. We decided to go this way instead of applying separate patches here and there because ongoing development introduces quite a lot of changes and separate patches are not practical in Buildroot. Moreover this will give us very clean visibility of number of issues we see (hopefully it will decrease over time). One of the important changes introduced in this engineering build is initial set of changes for proper support of PIE on ARC in terms of both building on host and running on ARC target. I expect some PIE-related build breakages to go away and new ones will be treated as the high-priority issues to be fixed ASAP. For now we only update Binutils and GCC while keeping GDB as it is of arc-2016.03 release because there're some issues we'd like to resolve before releasing it to wider audience. So again note this is one of the first engineering builds of arc-2016.09 series and it might have all kinds of breakages, please don't use it for production builds. Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com> Cc: arc-buildroot@synopsys.com Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Cc: Peter Korsgaard <peter@korsgaard.com> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
112 lines
2.6 KiB
Diff
112 lines
2.6 KiB
Diff
From gcc bugzilla https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60155
|
|
Upstream status: in trunk.
|
|
|
|
Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>
|
|
|
|
--- trunk/gcc/gcse.c 2014/02/12 14:50:06 207726
|
|
+++ trunk/gcc/gcse.c 2014/04/04 22:25:51 209134
|
|
@@ -2502,6 +2502,65 @@
|
|
}
|
|
}
|
|
|
|
+struct set_data
|
|
+{
|
|
+ rtx insn;
|
|
+ const_rtx set;
|
|
+ int nsets;
|
|
+};
|
|
+
|
|
+/* Increment number of sets and record set in DATA. */
|
|
+
|
|
+static void
|
|
+record_set_data (rtx dest, const_rtx set, void *data)
|
|
+{
|
|
+ struct set_data *s = (struct set_data *)data;
|
|
+
|
|
+ if (GET_CODE (set) == SET)
|
|
+ {
|
|
+ /* We allow insns having multiple sets, where all but one are
|
|
+ dead as single set insns. In the common case only a single
|
|
+ set is present, so we want to avoid checking for REG_UNUSED
|
|
+ notes unless necessary. */
|
|
+ if (s->nsets == 1
|
|
+ && find_reg_note (s->insn, REG_UNUSED, SET_DEST (s->set))
|
|
+ && !side_effects_p (s->set))
|
|
+ s->nsets = 0;
|
|
+
|
|
+ if (!s->nsets)
|
|
+ {
|
|
+ /* Record this set. */
|
|
+ s->nsets += 1;
|
|
+ s->set = set;
|
|
+ }
|
|
+ else if (!find_reg_note (s->insn, REG_UNUSED, dest)
|
|
+ || side_effects_p (set))
|
|
+ s->nsets += 1;
|
|
+ }
|
|
+}
|
|
+
|
|
+static const_rtx
|
|
+single_set_gcse (rtx insn)
|
|
+{
|
|
+ struct set_data s;
|
|
+ rtx pattern;
|
|
+
|
|
+ gcc_assert (INSN_P (insn));
|
|
+
|
|
+ /* Optimize common case. */
|
|
+ pattern = PATTERN (insn);
|
|
+ if (GET_CODE (pattern) == SET)
|
|
+ return pattern;
|
|
+
|
|
+ s.insn = insn;
|
|
+ s.nsets = 0;
|
|
+ note_stores (pattern, record_set_data, &s);
|
|
+
|
|
+ /* Considered invariant insns have exactly one set. */
|
|
+ gcc_assert (s.nsets == 1);
|
|
+ return s.set;
|
|
+}
|
|
+
|
|
/* Emit move from SRC to DEST noting the equivalence with expression computed
|
|
in INSN. */
|
|
|
|
@@ -2509,7 +2568,8 @@
|
|
gcse_emit_move_after (rtx dest, rtx src, rtx insn)
|
|
{
|
|
rtx new_rtx;
|
|
- rtx set = single_set (insn), set2;
|
|
+ const_rtx set = single_set_gcse (insn);
|
|
+ rtx set2;
|
|
rtx note;
|
|
rtx eqv = NULL_RTX;
|
|
|
|
@@ -3369,13 +3429,12 @@
|
|
FOR_EACH_VEC_ELT (occrs_to_hoist, j, occr)
|
|
{
|
|
rtx insn;
|
|
- rtx set;
|
|
+ const_rtx set;
|
|
|
|
gcc_assert (!occr->deleted_p);
|
|
|
|
insn = occr->insn;
|
|
- set = single_set (insn);
|
|
- gcc_assert (set);
|
|
+ set = single_set_gcse (insn);
|
|
|
|
/* Create a pseudo-reg to store the result of reaching
|
|
expressions into. Get the mode for the new pseudo
|
|
@@ -3456,10 +3515,8 @@
|
|
{
|
|
rtx reg;
|
|
enum reg_class pressure_class;
|
|
- rtx set = single_set (insn);
|
|
+ const_rtx set = single_set_gcse (insn);
|
|
|
|
- /* Considered invariant insns have only one set. */
|
|
- gcc_assert (set != NULL_RTX);
|
|
reg = SET_DEST (set);
|
|
if (GET_CODE (reg) == SUBREG)
|
|
reg = SUBREG_REG (reg);
|