aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2014-08-22 18:15:54 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2014-08-22 18:15:54 +0000
commit95ecfb261b5a92ca7fbd9d71098827dc02b4e518 (patch)
tree458ca56a251509a7515539b133b43b9fee6bc75d /gcc
parent1b20d55a519f0e8ad7fcdc071f453c647bfceb9b (diff)
downloadgcc-95ecfb261b5a92ca7fbd9d71098827dc02b4e518.zip
gcc-95ecfb261b5a92ca7fbd9d71098827dc02b4e518.tar.gz
gcc-95ecfb261b5a92ca7fbd9d71098827dc02b4e518.tar.bz2
loop-unroll.c: Use rtx_insn (also touches basic-block.h)
gcc/ * basic-block.h (basic_block split_edge_and_insert): Strengthen param "insns" from rtx to rtx_insn *. * loop-unroll.c (struct iv_to_split): Strengthen field "insn" from rtx to rtx_insn *. (struct iv_to_split): Likewise. (loop_exit_at_end_p): Likewise for local "insn". (split_edge_and_insert): Likewise for param "insns". (compare_and_jump_seq): Likewise for return type, param "cinsn", and locals "seq", "jump". (unroll_loop_runtime_iterations): Likewise for locals "init_code", "branch_code"; update invocations of compare_and_jump_seq to eliminate NULL_RTX in favor of NULL. (referenced_in_one_insn_in_loop_p): Strengthen local "insn" from rtx to rtx_insn *. (reset_debug_uses_in_loop): Likewise. (analyze_insn_to_expand_var): Likewise for param "insn". (analyze_iv_to_split_insn): Likewise. (analyze_insns_in_loop): Likewise for local "insn". (insert_base_initialization): Likewise for param "insn" and local "seq". (split_iv): Likewise for param "insn" and local "seq". (expand_var_during_unrolling): Likewise for param "insn". (insert_var_expansion_initialization): Likewise for local "seq". (combine_var_copies_in_loop_exit): Likewise. (combine_var_copies_in_loop_exit): Likewise for locals "seq" and "insn". (maybe_strip_eq_note_for_split_iv): Likewise for param "insn". (apply_opt_in_copies): Likewise for locals "insn", "orig_insn", "next". From-SVN: r214345
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog33
-rw-r--r--gcc/basic-block.h2
-rw-r--r--gcc/loop-unroll.c53
3 files changed, 63 insertions, 25 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c6b4d29..99f3ed1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,38 @@
2014-08-22 David Malcolm <dmalcolm@redhat.com>
+ * basic-block.h (basic_block split_edge_and_insert): Strengthen
+ param "insns" from rtx to rtx_insn *.
+
+ * loop-unroll.c (struct iv_to_split): Strengthen field "insn" from
+ rtx to rtx_insn *.
+ (struct iv_to_split): Likewise.
+ (loop_exit_at_end_p): Likewise for local "insn".
+ (split_edge_and_insert): Likewise for param "insns".
+ (compare_and_jump_seq): Likewise for return type, param "cinsn",
+ and locals "seq", "jump".
+ (unroll_loop_runtime_iterations): Likewise for locals "init_code",
+ "branch_code"; update invocations of compare_and_jump_seq to
+ eliminate NULL_RTX in favor of NULL.
+ (referenced_in_one_insn_in_loop_p): Strengthen local "insn" from
+ rtx to rtx_insn *.
+ (reset_debug_uses_in_loop): Likewise.
+ (analyze_insn_to_expand_var): Likewise for param "insn".
+ (analyze_iv_to_split_insn): Likewise.
+ (analyze_insns_in_loop): Likewise for local "insn".
+ (insert_base_initialization): Likewise for param
+ "insn" and local "seq".
+ (split_iv): Likewise for param "insn" and local "seq".
+ (expand_var_during_unrolling): Likewise for param "insn".
+ (insert_var_expansion_initialization): Likewise for local "seq".
+ (combine_var_copies_in_loop_exit): Likewise.
+ (combine_var_copies_in_loop_exit): Likewise for locals "seq" and
+ "insn".
+ (maybe_strip_eq_note_for_split_iv): Likewise for param "insn".
+ (apply_opt_in_copies): Likewise for locals "insn", "orig_insn",
+ "next".
+
+2014-08-22 David Malcolm <dmalcolm@redhat.com>
+
* cfgloop.h (iv_analyze): Strengthen param 1 "insn" from rtx to
rtx_insn *.
(iv_analyze_result): Likewise.
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index fc931f1..f640f399 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -399,7 +399,7 @@ extern unsigned int free_bb_for_insn (void);
extern void update_bb_for_insn (basic_block);
extern void insert_insn_on_edge (rtx, edge);
-basic_block split_edge_and_insert (edge, rtx);
+basic_block split_edge_and_insert (edge, rtx_insn *);
extern void commit_one_edge_insertion (edge e);
extern void commit_edge_insertions (void);
diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c
index 1821ea0..2e35cb1 100644
--- a/gcc/loop-unroll.c
+++ b/gcc/loop-unroll.c
@@ -73,7 +73,7 @@ along with GCC; see the file COPYING3. If not see
struct iv_to_split
{
- rtx insn; /* The insn in that the induction variable occurs. */
+ rtx_insn *insn; /* The insn in that the induction variable occurs. */
rtx orig_var; /* The variable (register) for the IV before split. */
rtx base_var; /* The variable on that the values in the further
iterations are based. */
@@ -85,7 +85,7 @@ struct iv_to_split
struct var_to_expand
{
- rtx insn; /* The insn in that the variable expansion occurs. */
+ rtx_insn *insn; /* The insn in that the variable expansion occurs. */
rtx reg; /* The accumulator which is expanded. */
vec<rtx> var_expansions; /* The copies of the accumulator which is expanded. */
struct var_to_expand *next; /* Next entry in walking order. */
@@ -187,10 +187,10 @@ static struct opt_info *analyze_insns_in_loop (struct loop *);
static void opt_info_start_duplication (struct opt_info *);
static void apply_opt_in_copies (struct opt_info *, unsigned, bool, bool);
static void free_opt_info (struct opt_info *);
-static struct var_to_expand *analyze_insn_to_expand_var (struct loop*, rtx);
+static struct var_to_expand *analyze_insn_to_expand_var (struct loop*, rtx_insn *);
static bool referenced_in_one_insn_in_loop_p (struct loop *, rtx, int *);
static struct iv_to_split *analyze_iv_to_split_insn (rtx_insn *);
-static void expand_var_during_unrolling (struct var_to_expand *, rtx);
+static void expand_var_during_unrolling (struct var_to_expand *, rtx_insn *);
static void insert_var_expansion_initialization (struct var_to_expand *,
basic_block);
static void combine_var_copies_in_loop_exit (struct var_to_expand *,
@@ -319,7 +319,7 @@ static bool
loop_exit_at_end_p (struct loop *loop)
{
struct niter_desc *desc = get_simple_loop_desc (loop);
- rtx insn;
+ rtx_insn *insn;
if (desc->in_edge->dest != loop->latch)
return false;
@@ -1007,7 +1007,7 @@ decide_unroll_runtime_iterations (struct loop *loop, int flags)
and NULL is returned instead. */
basic_block
-split_edge_and_insert (edge e, rtx insns)
+split_edge_and_insert (edge e, rtx_insn *insns)
{
basic_block bb;
@@ -1053,11 +1053,12 @@ split_edge_and_insert (edge e, rtx insns)
true, with probability PROB. If CINSN is not NULL, it is the insn to copy
in order to create a jump. */
-static rtx
+static rtx_insn *
compare_and_jump_seq (rtx op0, rtx op1, enum rtx_code comp, rtx label, int prob,
- rtx cinsn)
+ rtx_insn *cinsn)
{
- rtx seq, jump, cond;
+ rtx_insn *seq, *jump;
+ rtx cond;
enum machine_mode mode;
mode = GET_MODE (op0);
@@ -1136,7 +1137,8 @@ compare_and_jump_seq (rtx op0, rtx op1, enum rtx_code comp, rtx label, int prob,
static void
unroll_loop_runtime_iterations (struct loop *loop)
{
- rtx old_niter, niter, init_code, branch_code, tmp;
+ rtx old_niter, niter, tmp;
+ rtx_insn *init_code, *branch_code;
unsigned i, j, p;
basic_block preheader, *body, swtch, ezc_swtch;
sbitmap wont_exit;
@@ -1253,7 +1255,7 @@ unroll_loop_runtime_iterations (struct loop *loop)
preheader = split_edge (loop_preheader_edge (loop));
branch_code = compare_and_jump_seq (copy_rtx (niter), GEN_INT (j), EQ,
block_label (preheader), p,
- NULL_RTX);
+ NULL);
/* We rely on the fact that the compare and jump cannot be optimized out,
and hence the cfg we create is correct. */
@@ -1276,7 +1278,7 @@ unroll_loop_runtime_iterations (struct loop *loop)
preheader = split_edge (loop_preheader_edge (loop));
branch_code = compare_and_jump_seq (copy_rtx (niter), const0_rtx, EQ,
block_label (preheader), p,
- NULL_RTX);
+ NULL);
gcc_assert (branch_code != NULL_RTX);
swtch = split_edge_and_insert (single_succ_edge (swtch), branch_code);
@@ -1684,7 +1686,7 @@ referenced_in_one_insn_in_loop_p (struct loop *loop, rtx reg,
basic_block *body, bb;
unsigned i;
int count_ref = 0;
- rtx insn;
+ rtx_insn *insn;
body = get_loop_body (loop);
for (i = 0; i < loop->num_nodes; i++)
@@ -1710,7 +1712,7 @@ reset_debug_uses_in_loop (struct loop *loop, rtx reg, int debug_uses)
{
basic_block *body, bb;
unsigned i;
- rtx insn;
+ rtx_insn *insn;
body = get_loop_body (loop);
for (i = 0; debug_uses && i < loop->num_nodes; i++)
@@ -1755,7 +1757,7 @@ reset_debug_uses_in_loop (struct loop *loop, rtx reg, int debug_uses)
*/
static struct var_to_expand *
-analyze_insn_to_expand_var (struct loop *loop, rtx insn)
+analyze_insn_to_expand_var (struct loop *loop, rtx_insn *insn)
{
rtx set, dest, src;
struct var_to_expand *ves;
@@ -2087,10 +2089,10 @@ allocate_basic_variable (struct iv_to_split *ivts)
the initial value from INSN. */
static void
-insert_base_initialization (struct iv_to_split *ivts, rtx insn)
+insert_base_initialization (struct iv_to_split *ivts, rtx_insn *insn)
{
rtx expr = copy_rtx (SET_SRC (single_set (insn)));
- rtx seq;
+ rtx_insn *seq;
start_sequence ();
expr = force_operand (expr, ivts->base_var);
@@ -2106,9 +2108,10 @@ insert_base_initialization (struct iv_to_split *ivts, rtx insn)
by base variable + DELTA * step. */
static void
-split_iv (struct iv_to_split *ivts, rtx insn, unsigned delta)
+split_iv (struct iv_to_split *ivts, rtx_insn *insn, unsigned delta)
{
- rtx expr, *loc, seq, incr, var;
+ rtx expr, *loc, incr, var;
+ rtx_insn *seq;
enum machine_mode mode = GET_MODE (ivts->base_var);
rtx src, dest, set;
@@ -2188,7 +2191,7 @@ get_expansion (struct var_to_expand *ve)
with a new register. */
static void
-expand_var_during_unrolling (struct var_to_expand *ve, rtx insn)
+expand_var_during_unrolling (struct var_to_expand *ve, rtx_insn *insn)
{
rtx new_reg, set;
bool really_new_expansion = false;
@@ -2246,7 +2249,8 @@ static void
insert_var_expansion_initialization (struct var_to_expand *ve,
basic_block place)
{
- rtx seq, var, zero_init;
+ rtx_insn *seq;
+ rtx var, zero_init;
unsigned i;
enum machine_mode mode = GET_MODE (ve->reg);
bool honor_signed_zero_p = HONOR_SIGNED_ZEROS (mode);
@@ -2297,7 +2301,8 @@ static void
combine_var_copies_in_loop_exit (struct var_to_expand *ve, basic_block place)
{
rtx sum = ve->reg;
- rtx expr, seq, var, insn;
+ rtx expr, var;
+ rtx_insn *seq, *insn;
unsigned i;
if (ve->var_expansions.length () == 0)
@@ -2348,7 +2353,7 @@ combine_var_copies_in_loop_exit (struct var_to_expand *ve, basic_block place)
any notes attached to them. So resort to old techniques... */
static void
-maybe_strip_eq_note_for_split_iv (struct opt_info *opt_info, rtx insn)
+maybe_strip_eq_note_for_split_iv (struct opt_info *opt_info, rtx_insn *insn)
{
struct iv_to_split *ivts;
rtx note = find_reg_equal_equiv_note (insn);
@@ -2378,7 +2383,7 @@ apply_opt_in_copies (struct opt_info *opt_info,
{
unsigned i, delta;
basic_block bb, orig_bb;
- rtx insn, orig_insn, next;
+ rtx_insn *insn, *orig_insn, *next;
struct iv_to_split ivts_templ, *ivts;
struct var_to_expand ve_templ, *ves;