aboutsummaryrefslogtreecommitdiff
path: root/gcc/match.pd
AgeCommit message (Collapse)AuthorFilesLines
2017-11-16Canonicalize constant multiplies in divisionWilco Dijkstra1-11/+10
This patch implements some of the optimizations discussed in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71026. Canonicalize x / (C1 * y) into (x * C2) / y. This moves constant multiplies out of the RHS of a division in order to allow further simplifications (such as (C1 * x) / (C2 * y) -> (C3 * x) / y) and to enable more reciprocal CSEs. 2017-11-16 Wilco Dijkstra <wdijkstr@arm.com> Jackson Woodruff <jackson.woodruff@arm.com> gcc/ PR tree-optimization/71026 * match.pd: Canonicalize constant multiplies in division. gcc/testsuite/ PR tree-optimization/71026 * gcc.dg/cse_recip.c: New test. Co-Authored-By: Jackson Woodruff <jackson.woodruff@arm.com> From-SVN: r254816
2017-11-13match.pd: Convert fminf<N>...Michael Meissner1-4/+10
[gcc] 2017-11-13 Michael Meissner <meissner@linux.vnet.ibm.com> * match.pd: Convert fminf<N>, fminf<N>x, fmax<N>, and fmax<N>x into the min/max operations for _Float<N> and _Float<N>X types. [gcc/testsuite] 2017-11-13 Michael Meissner <meissner@linux.vnet.ibm.com> * gcc.target/powerpc/float128-minmax.c: New test. From-SVN: r254702
2017-11-07match.pd: Fix build.Richard Biener1-1/+1
2017-11-07 Richard Biener <rguenther@suse.de> * match.pd: Fix build. From-SVN: r254498
2017-11-07PR71026: Canonicalize negates in divisionWilco Dijkstra1-0/+5
Canonicalize x / (- y) into (-x) / y. This moves negates out of the RHS of a division in order to allow further simplifications and potentially more reciprocal CSEs. 2017-11-07 Wilco Dijkstra <wdijkstr@arm.com> Jackson Woodruff <jackson.woodruff@arm.com> gcc/ PR tree-optimization/71026 * match.pd: Canonicalize negate in division. testsuite/ PR 71026/tree-optimization/71026 * gcc.dg/div_neg: New test. From-SVN: r254497
2017-11-07PR80131: Simplification of 1U << (31 - x)Sudakshina Das1-0/+13
Currently the code A << (B - C) is not simplified. However at least a more specific case of 1U << (C -x) where C = precision(type) - 1 can be simplified to (1 << C) >> x. This is done by adding a new simplification rule in match.pd. 2017-11-07 Sudakshina Das <sudi.das@arm.com> gcc/ PR middle-end/80131 * match.pd: Simplify 1 << (C - x) where C = precision (x) - 1. testsuite/ PR middle-end/80131 * testsuite/gcc.dg/pr80131-1.c: New Test. From-SVN: r254496
2017-11-07More bitop simplifications in match.pdMarc Glisse1-0/+42
2017-11-07 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd ((a&~b)|(a^b),(a&~b)^~a,(a|b)&~(a^b),a|~(a^b), (a|b)|(a&^b),(a&b)|~(a^b),~(~a&b),~X^Y): New transformations. gcc/testsuite/ * gcc.dg/tree-ssa/bitops-1.c: New file. From-SVN: r254495
2017-11-07More fold_negate in match.pdMarc Glisse1-0/+20
gcc/ChangeLog: 2017-11-07 Marc Glisse <marc.glisse@inria.fr> * fold-const.c (negate_expr_p) [PLUS_EXPR, MINUS_EXPR]: Handle non-scalar integral types. * match.pd (negate_expr_p): Handle MINUS_EXPR. (-(A-B), -(~A)): New transformations. gcc/testsuite/ChangeLog: 2017-11-07 Marc Glisse <marc.glisse@inria.fr> * gcc.dg/tree-ssa/negminus.c: New test. From-SVN: r254494
2017-11-03Generalize -(-X) a littleMarc Glisse1-4/+23
2017-11-03 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd (-(-A)): Rewrite. gcc/testsuite/ * gcc.dg/tree-ssa/negneg-1.c: New file. * gcc.dg/tree-ssa/negneg-2.c: Likewise. * gcc.dg/tree-ssa/negneg-3.c: Likewise. * gcc.dg/tree-ssa/negneg-4.c: Likewise. From-SVN: r254382
2017-10-11X+Y < X iff Y<0 moved to match.pdMarc Glisse1-3/+42
2017-10-11 Marc Glisse <marc.glisse@inria.fr> gcc/ * fold-const.c (fold_binary_loc) [X +- Y CMP X]: Move ... * match.pd: ... here. ((T) X == (T) Y): Relax condition. gcc/testsuite/ * gcc.dg/Wstrict-overflow-7.c: Xfail. * gcc.dg/pragma-diag-3.c: Likewise. From-SVN: r253642
2017-10-10Require wi::to_wide for treesRichard Sandiford1-80/+105
The wide_int routines allow things like: wi::add (t, 1) to add 1 to an INTEGER_CST T in its native precision. But we also have: wi::to_offset (t) // Treat T as an offset_int wi::to_widest (t) // Treat T as a widest_int Recently we also gained: wi::to_wide (t, prec) // Treat T as a wide_int in preccision PREC This patch therefore requires: wi::to_wide (t) when operating on INTEGER_CSTs in their native precision. This is just as efficient, and makes it clearer that a deliberate choice is being made to treat the tree as a wide_int in its native precision. This also removes the inconsistency that a) INTEGER_CSTs in their native precision can be used without an accessor but must use wi:: functions instead of C++ operators b) the other forms need an explicit accessor but the result can be used with C++ operators. It also helps with SVE, where there's the additional possibility that the tree could be a runtime value. 2017-10-10 Richard Sandiford <richard.sandiford@linaro.org> gcc/ * wide-int.h (wide_int_ref_storage): Make host_dependent_precision a template parameter. (WIDE_INT_REF_FOR): Update accordingly. * tree.h (wi::int_traits <const_tree>): Delete. (wi::tree_to_widest_ref, wi::tree_to_offset_ref): New typedefs. (wi::to_widest, wi::to_offset): Use them. Expand commentary. (wi::tree_to_wide_ref): New typedef. (wi::to_wide): New function. * calls.c (get_size_range): Use wi::to_wide when operating on trees as wide_ints. * cgraph.c (cgraph_node::create_thunk): Likewise. * config/i386/i386.c (ix86_data_alignment): Likewise. (ix86_local_alignment): Likewise. * dbxout.c (stabstr_O): Likewise. * dwarf2out.c (add_scalar_info, gen_enumeration_type_die): Likewise. * expr.c (const_vector_from_tree): Likewise. * fold-const-call.c (host_size_t_cst_p, fold_const_call_1): Likewise. * fold-const.c (may_negate_without_overflow_p, negate_expr_p) (fold_negate_expr_1, int_const_binop_1, const_binop) (fold_convert_const_int_from_real, optimize_bit_field_compare) (all_ones_mask_p, sign_bit_p, unextend, extract_muldiv_1) (fold_div_compare, fold_single_bit_test, fold_plusminus_mult_expr) (pointer_may_wrap_p, expr_not_equal_to, fold_binary_loc) (fold_ternary_loc, multiple_of_p, fold_negate_const, fold_abs_const) (fold_not_const, round_up_loc): Likewise. * gimple-fold.c (gimple_fold_indirect_ref): Likewise. * gimple-ssa-warn-alloca.c (alloca_call_type_by_arg): Likewise. (alloca_call_type): Likewise. * gimple.c (preprocess_case_label_vec_for_gimple): Likewise. * godump.c (go_output_typedef): Likewise. * graphite-sese-to-poly.c (tree_int_to_gmp): Likewise. * internal-fn.c (get_min_precision): Likewise. * ipa-cp.c (ipcp_store_vr_results): Likewise. * ipa-polymorphic-call.c (ipa_polymorphic_call_context::ipa_polymorphic_call_context): Likewise. * ipa-prop.c (ipa_print_node_jump_functions_for_edge): Likewise. (ipa_modify_call_arguments): Likewise. * match.pd: Likewise. * omp-low.c (scan_omp_1_op, lower_omp_ordered_clauses): Likewise. * print-tree.c (print_node_brief, print_node): Likewise. * stmt.c (expand_case): Likewise. * stor-layout.c (layout_type): Likewise. * tree-affine.c (tree_to_aff_combination): Likewise. * tree-cfg.c (group_case_labels_stmt): Likewise. * tree-data-ref.c (dr_analyze_indices): Likewise. (prune_runtime_alias_test_list): Likewise. * tree-dump.c (dequeue_and_dump): Likewise. * tree-inline.c (remap_gimple_op_r, copy_tree_body_r): Likewise. * tree-predcom.c (is_inv_store_elimination_chain): Likewise. * tree-pretty-print.c (dump_generic_node): Likewise. * tree-scalar-evolution.c (iv_can_overflow_p): Likewise. (simple_iv_with_niters): Likewise. * tree-ssa-address.c (addr_for_mem_ref): Likewise. * tree-ssa-ccp.c (ccp_finalize, evaluate_stmt): Likewise. * tree-ssa-loop-ivopts.c (constant_multiple_of): Likewise. * tree-ssa-loop-niter.c (split_to_var_and_offset) (refine_value_range_using_guard, number_of_iterations_ne_max) (number_of_iterations_lt_to_ne, number_of_iterations_lt) (get_cst_init_from_scev, record_nonwrapping_iv) (scev_var_range_cant_overflow): Likewise. * tree-ssa-phiopt.c (minmax_replacement): Likewise. * tree-ssa-pre.c (compute_avail): Likewise. * tree-ssa-sccvn.c (vn_reference_fold_indirect): Likewise. (vn_reference_maybe_forwprop_address, valueized_wider_op): Likewise. * tree-ssa-structalias.c (get_constraint_for_ptr_offset): Likewise. * tree-ssa-uninit.c (is_pred_expr_subset_of): Likewise. * tree-ssanames.c (set_nonzero_bits, get_nonzero_bits): Likewise. * tree-switch-conversion.c (collect_switch_conv_info, array_value_type) (dump_case_nodes, try_switch_expansion): Likewise. * tree-vect-loop-manip.c (vect_gen_vector_loop_niters): Likewise. (vect_do_peeling): Likewise. * tree-vect-patterns.c (vect_recog_bool_pattern): Likewise. * tree-vect-stmts.c (vectorizable_load): Likewise. * tree-vrp.c (compare_values_warnv, vrp_int_const_binop): Likewise. (zero_nonzero_bits_from_vr, ranges_from_anti_range): Likewise. (extract_range_from_binary_expr_1, adjust_range_with_scev): Likewise. (overflow_comparison_p_1, register_edge_assert_for_2): Likewise. (is_masked_range_test, find_switch_asserts, maybe_set_nonzero_bits) (vrp_evaluate_conditional_warnv_with_ops, intersect_ranges): Likewise. (range_fits_type_p, two_valued_val_range_p, vrp_finalize): Likewise. (evrp_dom_walker::before_dom_children): Likewise. * tree.c (cache_integer_cst, real_value_from_int_cst, integer_zerop) (integer_all_onesp, integer_pow2p, integer_nonzerop, tree_log2) (tree_floor_log2, tree_ctz, mem_ref_offset, tree_int_cst_sign_bit) (tree_int_cst_sgn, get_unwidened, int_fits_type_p): Likewise. (get_type_static_bounds, num_ending_zeros, drop_tree_overflow) (get_range_pos_neg): Likewise. * ubsan.c (ubsan_expand_ptr_ifn): Likewise. * config/darwin.c (darwin_mergeable_constant_section): Likewise. * config/aarch64/aarch64.c (aapcs_vfp_sub_candidate): Likewise. * config/arm/arm.c (aapcs_vfp_sub_candidate): Likewise. * config/avr/avr.c (avr_fold_builtin): Likewise. * config/bfin/bfin.c (bfin_local_alignment): Likewise. * config/msp430/msp430.c (msp430_attr): Likewise. * config/nds32/nds32.c (nds32_insert_attributes): Likewise. * config/powerpcspe/powerpcspe-c.c (altivec_resolve_overloaded_builtin): Likewise. * config/powerpcspe/powerpcspe.c (rs6000_aggregate_candidate) (rs6000_expand_ternop_builtin): Likewise. * config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin): Likewise. * config/rs6000/rs6000.c (rs6000_aggregate_candidate): Likewise. (rs6000_expand_ternop_builtin): Likewise. * config/s390/s390.c (s390_handle_hotpatch_attribute): Likewise. gcc/ada/ * gcc-interface/decl.c (annotate_value): Use wi::to_wide when operating on trees as wide_ints. gcc/c/ * c-parser.c (c_parser_cilk_clause_vectorlength): Use wi::to_wide when operating on trees as wide_ints. * c-typeck.c (build_c_cast, c_finish_omp_clauses): Likewise. (c_tree_equal): Likewise. gcc/c-family/ * c-ada-spec.c (dump_generic_ada_node): Use wi::to_wide when operating on trees as wide_ints. * c-common.c (pointer_int_sum): Likewise. * c-pretty-print.c (pp_c_integer_constant): Likewise. * c-warn.c (match_case_to_enum_1): Likewise. (c_do_switch_warnings): Likewise. (maybe_warn_shift_overflow): Likewise. gcc/cp/ * cvt.c (ignore_overflows): Use wi::to_wide when operating on trees as wide_ints. * decl.c (check_array_designated_initializer): Likewise. * mangle.c (write_integer_cst): Likewise. * semantics.c (cp_finish_omp_clause_depend_sink): Likewise. gcc/fortran/ * target-memory.c (gfc_interpret_logical): Use wi::to_wide when operating on trees as wide_ints. * trans-const.c (gfc_conv_tree_to_mpz): Likewise. * trans-expr.c (gfc_conv_cst_int_power): Likewise. * trans-intrinsic.c (trans_this_image): Likewise. (gfc_conv_intrinsic_bound): Likewise. (conv_intrinsic_cobound): Likewise. gcc/lto/ * lto.c (compare_tree_sccs_1): Use wi::to_wide when operating on trees as wide_ints. gcc/objc/ * objc-act.c (objc_decl_method_attributes): Use wi::to_wide when operating on trees as wide_ints. From-SVN: r253595
2017-10-02Fix mismatched precisions in tree arithmeticRichard Sandiford1-3/+4
The tree wi:: decompose routine wasn't asserting that the requested precision matched the tree's precision. This could make a difference for unsigned trees that are exactly N HWIs wide and that have the upper bit set, since we then need an extra zero HWI when extending it to wider precisions (as for wi::to_widest). This patch adds the assert and fixes the fallout shown by the testsuite. Go seems to be unaffected. 2017-10-02 Richard Sandiford <richard.sandiford@linaro.org> gcc/ * tree.h (wi::int_traits <const_tree>::decompose): Assert that the requested precision matches the type's. * calls.c (alloc_max_size): Calculate the new candidate size as a widest_int and use wi::to_widest when comparing it with the current candidate size. * gimple-ssa-warn-alloca.c (pass_walloca::execute): Compare with zero rather than integer_zero_node. * match.pd: Check for a no-op conversion before using wi::add rather than after. Use tree_to_uhwi when summing small shift counts into an unsigned int. gcc/c-family/ * c-warn.c (warn_tautological_bitwise_comparison): Use wi::to_widest when combining the original unconverted comparison operands. gcc/cp/ * constexpr.c (cxx_eval_store_expression): Use wi::to_widest when comparing the array bounds with an ARRAY_REF index. gcc/ada/ * gcc-interface/decl.c (annotate_value): Use wi::to_widest when handling the form (plus/mult (convert @0) @1). From-SVN: r253341
2017-09-29re PR middle-end/82319 (ICE in generic_simplify_148, at generic-match.c:6436)Yury Gribov1-1/+1
2017-09-29 Yury Gribov <tetra2005@gmail.com> PR middle-end/82319 gcc/ * match.pd: Fix handling of NaNs in pattern. gcc/testsuite/ * c-c++/common/pr57371-4.c: Test NaN comparisons. From-SVN: r253307
2017-09-27match.pd ((X / Y) == 0 -> X < Y): New pattern.Prathamesh Kulkarni1-0/+12
2017-09-26 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> * match.pd ((X / Y) == 0 -> X < Y): New pattern. ((X / Y) != 0 -> X >= Y): Likewise. testsuite/ * gcc.dg/tree-ssa/cmpdiv.c: New test. From-SVN: r253218
2017-09-22re PR middle-end/35691 (Missed (a == 0) && (b == 0) into (a|(typeof(a)(b)) ↵Jakub Jelinek1-6/+15
== 0 when the types don't match) PR middle-end/35691 * match.pd: Simplify x == -1 & y == -1 into (x & y) == -1 and x != -1 | y != -1 into (x & y) != -1. * gcc.dg/pr35691-1.c: Use -fdump-tree-forwprop1-details instead of -fdump-tree-forwprop-details in dg-options. * gcc.dg/pr35691-2.c: Likewise. * gcc.dg/pr35691-3.c: New test. * gcc.dg/pr35691-4.c: New test. From-SVN: r253107
2017-09-15re PR tree-optimization/71026 (Missing division optimizations)Jackson Woodruff1-0/+7
2017-09-15 Jackson Woodruff <jackson.woodruff@arm.com> PR tree-optimization/71026 * match.pd: Move RDIV patterns from fold-const.c * fold-const.c (distribute_real_division): Removed. (fold_binary_loc): Remove calls to distribute_real_divison. PR tree-optimization/71026 * gcc/testsuire/gcc.dg/fold-div-1.c: Use -O1. From-SVN: r252827
2017-09-12re PR middle-end/82149 (match.pd: 2919: bad if test ?)Richard Biener1-1/+1
2017-09-12 Richard Biener <rguenther@suse.de> PR middle-end/82149 * match.pd ((FTYPE) N CMP CST): Fix typo. From-SVN: r252007
2017-08-30[34/77] Add a SCALAR_INT_TYPE_MODE macroRichard Sandiford1-1/+1
This patch adds a SCALAR_INT_TYPE_MODE macro that asserts that the type has a scalar integer mode and returns it as a scalar_int_mode. 2017-08-30 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * tree.h (SCALAR_INT_TYPE_MODE): New macro. * builtins.c (expand_builtin_signbit): Use it. * cfgexpand.c (expand_debug_expr): Likewise. * dojump.c (do_jump): Likewise. (do_compare_and_jump): Likewise. * dwarf2cfi.c (expand_builtin_init_dwarf_reg_sizes): Likewise. * expmed.c (make_tree): Likewise. * expr.c (expand_expr_real_2): Likewise. (expand_expr_real_1): Likewise. (try_casesi): Likewise. * fold-const-call.c (fold_const_call_ss): Likewise. * fold-const.c (unextend): Likewise. (extract_muldiv_1): Likewise. (fold_single_bit_test): Likewise. (native_encode_int): Likewise. (native_encode_string): Likewise. (native_interpret_int): Likewise. * gimple-fold.c (gimple_fold_builtin_memset): Likewise. * internal-fn.c (expand_addsub_overflow): Likewise. (expand_neg_overflow): Likewise. (expand_mul_overflow): Likewise. (expand_arith_overflow): Likewise. * match.pd: Likewise. * stor-layout.c (layout_type): Likewise. * tree-cfg.c (verify_gimple_assign_ternary): Likewise. * tree-ssa-math-opts.c (convert_mult_to_widen): Likewise. * tree-ssanames.c (get_range_info): Likewise. * tree-switch-conversion.c (array_value_type) Likewise. * tree-vect-patterns.c (vect_recog_rotate_pattern): Likewise. (vect_recog_divmod_pattern): Likewise. (vect_recog_mixed_size_cond_pattern): Likewise. * tree-vrp.c (extract_range_basic): Likewise. (simplify_float_conversion_using_ranges): Likewise. * tree.c (int_fits_type_p): Likewise. * ubsan.c (instrument_bool_enum_load): Likewise. * varasm.c (mergeable_string_section): Likewise. (narrowing_initializer_constant_valid_p): Likewise. (output_constant): Likewise. gcc/cp/ * cvt.c (cp_convert_to_pointer): Use SCALAR_INT_TYPE_MODE. gcc/fortran/ * target-memory.c (size_integer): Use SCALAR_INT_TYPE_MODE. (size_logical): Likewise. gcc/objc/ * objc-encoding.c (encode_type): Use SCALAR_INT_TYPE_MODE. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r251486
2017-08-21Add a type_has_mode_precision_p helper functionRichard Sandiford1-17/+10
...to replace instances of: TYPE_PRECISION (t) == GET_MODE_PRECISION (TYPE_MODE (t)) These conditions would need to be rewritten with variable-sized modes anyway. 2017-08-21 Richard Sandiford <richard.sandiford@linaro.org> gcc/ * tree.h (type_has_mode_precision_p): New function. * convert.c (convert_to_integer_1): Use it. * expr.c (expand_expr_real_2): Likewise. (expand_expr_real_1): Likewise. * fold-const.c (fold_single_bit_test_into_sign_test): Likewise. * match.pd: Likewise. * tree-ssa-forwprop.c (simplify_rotate): Likewise. * tree-ssa-math-opts.c (convert_mult_to_fma): Likewise. * tree-tailcall.c (process_assignment): Likewise. * tree-vect-loop.c (vectorizable_reduction): Likewise. * tree-vect-patterns.c (vect_recog_vector_vector_shift_pattern) (vect_recog_mult_pattern, vect_recog_divmod_pattern): Likewise. * tree-vect-stmts.c (vectorizable_conversion): Likewise. (vectorizable_assignment): Likewise. (vectorizable_shift): Likewise. (vectorizable_operation): Likewise. * tree-vrp.c (register_edge_assert_for_2): Likewise. From-SVN: r251231
2017-08-21This patch simplifies pow (C, x) into exp (x * C1) if C > 0, C1 = log (C).Wilco Dijkstra1-0/+10
Do this only for fast-math as accuracy is reduced. This is much faster since pow is more complex than exp. gcc/ * match.pd: Add pow (C, x) simplification From-SVN: r251230
2017-08-04Remove useless floating point casts in comparisons.Yury Gribov1-0/+74
2017-08-04 Yury Gribov <tetra2005@gmail.com> PR tree-optimization/57371 gcc/ * match.pd: New pattern. gcc/testsuite/ * c-c++-common/pr57371-1.c: New test. * c-c++-common/pr57371-2.c: New test. * c-c++-common/pr57371-3.c: New test. * c-c++-common/pr57371-4.c: New test. * gcc.dg/pr57371-5.c: New test. From-SVN: r250877
2017-08-01tree.h (POINTER_TYPE_OVERFLOW_UNDEFINED): Delete.Bin Cheng1-8/+1
* tree.h (POINTER_TYPE_OVERFLOW_UNDEFINED): Delete. * fold-const.c (fold_comparison, fold_binary_loc): Delete use of above macro. * match.pd: Ditto in address comparison pattern. gcc/testsuite * gcc.dg/no-strict-overflow-7.c: Revise comment and test string. * gcc.dg/tree-ssa/pr81388-1.c: Ditto. From-SVN: r250765
2017-07-28match.pd: Remove superfluous :c.Richard Biener1-1/+1
2017-07-28 Richard Biener <rguenther@suse.de> * match.pd: Remove superfluous :c. * genmatch.c (simplify::id): Add member. (lower_commutative, lower_opt_convert, lower_cond, lower_for): Copy id. (current_id): New global. (dt_node::parent): Move from ... (dt_operand::parent): ... here. Add for_id member. (is_a_helper <dt_operand *>::test): DT_TRUE is also a dt_operand. (decision_tree::find_node): Relax order requirement when merging DT_TRUE nodes to ones inbetween the current simplify and the one we try to merge with. Add diagnostic whenever we need to enforce pattern order by not merging. (decision_tree::insert): Set current_id. (decision_tree::print_node): Dump parent node and for_id. (parser::last_id): Add member. (parser::push_simplify): Assign unique id. (parser::parser): Initialize last_id. From-SVN: r250664
2017-07-28re PR middle-end/81502 (In some cases the data is moved to memory ↵Richard Biener1-0/+22
unnecessarily [partial regression]) 2017-07-28 Richard Biener <rguenther@suse.de> PR tree-optimization/81502 * match.pd: Add pattern combining BIT_INSERT_EXPR with BIT_FIELD_REF. * tree-cfg.c (verify_expr): Verify types of BIT_FIELD_REF size/pos operands. (verify_gimple_assign_ternary): Likewise for BIT_INSERT_EXPR pos. * gimple-fold.c (maybe_canonicalize_mem_ref_addr): Use bitsizetype for BIT_FIELD_REF args. * fold-const.c (make_bit_field_ref): Likewise. * tree-vect-stmts.c (vectorizable_simd_clone_call): Likewise. * gcc.target/i386/pr81502.c: New testcase. From-SVN: r250659
2017-07-25match.pd: combine successive multiplications by constantsAlexander Monakov1-0/+13
* match.pd ((X * CST1) * CST2): Simplify to X * (CST1 * CST2). testsuite: * gcc.dg/tree-ssa/assoc-2.c: Enhance. * gcc.dg/tree-ssa/slsr-4.c: Adjust. From-SVN: r250524
2017-07-25match.pd: reassociate multiplicationsAlexander Monakov1-0/+8
* match.pd ((X * CST) * Y): Reassociate to (X * Y) * CST. testsuite/ * gcc.dg/tree-ssa/assoc-2.c: New testcase. From-SVN: r250523
2017-07-20match.pd (((m1 >/</>=/<= m2) * d -> (m1 >/</>=/<= m2) ? d : 0): New pattern.Naveen H.S1-0/+6
gcc * match.pd (((m1 >/</>=/<= m2) * d -> (m1 >/</>=/<= m2) ? d : 0): New pattern. gcc/testsuite * gcc.dg/tree-ssa/vrp116.c: New Test. From-SVN: r250377
2017-07-19re PR tree-optimization/81346 (Missed constant propagation into comparison)Jakub Jelinek1-0/+13
PR tree-optimization/81346 * match.pd: Optimize (X - 1U) <= INT_MAX-1U into (int) X > 0. * gcc.dg/tree-ssa/pr81346-5.c: New test. From-SVN: r250342
2017-07-19re PR tree-optimization/81346 (Missed constant propagation into comparison)Jakub Jelinek1-0/+54
PR tree-optimization/81346 * fold-const.h (fold_div_compare, range_check_type): Declare. * fold-const.c (range_check_type): New function. (build_range_check): Use range_check_type. (fold_div_compare): No longer static, rewritten into a match.pd helper function. (fold_comparison): Don't call fold_div_compare here. * match.pd (X / C1 op C2): New optimization using fold_div_compare as helper function. * gcc.dg/tree-ssa/pr81346-1.c: New test. * gcc.dg/tree-ssa/pr81346-2.c: New test. * gcc.dg/tree-ssa/pr81346-3.c: New test. * gcc.dg/tree-ssa/pr81346-4.c: New test. * gcc.target/i386/umod-3.c: Hide comparison against 1 from the compiler to avoid X / C1 op C2 optimization to trigger. From-SVN: r250338
2017-07-17re PR tree-optimization/81428 (ICE: in build_one_cst, at tree.c:2079 with ↵Jakub Jelinek1-2/+3
-O2. Fixed point division.) PR tree-optimization/81428 * match.pd (X / X -> one): Don't optimize _Fract divisions, as 1 can't be built for those types. * gcc.dg/fixed-point/pr81428.c: New test. From-SVN: r250265
2017-06-28re PR tree-optimization/81227 (ICE in get_single_symbol, at tree-vrp.c:799)Richard Biener1-1/+1
2017-06-28 Richard Biener <rguenther@suse.de> PR middle-end/81227 * fold-const.c (negate_expr_p): Use TYPE_UNSIGNED, not TYPE_OVERFLOW_WRAPS. * match.pd (negate_expr_p): Likewise. * tree-ssa-reassoc.c (optimize_range_tests_diff): Use fold_build2, not fold_binary. * gcc.dg/pr81227.c: New testcase. From-SVN: r249742
2017-06-28Simplify 3*x == 3*y for wrapping typesMarc Glisse1-8/+19
2017-06-28 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd ((X & ~Y) | (~X & Y)): Generalize to + and ^. (x * C EQ/NE y * C): New transformation. gcc/testsuite/ * gcc.dg/tree-ssa/addadd.c: Remove test duplicated in addadd-2.c. * gcc.dg/tree-ssa/mulcmp-1.c: New file. From-SVN: r249732
2017-06-27match.pd (X >/>=/</<= 0 ? 1.0 : -1.0): New patterns.Andrew Pinski1-0/+52
2017-06-27 Andrew Pinski <apinski@cavium.com> * match.pd (X >/>=/</<= 0 ? 1.0 : -1.0): New patterns. (X * copysign (1.0, X)): New pattern. (X * copysign (1.0, -X)): New pattern. (copysign (-1.0, CST)): New pattern. 2017-06-27 Andrew Pinski <apinski@cavium.com> * gcc.dg/tree-ssa/copy-sign-1.c: New testcase. * gcc.dg/tree-ssa/copy-sign-2.c: New testcase. * gcc.dg/tree-ssa/mult-abs-2.c: New testcase. From-SVN: r249704
2017-06-27Simple reassoc transforms in match.pdMarc Glisse1-0/+12
2017-06-27 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd ((A+-B)+(C-A), (A+B)-(A-C)): New transformations. gcc/testsuite/ * gcc.dg/tree-ssa/assoc-1.c: New file. From-SVN: r249686
2017-06-22[Patch match.pd] Fold (A / (1 << B)) to (A >> B)James Greenhalgh1-0/+12
For the testcase in the patch: unsigned long f2 (unsigned long a, int b) { unsigned long x = 1UL << b; return a / x; } We currently generate an unsigned division and a left shift, where we could instead generate a right shift. gcc/ 2017-06-21 James Greenhalgh <james.greenhalgh@arm.com> * match.pd (A / (1 << B) -> A >> B): New. * generic-match-head.c: Include optabs-tree.h. * gimple-match-head.c: Likewise. * optabs-tree.h (target_supports_op_p): New. * optabs-tree.c (target_supports_op_p): New. gcc/testsuite/ 2017-06-21 James Greenhalgh <james.greenhalgh@arm.com> * gcc.dg/tree-ssa/forwprop-37.c: New. From-SVN: r249502
2017-06-21NOP conversions in X+CST+CSTMarc Glisse1-9/+49
2017-06-21 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd (nop_convert): New predicate. ((A +- CST1) +- CST2): Allow some NOP conversions. gcc/testsuite/ * gcc.dg/tree-ssa/addadd.c: Un-XFAIL. * gcc.dg/tree-ssa/addadd-2.c: New file. From-SVN: r249447
2017-06-13match.pd: New pattern.Yury Gribov1-0/+28
2017-06-13 Yury Gribov <tetra2005@gmail.com> gcc/ * match.pd: New pattern. gcc/testsuite/ * c-c++-common/fold-masked-cmp-3.c: New test. From-SVN: r249151
2017-05-27re PR bootstrap/80887 (gnat bootstrap fails at s-regpat.o: raised ↵Jakub Jelinek1-32/+8
STORAGE_ERROR : stack overflow or erroneous memory access) PR bootstrap/80887 2017-05-25 Marc Glisse <marc.glisse@inria.fr> * match.pd ((A +- CST1) +- CST2): Allow some conversions. * gcc.dg/tree-ssa/addadd.c: Xfail all scan-tree-dump*. From-SVN: r248533
2017-05-25Relax VIEW_CONVERT_EXPR - CONVERT_EXPR combinationMarc Glisse1-3/+6
2017-05-25 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd (view_convert (convert@0 @1)): Handle zero-extension. gcc/testsuite/ * gcc.dg/tree-ssa/vce-1.c: New file. From-SVN: r248449
2017-05-25Allow some NOP conversions in (X+CST1)+CST2 in match.pdMarc Glisse1-8/+32
2017-05-25 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd ((A +- CST1) +- CST2): Allow some conversions. * tree.c (drop_tree_overflow): Handle COMPLEX_CST and VECTOR_CST. gcc/testsuite/ * gcc.dg/tree-ssa/addadd.c: New file. From-SVN: r248448
2017-05-25Move "(A & C) == D is false when D & ~C != 0" to match.pdMarc Glisse1-0/+27
2017-05-25 Marc Glisse <marc.glisse@inria.fr> * fold-const.c (fold_binary_loc) [(A & C) == D]: Remove transformation. * match.pd (X == C): Rewrite it here. (with_possible_nonzero_bits, with_possible_nonzero_bits2, with_certain_nonzero_bits2): New predicates. * tree-ssanames.c (get_nonzero_bits): Handle INTEGER_CST. From-SVN: r248447
2017-05-18Move X==15-X to match.pdMarc Glisse1-0/+7
2017-05-18 Marc Glisse <marc.glisse@inria.fr> * fold-const.c (fold_binary_loc): Move transformation... * match.pd (C - X CMP X): ... here. From-SVN: r248193
2017-05-10re PR tree-optimization/77644 (missed optimization with sqrt in comparison)Prathamesh Kulkarni1-1/+6
2017-05-10 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> PR tree-optimization/77644 * match.pd (sqrt(x) cmp sqrt(y) -> x cmp y): New pattern. testsuite/ * gcc.dg/tree-ssa/pr77644.c: New test-case. From-SVN: r247835
2017-04-28Drop Z from X + Z < Y + ZMarc Glisse1-0/+48
2017-04-28 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd (X+Z OP Y+Z, X-Z OP Y-Z, Z-X OP Z-Y): New transformations. gcc/testsuite/ * gcc.dg/tree-ssa/cmpexactdiv-2.c: Update for X-Z OP Y-Z. From-SVN: r247398
2017-04-24X /[ex] 4 < Y /[ex] 4Marc Glisse1-0/+7
2017-04-24 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd (X/[ex]C CMP Y/[ex]C): New transformation. gcc/testsuite/ * gcc.dg/tree-ssa/cmpexactdiv-2.c: New file. From-SVN: r247107
2017-04-04re PR tree-optimization/80281 (Wrong constant folding)Richard Biener1-9/+21
2017-04-04 Richard Biener <rguenther@suse.de> PR middle-end/80281 * match.pd (A + (-B) -> A - B): Make sure to preserve unsigned arithmetic done for the negate or the plus. Simplify. (A - (-B) -> A + B): Likewise. * fold-const.c (split_tree): Make sure to not negate pointers. * gcc.dg/torture/pr80281.c: New testcase. From-SVN: r246674
2017-03-03re PR middle-end/79818 (wrong code with -fwrapv and -Os/-O1/-O2/-O3)Richard Biener1-1/+2
2017-03-03 Richard Biener <rguenther@suse.de> PR middle-end/79818 * match.pd ( X +- C1 CMP C2 -> X CMP C2 -+ C1): Add missing TYPE_OVERFLOW_UNDEFINED check. * gcc.dg/torture/pr79818.c: New testcase. From-SVN: r245860
2017-01-04re PR tree-optimization/71563 (Regression in GCC-7.0.0's optimizer.)Jakub Jelinek1-0/+15
PR tree-optimization/71563 * match.pd: Simplify X << Y into X if Y is known to be 0 or out of range value - has low bits known to be zero. * gcc.dg/tree-ssa/pr71563.c: New test. From-SVN: r244050
2017-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r243994
2016-12-21match.pd (max:c @0 (plus@2 @0 INTEGER_CST@1)): New Pattern.Naveen H.S1-0/+18
2016-12-22 Andrew Pinski <apinski@cavium.com> Naveen H.S <Naveen.Hurugalawadi@cavium.com> gcc * match.pd (max:c @0 (plus@2 @0 INTEGER_CST@1)): New Pattern. (min:c @0 (plus@2 @0 INTEGER_CST@1)) : New Pattern. gcc/testsuite * gcc.dg/max.c: New Testcase. * gcc.dg/min.c: New Testcase. From-SVN: r243838
2016-12-10re PR tree-optimization/78720 (Illegal instruction in generated code)Jakub Jelinek1-6/+11
PR tree-optimization/78720 * match.pd (A < 0 ? C : 0): Only optimize for signed A. If shift is negative, sign extend to @1's type and than AND with C. * gcc.c-torture/execute/pr78720.c: New test. Co-Authored-By: Marc Glisse <marc.glisse@inria.fr> From-SVN: r243516