From fbcb99d5c59d67b8badc5f1ad81e60da6fcc9ce1 Mon Sep 17 00:00:00 2001 From: rguenth Date: Thu, 15 Sep 2016 12:35:13 +0000 Subject: 2016-09-15 Richard Biener PR middle-end/77544 * fold-const.c (split_tree): Do not split constant ~X. * c-c++-common/torture/pr77544.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240164 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fold-const.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'gcc/fold-const.c') diff --git a/gcc/fold-const.c b/gcc/fold-const.c index bf177b609e5..e5c20528b7e 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -837,15 +837,16 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code, var = negate_expr (var); } } + else if (TREE_CONSTANT (in)) + *conp = in; else if (TREE_CODE (in) == BIT_NOT_EXPR && code == PLUS_EXPR) { - /* -X - 1 is folded to ~X, undo that here. */ + /* -X - 1 is folded to ~X, undo that here. Do _not_ do this + when IN is constant. */ *minus_litp = build_one_cst (TREE_TYPE (in)); var = negate_expr (TREE_OPERAND (in, 0)); } - else if (TREE_CONSTANT (in)) - *conp = in; else var = in; -- cgit v1.2.1 From ac29ece21d1243ab39f49fd72ef7c171cf1feaee Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 16 Sep 2016 19:20:44 +0000 Subject: Add inline functions for various bitwise operations. * hwint.h (least_bit_hwi, pow2_or_zerop, pow2p_hwi, ctz_or_zero): New. * hwint.c (exact_log2): Use pow2p_hwi. (ctz_hwi, ffs_hwi): Use least_bit_hwi. * alias.c (memrefs_conflict_p): Use pow2_or_zerop. * builtins.c (get_object_alignment_2, get_object_alignment) (get_pointer_alignment, fold_builtin_atomic_always_lock_free): Use least_bit_hwi. * calls.c (compute_argument_addresses, store_one_arg): Use least_bit_hwi. * cfgexpand.c (expand_one_stack_var_at): Use least_bit_hwi. * combine.c (force_to_mode): Use least_bit_hwi. * emit-rtl.c (set_mem_attributes_minus_bitpos, adjust_address_1): Use least_bit_hwi. * expmed.c (synth_mult, expand_divmod): Use ctz_or_zero, ctz_hwi. (init_expmed_one_conv): Use pow2p_hwi. * fold-const.c (round_up_loc, round_down_loc): Use pow2_or_zerop. (fold_binary_loc): Use pow2p_hwi. * function.c (assign_parm_find_stack_rtl): Use least_bit_hwi. * gimple-fold.c (gimple_fold_builtin_memory_op): Use pow2p_hwi. * gimple-ssa-strength-reduction.c (replace_ref): Use least_bit_hwi. * hsa-gen.c (gen_hsa_addr_with_align, hsa_bitmemref_alignment): Use least_bit_hwi. * ipa-cp.c (ipcp_alignment_lattice::meet_with_1): Use least_bit_hwi. * ipa-prop.c (ipa_modify_call_arguments): Use least_bit_hwi. * omp-low.c (oacc_loop_fixed_partitions) (oacc_loop_auto_partitions): Use least_bit_hwi. * rtlanal.c (nonzero_bits1): Use ctz_or_zero. * stor-layout.c (place_field): Use least_bit_hwi. * tree-pretty-print.c (dump_generic_node): Use pow2p_hwi. * tree-sra.c (build_ref_for_offset): Use least_bit_hwi. * tree-ssa-ccp.c (ccp_finalize): Use least_bit_hwi. * tree-ssa-math-opts.c (bswap_replace): Use least_bit_hwi. * tree-ssa-strlen.c (handle_builtin_memcmp): Use pow2p_hwi. * tree-vect-data-refs.c (vect_analyze_group_access_1) (vect_grouped_store_supported, vect_grouped_load_supported) (vect_permute_load_chain, vect_shift_permute_load_chain) (vect_transform_grouped_load): Use pow2p_hwi. * tree-vect-generic.c (expand_vector_divmod): Use ctz_or_zero. * tree-vect-patterns.c (vect_recog_divmod_pattern): Use ctz_or_zero. * tree-vect-stmts.c (vectorizable_mask_load_store): Use least_bit_hwi. * tsan.c (instrument_expr): Use least_bit_hwi. * var-tracking.c (negative_power_of_two_p): Use pow2_or_zerop. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240194 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fold-const.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'gcc/fold-const.c') diff --git a/gcc/fold-const.c b/gcc/fold-const.c index e5c20528b7e..e040b2a279b 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -10006,7 +10006,7 @@ fold_binary_loc (location_t loc, mode which allows further optimizations. */ int pop = wi::popcount (warg1); if (!(pop >= BITS_PER_UNIT - && exact_log2 (pop) != -1 + && pow2p_hwi (pop) && wi::mask (pop, false, warg1.get_precision ()) == warg1)) return fold_build2_loc (loc, code, type, op0, wide_int_to_tree (type, masked)); @@ -14252,7 +14252,7 @@ round_up_loc (location_t loc, tree value, unsigned int divisor) } /* If divisor is a power of two, simplify this to bit manipulation. */ - if (divisor == (divisor & -divisor)) + if (pow2_or_zerop (divisor)) { if (TREE_CODE (value) == INTEGER_CST) { @@ -14315,7 +14315,7 @@ round_down_loc (location_t loc, tree value, int divisor) } /* If divisor is a power of two, simplify this to bit manipulation. */ - if (divisor == (divisor & -divisor)) + if (pow2_or_zerop (divisor)) { tree t; -- cgit v1.2.1