From 9be872b77ba83e579598a983ca71aab58ded4dc6 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Sun, 1 May 2005 10:08:14 +0200 Subject: re PR tree-optimization/18316 (Missed IV optimization) PR tree-optimization/18316 PR tree-optimization/19126 * tree.c (build_int_cst_type): Avoid shift by size of type. * tree-scalar-evolution.c (simple_iv): Add allow_nonconstant_step argument. * tree-scalar-evolution.h (simple_iv): Declaration changed. * tree-ssa-loop-ivopts.c (struct iv_cand): Add depends_on field. (dump_cand): Dump depends_on information. (determine_biv_step): Add argument to simple_iv call. (contains_abnormal_ssa_name_p): Handle case expr == NULL. (find_bivs, find_givs_in_stmt_scev): Do not require step to be a constant. (add_candidate_1): Record depends_on for candidates. (tree_int_cst_sign_bit, constant_multiple_of): New functions. (get_computation_at, get_computation_cost_at, may_eliminate_iv): Handle ivs with nonconstant step. (iv_ca_set_remove_invariants, iv_ca_set_add_invariants): New functions. (iv_ca_set_no_cp, iv_ca_set_cp): Handle cand->depends_on. (create_new_iv): Unshare the step before passing it to create_iv. (free_loop_data): Free cand->depends_on. (build_addr_strip_iref): New function. (find_interesting_uses_address): Use build_addr_strip_iref. (strip_offset_1): Split the recursive part from strip_offset. Strip constant offset component_refs and array_refs. (strip_offset): Split the recursive part to strip_offset_1. (add_address_candidates): Removed. (add_derived_ivs_candidates): Do not use add_address_candidates. (add_iv_value_candidates): Add candidates with stripped constant offset. Consider all candidates with initial value 0 important. (struct affine_tree_combination): New. (aff_combination_const, aff_combination_elt, aff_combination_scale, aff_combination_add_elt, aff_combination_add, tree_to_aff_combination, add_elt_to_tree, aff_combination_to_tree, fold_affine_sum): New functions. (get_computation_at): Use fold_affine_sum. * tree-ssa-loop-manip.c (create_iv): Handle ivs with nonconstant step. * tree-ssa-loop-niter.c (number_of_iterations_exit): Add argument to simple_iv call. * gcc.dg/tree-ssa/loop-8.c: New test. From-SVN: r99059 --- gcc/tree.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'gcc/tree.c') diff --git a/gcc/tree.c b/gcc/tree.c index 21e681c4ae2..48efe09ccdd 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -518,7 +518,7 @@ tree build_int_cst_type (tree type, HOST_WIDE_INT low) { unsigned HOST_WIDE_INT val = (unsigned HOST_WIDE_INT) low; - unsigned HOST_WIDE_INT hi; + unsigned HOST_WIDE_INT hi, mask; unsigned bits; bool signed_p; bool negative; @@ -538,10 +538,12 @@ build_int_cst_type (tree type, HOST_WIDE_INT low) negative = ((val >> (bits - 1)) & 1) != 0; /* Mask out the bits outside of the precision of the constant. */ + mask = (((unsigned HOST_WIDE_INT) 2) << (bits - 1)) - 1; + if (signed_p && negative) - val = val | ((~(unsigned HOST_WIDE_INT) 0) << bits); + val |= ~mask; else - val = val & ~((~(unsigned HOST_WIDE_INT) 0) << bits); + val &= mask; } /* Determine the high bits. */ @@ -556,7 +558,8 @@ build_int_cst_type (tree type, HOST_WIDE_INT low) else { bits -= HOST_BITS_PER_WIDE_INT; - hi = hi & ~((~(unsigned HOST_WIDE_INT) 0) << bits); + mask = (((unsigned HOST_WIDE_INT) 2) << (bits - 1)) - 1; + hi &= mask; } } -- cgit v1.2.1