On Tue, Jun 27, 2017 at 6:40 PM, Jeff Law <l...@redhat.com> wrote: > On 05/12/2017 05:28 AM, Bin Cheng wrote: >> Hi, >> This patch computes register pressure information on TREE SSA by a backward >> live >> range data flow problem. The major motivation is to estimate register >> pressure >> for inner-most loop on TREE SSA, then other optimizations can use it. So >> far the >> information is used only in predcom later, but it could be useful to >> implement a >> tree level scheduler in order to shrink live ranges. Unfortunately the >> example >> live range shrink pass I implemented doesn't have obvious impact on >> performance. >> I think one reason is TER which effectively undoes its effect. Maybe it >> will be >> useful once TER/expanding is replaced with a better instruction selector, it >> is >> not included in this patch. >> One fact I need to mention is David proposed a similar patch long time ago at >> https://gcc.gnu.org/ml/gcc-patches/2008-12/msg01261.html. It tries to >> compute >> register pressure information on tree ssa and shrink live ranges based on >> that >> information. Unfortunately the patch wasn't merged in the end. There has >> been >> quite changes in GCC implementation, I didn't use its code directly. >> However, >> I did read that patch and had it in mind when implementing this one. If >> there >> is any issue in this patch, it would be me that should be blamed. I also >> sent >> message to David about this patch and the possible relation with his. >> >> Bootstrap and test on x86_64 and AArch64. Is it OK? >> >> Thanks, >> bin >> >> 2017-05-10 Xinliang David Li <davi...@google.com> >> Bin Cheng <bin.ch...@arm.com> >> >> * Makefile.in (tree-ssa-regpressure.o): New object file. >> * tree-ssa-regpressure.c: New file. >> * tree-ssa-regpressure.h: New file. > Any thoughts on tests, either end-to-end or unit testing? > > At a high level does this make more sense as a pass or as a function > that is called by other passes? I don't have a strong opinion here, > just putting the question out there for discussion. > > You've got a live computation solver in here. Is there some reason you > don't use the existing life analysis code? I'd prefer not have have > another life analysis implementation if we can avoid it. And if you > were using that code, I think you can easily get the coalescing data > you're using as well. > > I haven't gone through all the detail in the patch as I think we need to > make sure we've got the design issues right first. BUt there are a > couple nits noted inline below. > > Hi Jeff, Thanks very much for the review. I plan to revisit this after current tasks as well as study more benchmark cases for register pressure.
Thanks, bin > > > > >> >> >> 0003-tree-ssa-regpressure-20170504.txt >> >> >> From bf6e51ff68d87c372719de567d4de49d77744f77 Mon Sep 17 00:00:00 2001 >> From: Bin Cheng <binch...@e108451-lin.cambridge.arm.com> >> Date: Mon, 8 May 2017 15:20:27 +0100 >> Subject: [PATCH 3/6] tree-ssa-regpressure-20170504.txt >> >> --- >> gcc/Makefile.in | 1 + >> gcc/tree-ssa-regpressure.c | 829 >> +++++++++++++++++++++++++++++++++++++++++++++ >> gcc/tree-ssa-regpressure.h | 21 ++ >> 3 files changed, 851 insertions(+) >> create mode 100644 gcc/tree-ssa-regpressure.c >> create mode 100644 gcc/tree-ssa-regpressure.h >> >> diff --git a/gcc/Makefile.in b/gcc/Makefile.in >> index 97259ac..abfd4bc 100644 >> --- a/gcc/Makefile.in >> +++ b/gcc/Makefile.in >> @@ -1534,6 +1534,7 @@ OBJS = \ >> tree-ssa-pre.o \ >> tree-ssa-propagate.o \ >> tree-ssa-reassoc.o \ >> + tree-ssa-regpressure.o \ >> tree-ssa-sccvn.o \ >> tree-ssa-scopedtables.o \ >> tree-ssa-sink.o \ >> diff --git a/gcc/tree-ssa-regpressure.c b/gcc/tree-ssa-regpressure.c >> new file mode 100644 >> index 0000000..ebc6576 >> --- /dev/null >> +++ b/gcc/tree-ssa-regpressure.c >> @@ -0,0 +1,829 @@ >> +/* Reg Pressure Model and Live Range Shrinking Optimization on TREE SSA. >> + Copyright (C) 2017 Free Software Foundation, Inc. >> + >> +This file is part of GCC. >> + >> +GCC is free software; you can redistribute it and/or modify it >> +under the terms of the GNU General Public License as published by the >> +Free Software Foundation; either version 3, or (at your option) any >> +later version. >> + >> +GCC is distributed in the hope that it will be useful, but WITHOUT >> +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or >> +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License >> +for more details. >> + >> +You should have received a copy of the GNU General Public License >> +along with GCC; see the file COPYING3. If not see >> +<http://www.gnu.org/licenses/>. */ >> + >> + >> +#include "config.h" >> +#include "system.h" >> +#include "coretypes.h" >> +#include "backend.h" >> +#include "rtl.h" >> +#include "memmodel.h" >> +#include "ira.h" > So I suspect what we need from ira.h is fairly narrow. Would it be > possible to pull the externalized interfaces we need for register > pressure at the gimple level into a new include file? > > My worry is that as we pull in ira.h (and rtl.h and who knows what else) > into the gimple space we end up with a tangled mess of touching rtl > things in gimple which we'd like to avoid. > > In fact, the first thing that jumped out at me when I scanned the patch > was the use of N_REG_CLASSES. That's really a target property. > > I must have mis-read the earlier patch to ira.c as I thought we were > only really tracking 3 classes. Integer, float and vector. Do we > really need to track pressure on all the classes to do a reasonable job? > > > + >> +/* Reg_alloc structure, coalesced from ssa variables. */ >> +typedef struct reg_alloc >> +{ >> + /* ID of this reg_alloc. */ >> + unsigned id; >> + /* The type of ssa variables of this reg_alloc. */ >> + tree type; >> + /* Ssa variables coalesced to this reg_alloc. */ > Use "SSA" rather than "Ssa". > > > > > >> + for (bsi = gsi_last_bb (bb); !gsi_end_p (bsi); gsi_prev (&bsi)) >> + { >> + stmt = gsi_stmt (bsi); >> + stmt_info = create_stmt_lr_info (region, stmt); >> + /* No need to compute live range information for debug stmt. */ >> + if (is_gimple_debug (stmt)) >> + continue; > ISTM you'd want to test for a debug stmt before creating the stmt_lr_info? > > >> + >> +/* Check if PRESSURE is high according to target information about available >> + registers. */ >> +static inline bool >> +high_reg_pressure (unsigned *pressure) >> +{ >> + int k; >> + >> + gcc_assert (pressure != NULL); >> + >> + for (k = 0; k < N_REG_CLASSES; k++) >> + if (pressure[k] > 8 && pressure[k] > target_avail_regs[k]) >> + return true; > Where does the magic "8" come from? ISTM that anytime the pressure is > greater than the available registers that the pressure is high, > regardless of the absolute number of live objects. > > > Jeff >