From ec7f796e87db1b01ce4fbaabc6f0d73000ad4001 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Fri, 3 Mar 2017 12:53:14 +0100 Subject: [PATCH] GCSE: Use HOST_WIDE_INT instead of int (PR rtl-optimization/79574). 2017-03-03 Martin Liska PR rtl-optimization/79574 * gcse.c (struct gcse_expr): Use HOST_WIDE_INT instead of int. (hash_scan_set): Likewise. (dump_hash_table): Likewise. (hoist_code): Likewise. 2017-03-03 Martin Liska PR rtl-optimization/79574 * gcc.dg/pr79574-2.c: New test. From-SVN: r245868 --- gcc/ChangeLog | 8 ++++++++ gcc/gcse.c | 27 +++++++++++++++----------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr79574-2.c | 33 ++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr79574-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5db500e3350..1617bc1a154 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-03-03 Martin Liska + + PR rtl-optimization/79574 + * gcse.c (struct gcse_expr): Use HOST_WIDE_INT instead of int. + (hash_scan_set): Likewise. + (dump_hash_table): Likewise. + (hoist_code): Likewise. + 2017-03-03 Richard Biener * fixed-value.c (fixed_from_string): Restore use of elt (1) diff --git a/gcc/gcse.c b/gcc/gcse.c index 5c6984c3240..38b95772857 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -281,7 +281,7 @@ struct gcse_expr to keep register pressure under control. A value of "0" removes restrictions on how far the expression can travel. */ - int max_distance; + HOST_WIDE_INT max_distance; }; /* Occurrence of an expression. @@ -458,7 +458,7 @@ static int oprs_unchanged_p (const_rtx, const rtx_insn *, int); static int oprs_anticipatable_p (const_rtx, const rtx_insn *); static int oprs_available_p (const_rtx, const rtx_insn *); static void insert_expr_in_table (rtx, machine_mode, rtx_insn *, int, int, - int, struct gcse_hash_table_d *); + HOST_WIDE_INT, struct gcse_hash_table_d *); static unsigned int hash_expr (const_rtx, machine_mode, int *, int); static void record_last_reg_set_info (rtx_insn *, int); static void record_last_mem_set_info (rtx_insn *); @@ -488,8 +488,10 @@ static void alloc_code_hoist_mem (int, int); static void free_code_hoist_mem (void); static void compute_code_hoist_vbeinout (void); static void compute_code_hoist_data (void); -static int should_hoist_expr_to_dom (basic_block, struct gcse_expr *, basic_block, - sbitmap, int, int *, enum reg_class, +static int should_hoist_expr_to_dom (basic_block, struct gcse_expr *, + basic_block, + sbitmap, HOST_WIDE_INT, int *, + enum reg_class, int *, bitmap, rtx_insn *); static int hoist_code (void); static enum reg_class get_regno_pressure_class (int regno, int *nregs); @@ -743,7 +745,7 @@ static basic_block current_bb; GCSE. */ static int -want_to_gcse_p (rtx x, machine_mode mode, int *max_distance_ptr) +want_to_gcse_p (rtx x, machine_mode mode, HOST_WIDE_INT *max_distance_ptr) { #ifdef STACK_REGS /* On register stack architectures, don't GCSE constants from the @@ -1115,7 +1117,8 @@ expr_equiv_p (const_rtx x, const_rtx y) static void insert_expr_in_table (rtx x, machine_mode mode, rtx_insn *insn, int antic_p, - int avail_p, int max_distance, struct gcse_hash_table_d *table) + int avail_p, HOST_WIDE_INT max_distance, + struct gcse_hash_table_d *table) { int found, do_not_record_p; unsigned int hash; @@ -1231,7 +1234,7 @@ hash_scan_set (rtx set, rtx_insn *insn, struct gcse_hash_table_d *table) else if (REG_P (dest)) { unsigned int regno = REGNO (dest); - int max_distance = 0; + HOST_WIDE_INT max_distance = 0; /* See if a REG_EQUAL note shows this equivalent to a simpler expression. @@ -1300,7 +1303,7 @@ hash_scan_set (rtx set, rtx_insn *insn, struct gcse_hash_table_d *table) else if (flag_gcse_las && REG_P (src) && MEM_P (dest)) { unsigned int regno = REGNO (src); - int max_distance = 0; + HOST_WIDE_INT max_distance = 0; /* Only record sets of pseudo-regs in the hash table. */ if (regno >= FIRST_PSEUDO_REGISTER @@ -1412,7 +1415,8 @@ dump_hash_table (FILE *file, const char *name, struct gcse_hash_table_d *table) if (flat_table[i] != 0) { expr = flat_table[i]; - fprintf (file, "Index %d (hash value %d; max distance %d)\n ", + fprintf (file, "Index %d (hash value %d; max distance " + HOST_WIDE_INT_PRINT_DEC ")\n ", expr->bitmap_index, hash_val[i], expr->max_distance); print_rtl (file, expr->expr); fprintf (file, "\n"); @@ -2884,7 +2888,8 @@ update_bb_reg_pressure (basic_block bb, rtx_insn *from) static int should_hoist_expr_to_dom (basic_block expr_bb, struct gcse_expr *expr, - basic_block bb, sbitmap visited, int distance, + basic_block bb, sbitmap visited, + HOST_WIDE_INT distance, int *bb_size, enum reg_class pressure_class, int *nregs, bitmap hoisted_bbs, rtx_insn *from) { @@ -3161,7 +3166,7 @@ hoist_code (void) computes the expression. */ FOR_EACH_VEC_ELT (domby, j, dominated) { - int max_distance; + HOST_WIDE_INT max_distance; /* Ignore self dominance. */ if (bb == dominated) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b223ee24d44..6f59a450b1d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-03-03 Martin Liska + + PR rtl-optimization/79574 + * gcc.dg/pr79574-2.c: New test. + 2017-03-03 Richard Biener PR c++/79825 diff --git a/gcc/testsuite/gcc.dg/pr79574-2.c b/gcc/testsuite/gcc.dg/pr79574-2.c new file mode 100644 index 00000000000..995dff40174 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr79574-2.c @@ -0,0 +1,33 @@ +/* PR rtl-optimization/79574 */ +/* { dg-do compile } */ +/* { dg-options "-Os --param gcse-cost-distance-ratio=2147483647" } */ + +#include "stdarg.h" + +int buf[100]; +int buf1[10]; + +int rd (int *pppp, int n, ...) +{ + va_list argp; + int *p; + int i; + int res; + + va_start (argp, n); + for (; n > 0; n--) + va_arg (argp, double); + p = va_arg (argp, int *); + i = va_arg (argp, int); + + res = p[i]; + __builtin_printf ("%d\n", res); + + return res; +} + +int mpx_test (int argc, const char **argv) +{ + rd (buf1, 2, 10.0d, 10.0d, buf, 100, buf1); + return 0; +}