After shrink-wrapping has found the "tightest fit" for where to place
the prologue, it tries move it earlier (so that frame saves are run
earlier) -- but without copying any more basic blocks.
Unfortunately a candidate block we select can be inside a loop, and we
will still allow it (because the loop always exits via our previously
chosen block). We can do that just fine if we make a duplicate of the
block, but we do not want to here.
So we need to detect this situation. We can place the prologue at a
previous block PRE only if PRE dominates every block reachable from
it, because then we will never need to duplicate that block (it will
always be executed with prologue).
2015-12-11 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/67778
PR rtl-optimization/68634
* shrink-wrap.c (try_shrink_wrapping): Add a comment about why we want
to put the prologue earlier. When determining if an earlier block is
suitable, make sure it dominates every block reachable from it.
From-SVN: r231552
PR ipa/61886
* lto-symtab.c (lto_symtab_merge_p): Avoid merging across different
values of error and warning attributes.
* gcc.dg/lto/pr61886_0.c: New testcase
From-SVN: r231548
The meaning of ZERO_EXTRACT depends on BITS_BIG_ENDIAN, not on
BYTES_BIG_ENDIAN. This caused PR68814.
2015-12-11 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/68814
* rtlanal.c (set_noop_p): Use BITS_BIG_ENDIAN instead of
BYTES_BIG_ENDIAN.
From-SVN: r231547
* ipa-cp.c (ipcp_cloning_candidate_p): Use node->optimize_for_size_p.
(good_cloning_opportunity_p): Likewise.
(gather_context_independent_values): Do not return true when
polymorphic call context is known or when we have known aggregate
value of unused parameter.
(estimate_local_effects): Try to create clone for all context
when either some params are substituted or devirtualization is possible
or some params can be removed; use local flag instead of
node->will_be_removed_from_program_if_no_direct_calls_p.
(identify_dead_nodes): Likewise.
* gcc.c-torture/execute/20010122-1.c: Disable cloning.
From-SVN: r231540
gcc/c-family/ChangeLog:
* c.opt (Wmisleading-indentation): Add to -Wall for C and C++.
gcc/ChangeLog:
* doc/invoke.texi (-Wall): Add -Wmisleading-indentation to the
list.
(-Wmisleading-indentation): Update documentation to reflect
being enabled by -Wall in C/C++.
From-SVN: r231539
gcc/testsuite/ChangeLog:
* lib/multiline.exp (_multiline_expected_outputs): Update comment.
(dg-end-multiline-output): Capture line numbers within
_multiline_expected_outputs.
(handle-multiline-outputs): Access global $testname_with_flags
and add it as a prefix to pass/fail results. Extract line numbers
from $_multiline_expected_outputs and print them within pass/fail
results, replacing the printing of $index. Consolidate the
string prefix shared between pass/fail into a new local ($title).
From-SVN: r231530
2015-12-10 Jeff Law <law@redhat.com>
PR tree-optimization/68619
* tree-ssa-dom.c (dom_opt_dom_walker::before_dom_children): Propgate
return value from optimize_stmt.
(dom_opt_dom_walker): Add new argument to dom_walker constructor.
(pass_dominator:execute): If a block has an unreachable edge,
remove all jump threads through any successor of the affected block.
(record_equivalences_from_phis): Ignore alternative if the edge
does not have EDGE_EXECUTABLE set.
(single_incoming_edge_ignoring_loop_edges): Similarly.
(optimize_stmt): If a gimple_code has a compile-time constant
condition, return the edge taken for that constant value. Also
change the condition to true/false as necessary.
* domwalk.h (dom_walker::dom_walker): Add new argument
skip_unreachable_blocks. Don't provide empty constructor body.
(dom_walker::before_dom_children): Change return type.
(dom_walker::bb_reachable): Declare new private method.
(dom_walker::propagate_unreachable_to_edges): Likewise.
(dom_walker::m_unreachable_dom): Declare new private data member.
(dom_walker::m_skip_unreachable_blocks): Likewise.
* domwalk.c: Include dumpfile.h.
(dom_walker::dom_walker): New constructor. Initialize private data
members. If needed, set EDGE_EXECUTABLE for all edges in the CFG,
extracted from tree-ssa-sccvn.c.
(dom_walker::bb_reachable): New method extracted from tree-ssa-sccvn.c
(dom_walker::propagate_unreachable_to_edges): Likewise.
(dom_walker::walk): Only call before_dom_children on reachable
blocks. If before_dom_children returns an edge, then clear
EDGE_EXECUTABLE for all other outgoing edges from the same block.
For unreachable blocks, call propagate_unreachable_to_edges.
Similarly, only call after_dom_children on reachable blocks. For
unreachable blocks, conditionally clear m_unreachable_dom.
* tree-ssa-sccvn.c (sccvn_dom_walker::unreachable_dom): Remove
private data member.
(sccvn_dom_walker::after_dom_children): Use methods from dom_walker
class.
(run_scc_vn): Likewise.
(sccvn_dom_walker::before_dom_children): Likewise. Return the taken
outgoing edge if a COND, SWITCH, or GOTO are optimized.
* compare-elim.c (find_comparison_dom_walker::before_dom_children):
Change return type to an edge. Always return NULL.
* fwprop.c (single_def_use_dom_walker::before_dom_children): Likewise.
* gimple-ssa-strength-reduction.c
(find_candidates_dom_walker::before_dom_children): Likewise.
* ipa-prop.c (analysis_dom_walker::before_dom_children): Likewise.
(ipcp_modif_dom_walker::before_dom_children): Likewise.
* tree-into-ssa.c (rewrite_dom_walker::before_dom_children): Likewise.
(rewrite_update_dom_walker::before_dom_children): Likewise.
(mark_def_dom_children::before_dom_children): Likewise.
* tree-ssa-dse.c (dse_dom_walker::before_dom_children): Likewise.
* tree-ssa-loop-im.c
(invariantness_dom_walker::before_dom_children): Likewise.
(move_computations_dom_walker::before_dom_walker): Likewise.
* tree-ssa-phiopt.c
(nontrapping_dom_walker::before_dom_children): Likewise.
* tree-ssa-pre.c
(eliminate_dom_walker::before_dom_children): Likewise.
* tree-ssa-propagate.c
(substitute_and_fold_dom_walker::before_dom_children): Likewise.
* tree-ssa-strlen.c
(strlen_dom_walker::before_dom_children): Likewise.
* tree-ssa-uncprop.c
(uncprop_dom_walker::before_dom_children): Likewise.
PR tree-optimization/68619
* gcc.dg/tree-ssa/pr68619-1.c: New test.
* gcc.dg/tree-ssa/pr68619-2.c: New test.
* gcc.dg/tree-ssa/pr68619-3.c: New test.
* gcc.dg/tree-ssa/pr68619-4.c: New test.
* gcc.dg/tree-ssa/pr68619-5.c: New test.
From-SVN: r231527
../../../src/gcc/graphite-optimize-isl.c: In function ‘isl_union_set* scop_get_domains(scop_p)’:
../../../src/gcc/graphite-optimize-isl.c:362:5: error: statement is indented as if it were guarded by... [-Werror=misleading-indentation]
return res;
^~~~~~
In file included from ../../../src/gcc/hash-table.h:236:0,
from ../../../src/gcc/coretypes.h:348,
from ../../../src/gcc/graphite-optimize-isl.c:28:
../../../src/gcc/vec.h:1343:3: note: ...this ‘for’ clause, but it is not
for (I = 0; (V).iterate ((I), &(P)); ++(I))
^
../../../src/gcc/graphite-optimize-isl.c:359:3: note: in expansion of macro ‘FOR_EACH_VEC_ELT’
FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
^~~~~~~~~~~~~~~~
351 static isl_union_set *
352 scop_get_domains (scop_p scop ATTRIBUTE_UNUSED)
353 {
354 int i;
355 poly_bb_p pbb;
356 isl_space *space = isl_set_get_space (scop->param_context);
357 isl_union_set *res = isl_union_set_empty (space);
358
359 FOR_EACH_VEC_ELT (scop->pbbs, i, pbb)
360 res = isl_union_set_add_set (res, isl_set_copy (pbb->domain));
361
362 return res;
^ warning is here
363 }
gcc/ChangeLog:
* graphite-optimize-isl.c (scop_get_domains): Fix indentation.
From-SVN: r231522
../../../src/gcc/ifcvt.c: In function ‘bool noce_try_inverse_constants(noce_if_info*)’:
../../../src/gcc/ifcvt.c:1233:2: error: statement is indented as if it were guarded by... [-Werror=misleading-indentation]
seq = end_ifcvt_sequence (if_info);
^~~
../../../src/gcc/ifcvt.c:1230:7: note: ...this ‘if’ clause, but it is not
if (target != if_info->x)
^~
due to the lack of an outdent after the conditional at lines 1230-1:
1220 if (target)
1221 {
1222 rtx_insn *seq = get_insns ();
1223
1224 if (!seq)
1225 {
1226 end_sequence ();
1227 return false;
1228 }
1229
>>1230 if (target != if_info->x)
>>1231 noce_emit_move_insn (if_info->x, target);
1232
>>1233 seq = end_ifcvt_sequence (if_info);
1234
1235 if (!seq)
1236 return false;
1237
1238 emit_insn_before_setloc (seq, if_info->jump,
1239 INSN_LOCATION (if_info->insn_a));
1240 return true;
1241 }
gcc/ChangeLog:
* ifcvt.c (noce_try_inverse_constants): Fix indentation.
From-SVN: r231521
../../../src/gcc/regrename.c: In function ‘void scan_rtx_address(rtx_insn*, rtx_def**, reg_class, scan_actions, machine_mode, addr_space_t)’:
../../../src/gcc/regrename.c:1314:7: error: statement is indented as if it were guarded by... [-Werror=misleading-indentation]
break;
^
../../../src/gcc/regrename.c:1311:5: note: ...this ‘if’ clause, but it is not
if (!AUTO_INC_DEC)
^
gcc/ChangeLog:
* regrename.c (scan_rtx_address): Fix indentation.
From-SVN: r231520
Fix this warning:
../../../src/gcc/fortran/io.c: In function ‘match gfc_match_open()’:
../../../src/gcc/fortran/io.c:2003:4: error: statement is indented as if it were guarded by... [-Werror=misleading-indentation]
if (!compare_to_allowed_values ("DELIM", delim, NULL, NULL,
^
../../../src/gcc/fortran/io.c:2000:2: note: ...this ‘if’ clause, but it is not
if (!is_char_type ("DELIM", open->delim))
^
gcc/fortran/ChangeLog:
* io.c (gfc_match_open): Fix indentation.
From-SVN: r231519
Fix this warning:
../../../src/gcc/function.c: In function ‘void locate_and_pad_parm(machine_mode, tree, int, int, int, tree, args_size*, locate_and_pad_arg_data*)’:
../../../src/gcc/function.c:4123:2: error: statement is indented as if it were guarded by... [-Werror=misleading-indentation]
{
^
../../../src/gcc/function.c:4119:7: note: ...this ‘if’ clause, but it is not
if (initial_offset_ptr->var)
^
gcc/ChangeLog:
* function.c (locate_and_pad_parm): Fix indentation.
From-SVN: r231518
PR libstdc++/68825
* include/experimental/bits/shared_ptr.h (__shared_ptr, __weak_ptr,
experimental::shared_ptr, experimental::weak_ptr): Constrain
assignment operators.
* testsuite/experimental/memory/shared_ptr/cons/copy_ctor_neg.cc:
Change to a compile-only test and change dg-excess-errors to dg-error.
From-SVN: r231516
PR ada/48013
* gcc-interface/trans.c (empty_stmt_list_p): New predicate.
(gigi): Invoke it to compute the No_Elaboration_Code property.
(insert_code_for): Do not insert the code if it's empty.
From-SVN: r231515
2015-12-10 Tom de Vries <tom@codesourcery.com>
PR ada/65102
* doc/include/fdl.texi: Add nodefaultgnufreedocumentationlicensenode
ifdef to allow disabling default @node GNU Free Documentation License.
* gnat-style.texi: Set nodefaultgnufreedocumentationlicensenode and
define @node GNU Free Documentation License locally.
From-SVN: r231497
2015-12-10 Richard Biener <rguenther@suse.de>
* tree-if-conv.c: Include params.h.
(ifcvt_memrefs_wont_trap): Use PARAM_ALLOW_STORE_DATA_RACES
instead of flag_tree_loop_if_convert_stores to guard cases
we'd introduce store-data-races.
From-SVN: r231495
2015-12-10 Richard Biener <rguenther@suse.de>
PR ipa/68721
* ipa-split.c (split_function): Record return value properly
when the split part doesn't set it.
* gcc.dg/torture/pr68721.c: New testcase.
From-SVN: r231494
2015-12-10 Richard Biener <rguenther@suse.de>
* tree-if-conv.c (if_convertible_loop_p_1): Do not compute
dependences.
(if_convertible_loop_p): Adjust.
From-SVN: r231492
PR 68115/libfortran
* configure.ac: Set libbacktrace_cv_sys_sync to no on hppa*-*-hpux*.
* configure: Regenerate.
* elf.c (backtrace_initialize): Cast __sync_bool_compare_and_swap call
to void.
From-SVN: r231485