On Tue, Apr 18, 2017 at 10:25 PM, Michael Meissner <meiss...@linux.vnet.ibm.com> wrote: > I did a bootstrap and make check-{gcc,c++,fortran,lto} comparing the results > to > the baseline (subversion id 246975). > > There were 2 differences: > > The baseline failed on gcc.dg/sms-4.c but succeeded on gcc.dg/sms-1.c. > > Here are the sms-[14] lines from the baseline: > > Executing on host: /home/meissner/fsf-build-ppc64le/trunk-246975/gcc/xgcc > -B/home/meissner/fsf-build-ppc64le/trunk-246975/gcc/ > /home/meissner/fsf-src/trunk-246975/gcc/testsuite/gcc.dg/sms-4.c > -fno-diagnostics-show-caret > -fdiagnostics-color=never -O2 -fmodulo-sched -fmodulo-sched-allow-regmoves > -fdump-rtl-sms --param sms-min-sc=1 -ffat-lto-objects -lm -o ./sms-4.exe > (timeout = 300) > spawn /home/meissner/fsf-build-ppc64le/trunk-246975/gcc/xgcc > -B/home/meissner/fsf-build-ppc64le/trunk-246975/gcc/ > /home/meissner/fsf-src/trunk-246975/gcc/testsuite/gcc.dg/sms-4.c > -fno-diagnostics-show-caret -fdiagnostics > -color=never -O2 -fmodulo-sched -fmodulo-sched-allow-regmoves -fdump-rtl-sms > --param sms-min-sc=1 -ffat-lto-objects -lm -o ./sms-4.exe > PASS: gcc.dg/sms-4.c (test for excess errors) > Setting LD_LIBRARY_PATH to > :/home/meissner/fsf-build-ppc64le/trunk-246975/gcc:/home/meissner/fsf-build-ppc64le/trunk-246975/powerpc64le-unknown-linux-gnu/./libatomic/.libs::/home/meissner/fsf-build-ppc64le/trunk-246975/g > cc:/home/meissner/fsf-build-ppc64le/trunk-246975/powerpc64le-unknown-linux-gnu/./libatomic/.libs: > spawn [open ...] > PASS: gcc.dg/sms-4.c execution test > FAIL: gcc.dg/sms-4.c scan-rtl-dump-times sms "SMS succeeded" 1 > > Executing on host: /home/meissner/fsf-build-ppc64le/trunk-246975/gcc/xgcc > -B/home/meissner/fsf-build-ppc64le/trunk-246975/gcc/ > /home/meissner/fsf-src/trunk-246975/gcc/testsuite/gcc.dg/sms-1.c > -fno-diagnostics-show-caret -fdiagnostics-color=never -O2 -fmodulo-sched > -fmodulo-sched-allow-regmoves -fdump-rtl-sms -ffat-lto-objects -lm -o > ./sms-1.exe (timeout = 300) > spawn /home/meissner/fsf-build-ppc64le/trunk-246975/gcc/xgcc > -B/home/meissner/fsf-build-ppc64le/trunk-246975/gcc/ > /home/meissner/fsf-src/trunk-246975/gcc/testsuite/gcc.dg/sms-1.c > -fno-diagnostics-show-caret -fdiagnostics-color=never -O2 -fmodulo-sched > -fmodulo-sched-allow-regmoves -fdump-rtl-sms -ffat-lto-objects -lm -o > ./sms-1.exe > PASS: gcc.dg/sms-1.c (test for excess errors) > Setting LD_LIBRARY_PATH to > :/home/meissner/fsf-build-ppc64le/trunk-246975/gcc:/home/meissner/fsf-build-ppc64le/trunk-246975/powerpc64le-unknown-linux-gnu/./libatomic/.libs::/home/meissner/fsf-build-ppc64le/trunk-246975/gcc:/home/meissner/fsf-build-ppc64le/trunk-246975/powerpc64le-unknown-linux-gnu/./libatomic/.libs: > spawn [open ...] > PASS: gcc.dg/sms-1.c execution test > PASS: gcc.dg/sms-1.c scan-rtl-dump-times sms "SMS succeeded" 1 > > While here are the lines from the ivopts run: > > Executing on host: /home/meissner/fsf-build-ppc64le/ivopts/gcc/xgcc > -B/home/meissner/fsf-build-ppc64le/ivopts/gcc/ > /home/meissner/fsf-src/ivopts/gcc/testsuite/gcc.dg/sms-1.c > -fno-diagnostics-show-caret -fdiagnostics-color=never -O2 -fmodulo-sched > -fmodulo-sched-allow-regmoves -fdump-rtl-sms -ffat-lto-objects -lm -o > ./sms-1.exe (timeout = 300) > spawn /home/meissner/fsf-build-ppc64le/ivopts/gcc/xgcc > -B/home/meissner/fsf-build-ppc64le/ivopts/gcc/ > /home/meissner/fsf-src/ivopts/gcc/testsuite/gcc.dg/sms-1.c > -fno-diagnostics-show-caret -fdiagnostics-color=never -O2 -fmodulo-sched > -fmodulo-sched-allow-regmoves -fdump-rtl-sms -ffat-lto-objects -lm -o > ./sms-1.exe > PASS: gcc.dg/sms-1.c (test for excess errors) > Setting LD_LIBRARY_PATH to > :/home/meissner/fsf-build-ppc64le/ivopts/gcc:/home/meissner/fsf-build-ppc64le/ivopts/powerpc64le-unknown-linux-gnu/./libatomic/.libs::/home/meissner/fsf-build-ppc64le/ivopts/gcc:/home/meissner/fsf-build-ppc64le/ivopts/powerpc64le-unknown-linux-gnu/./libatomic/.libs: > spawn [open ...] > PASS: gcc.dg/sms-1.c execution test > FAIL: gcc.dg/sms-1.c scan-rtl-dump-times sms "SMS succeeded" 1 > > Executing on host: /home/meissner/fsf-build-ppc64le/ivopts/gcc/xgcc > -B/home/meissner/fsf-build-ppc64le/ivopts/gcc/ > /home/meissner/fsf-src/ivopts/gcc/testsuite/gcc.dg/sms-4.c > -fno-diagnostics-show-caret -fdiagnostics-color=never -O2 -fmodulo-sched > -fmodulo-sched-allow-regmoves -fdump-rtl-sms --param sms-min-sc=1 > -ffat-lto-objects -lm -o ./sms-4.exe (timeout = 300) > spawn /home/meissner/fsf-build-ppc64le/ivopts/gcc/xgcc > -B/home/meissner/fsf-build-ppc64le/ivopts/gcc/ > /home/meissner/fsf-src/ivopts/gcc/testsuite/gcc.dg/sms-4.c > -fno-diagnostics-show-caret -fdiagnostics-color=never -O2 -fmodulo-sched > -fmodulo-sched-allow-regmoves -fdump-rtl-sms --param sms-min-sc=1 > -ffat-lto-objects -lm -o ./sms-4.exe > PASS: gcc.dg/sms-4.c (test for excess errors) > Setting LD_LIBRARY_PATH to > :/home/meissner/fsf-build-ppc64le/ivopts/gcc:/home/meissner/fsf-build-ppc64le/ivopts/powerpc64le-unknown-linux-gnu/./libatomic/.libs::/home/meissner/fsf-build-ppc64le/ivopts/gcc:/home/meissner/fsf-build-ppc64le/ivopts/powerpc64le-unknown-linux-gnu/./libatomic/.libs: > spawn [open ...] > PASS: gcc.dg/sms-4.c execution test > PASS: gcc.dg/sms-4.c scan-rtl-dump-times sms "SMS succeeded" 1 > > -- > Michael Meissner, IBM > IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA > email: meiss...@linux.vnet.ibm.com, phone: +1 (978) 899-4797 >
Hi Michael, Thanks for testing it. Could you have a check if updated patch resolves the ICE? As for sms-*.c tests, I had difficulty in reproducing it. Both trunk and patched GCC have the same behavior with my local ppc cross toolchain, sms-1.c fails and sms-4.c succeeds. Thanks, bin
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index d9e5942..6d74c07 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1765,3 +1765,50 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si, } return retval; } + +/* A local CSE interface which runs CSE for basic blocks recorded in + CHANGED_BBS. */ + +void +cse_bbs (bitmap changed_bbs) +{ + unsigned index; + bitmap_iterator bi; + gimple_stmt_iterator gsi; + + hash_table<expr_elt_hasher> *avail_exprs; + class avail_exprs_stack *avail_exprs_stack; + class const_and_copies *const_and_copies; + + avail_exprs = new hash_table<expr_elt_hasher> (1024); + avail_exprs_stack = new class avail_exprs_stack (avail_exprs); + const_and_copies = new class const_and_copies (); + + threadedge_initialize_values (); + /* Push a marker on the stacks of local information so that we know how + far to unwind when we finalize this block. */ + avail_exprs_stack->push_marker (); + const_and_copies->push_marker (); + + EXECUTE_IF_SET_IN_BITMAP (changed_bbs, 0, index, bi) + { + basic_block bb = BASIC_BLOCK_FOR_FN (cfun, index); + + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "\n\nRun local cse on block #%d\n\n", bb->index); + + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + optimize_stmt (bb, gsi, const_and_copies, avail_exprs_stack); + + /* Pop stacks to keep it small. */ + avail_exprs_stack->pop_to_marker (); + const_and_copies->pop_to_marker (); + } + + delete avail_exprs; + avail_exprs = NULL; + + delete avail_exprs_stack; + delete const_and_copies; + threadedge_finalize_values (); +} diff --git a/gcc/tree-ssa-dom.h b/gcc/tree-ssa-dom.h index ad1b7ef..88869fd 100644 --- a/gcc/tree-ssa-dom.h +++ b/gcc/tree-ssa-dom.h @@ -24,5 +24,6 @@ extern bool simple_iv_increment_p (gimple *); extern void record_temporary_equivalences (edge, class const_and_copies *, class avail_exprs_stack *); +extern void cse_bbs (bitmap); #endif /* GCC_TREE_SSA_DOM_H */ diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index aa504b6..6b91097 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -4247,23 +4247,27 @@ vect_create_addr_base_for_vector_ref (gimple *stmt, base_name = get_name (DR_REF (dr)); } - /* Create base_offset */ - base_offset = size_binop (PLUS_EXPR, - fold_convert (sizetype, base_offset), - fold_convert (sizetype, init)); + base_offset = fold_convert (sizetype, base_offset); + init = fold_convert (sizetype, init); if (offset) { offset = fold_build2 (MULT_EXPR, sizetype, fold_convert (sizetype, offset), step); - base_offset = fold_build2 (PLUS_EXPR, sizetype, - base_offset, offset); + if (TREE_CODE (offset) == INTEGER_CST) + init = fold_build2 (PLUS_EXPR, sizetype, init, offset); + else + base_offset = fold_build2 (PLUS_EXPR, sizetype, + base_offset, offset); } if (byte_offset) { byte_offset = fold_convert (sizetype, byte_offset); - base_offset = fold_build2 (PLUS_EXPR, sizetype, - base_offset, byte_offset); + if (TREE_CODE (byte_offset) == INTEGER_CST) + init = fold_build2 (PLUS_EXPR, sizetype, init, byte_offset); + else + base_offset = fold_build2 (PLUS_EXPR, sizetype, + base_offset, byte_offset); } /* base + base_offset */ @@ -4280,6 +4284,10 @@ vect_create_addr_base_for_vector_ref (gimple *stmt, dest = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var, base_name); addr_base = force_gimple_operand (addr_base, &seq, true, dest); gimple_seq_add_seq (new_stmt_list, seq); + /* Add constant offset at last. */ + addr_base = fold_build_pointer_plus (addr_base, init); + addr_base = force_gimple_operand (addr_base, &seq, true, dest); + gimple_seq_add_seq (new_stmt_list, seq); if (DR_PTR_INFO (dr) && TREE_CODE (addr_base) == SSA_NAME @@ -4507,12 +4515,13 @@ vect_create_data_ref_ptr (gimple *stmt, tree aggr_type, struct loop *at_loop, if (new_stmt_list) { if (pe) - { - new_bb = gsi_insert_seq_on_edge_immediate (pe, new_stmt_list); - gcc_assert (!new_bb); - } + { + new_bb = gsi_insert_seq_on_edge_immediate (pe, new_stmt_list); + gcc_assert (!new_bb); + bitmap_set_bit (changed_bbs, pe->src->index); + } else - gsi_insert_seq_before (gsi, new_stmt_list, GSI_SAME_STMT); + gsi_insert_seq_before (gsi, new_stmt_list, GSI_SAME_STMT); } *initial_address = new_temp; @@ -5220,9 +5229,10 @@ vect_setup_realignment (gimple *stmt, gimple_stmt_iterator *gsi, NULL_TREE, loop); if (loop) { - pe = loop_preheader_edge (loop); + pe = loop_preheader_edge (loop); new_bb = gsi_insert_seq_on_edge_immediate (pe, stmts); gcc_assert (!new_bb); + bitmap_set_bit (changed_bbs, pe->src->index); } else gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index 0ff474d..4ad5ba8 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -1023,6 +1023,7 @@ vect_gen_prolog_loop_niters (loop_vec_info loop_vinfo, if (stmts) { gcc_assert (single_succ_p (bb)); + bitmap_set_bit (changed_bbs, bb->index); gimple_stmt_iterator gsi = gsi_last_bb (bb); if (gsi_end_p (gsi)) gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT); diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index f928dec..0f59dbc 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -74,6 +74,7 @@ along with GCC; see the file COPYING3. If not see #include "cfgloop.h" #include "tree-vectorizer.h" #include "tree-ssa-propagate.h" +#include "tree-ssa-dom.h" #include "dbgcnt.h" #include "tree-scalar-evolution.h" @@ -83,6 +84,9 @@ source_location vect_location; /* Vector mapping GIMPLE stmt to stmt_vec_info. */ vec<stmt_vec_info> stmt_vec_info_vec; + +/* Basic blocks should be cleaned up by CSE after vectorization. */ +bitmap changed_bbs; /* For mapping simduid to vectorization factor. */ @@ -540,6 +544,7 @@ vectorize_loops (void) note_simd_array_uses (&simd_array_to_simduid_htab); init_stmt_vec_info_vec (); + changed_bbs = BITMAP_ALLOC (NULL); /* ----------- Analyze loops. ----------- */ @@ -762,6 +767,9 @@ vectorize_loops (void) loop->aux = NULL; } + if (!bitmap_empty_p (changed_bbs)) + cse_bbs (changed_bbs); + BITMAP_FREE (changed_bbs); free_stmt_vec_info_vec (); /* Fold IFN_GOMP_SIMD_{VF,LANE,LAST_LANE,ORDERED_{START,END}} builtins. */ diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 12bb904..f16ab79 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -797,6 +797,7 @@ struct dataref_aux { && TYPE_UNSIGNED (TYPE))) extern vec<stmt_vec_info> stmt_vec_info_vec; +extern bitmap changed_bbs; void init_stmt_vec_info_vec (void); void free_stmt_vec_info_vec (void);