aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
AgeCommit message (Collapse)AuthorFilesLines
2016-07-19builtins.c: Use HOST_WIDE_INT_1 instead of (HOST_WIDE_INT) 1...Uros Bizjak1-1/+1
* builtins.c: Use HOST_WIDE_INT_1 instead of (HOST_WIDE_INT) 1, HOST_WIDE_INT_1U instead of (unsigned HOST_WIDE_INT) 1, HOST_WIDE_INT_M1 instead of (HOST_WIDE_INT) -1 and HOST_WIDE_INT_M1U instead of (unsigned HOST_WIDE_INT) -1. * combine.c: Ditto. * cse.c: Ditto. * dojump.c: Ditto. * double-int.c: Ditto. * dse.c: Ditto. * dwarf2out.c: Ditto. * expmed.c: Ditto. * expr.c: Ditto. * fold-const.c: Ditto. * function.c: Ditto. * fwprop.c: Ditto. * genmodes.c: Ditto. * hwint.c: Ditto. * hwint.h: Ditto. * ifcvt.c: Ditto. * loop-doloop.c: Ditto. * loop-invariant.c: Ditto. * loop-iv.c: Ditto. * match.pd: Ditto. * optabs.c: Ditto. * real.c: Ditto. * reload.c: Ditto. * rtlanal.c: Ditto. * simplify-rtx.c: Ditto. * stor-layout.c: Ditto. * toplev.c: Ditto. * tree-ssa-loop-ivopts.c: Ditto. * tree-vect-generic.c: Ditto. * tree-vect-patterns.c: Ditto. * tree.c: Ditto. * tree.h: Ditto. * ubsan.c: Ditto. * varasm.c: Ditto. * wide-int-print.cc: Ditto. * wide-int.cc: Ditto. * wide-int.h: Ditto. From-SVN: r238481
2016-07-11Convert TYPE_ALIGN_OK to a TYPE_LANG_FLAG.Bernd Edlinger1-11/+9
2016-07-11 Bernd Edlinger <bernd.edlinger@hotmail.de> Convert TYPE_ALIGN_OK to a TYPE_LANG_FLAG. * tree-core.h (tree_base::nothrow_flag): Adjust comment. (tree_type_common::lang_flag_7): New. (tree_type_common::spare): Reduce size. * tree.h (TYPE_ALIGN_OK): Remove. (TYPE_LANG_FLAG_7): New. (get_inner_reference): Adjust header. * print-tree.c (print_node): Adjust. * expr.c (get_inner_reference): Remove parameter keep_aligning. (get_bit_range, expand_assignment, expand_expr_addr_expr_1): Adjust calls to get_inner_reference. (expand_expr_real_1): Adjust call to get_inner_reference. Remove handling of TYPE_ALIGN_OK. * builtins.c (get_object_alignment_2): Adjust call to get_inner_reference. Remove handling of VIEW_CONVERT_EXPR. * emit-rtl.c (set_mem_attributes_minus_bitpos): Remove handling of TYPE_ALIGN_OK. * asan.c (instrument_derefs): Adjust calls to get_inner_reference. * cfgexpand.c (expand_debug_expr): Likewise. * dbxout.c (dbxout_expand_expr): Likewise. * dwarf2out.c (loc_list_for_address_of_addr_expr_of_indirect_ref, loc_list_from_tree, fortran_common): Likewise. * fold-const.c (optimize_bit_field_compare, decode_field_reference, fold_unary_loc, fold_comparison, split_address_to_core_and_offset): Likewise. * gimple-laddress.c (execute): Likewise. * gimple-ssa-strength-reduction.c (slsr_process_ref): Likewise. * gimplify.c (gimplify_scan_omp_clauses): Likewise. * hsa-gen.c (gen_hsa_addr): Likewise. * simplifx-rtx.c (delegitimize_mem_from_attrs): Likewise. * tsan.c (instrument_expr): Likewise. * ubsan.c (instrument_bool_enum_load, instrument_object_size): Likewise. * tree.c (verify_type_variant): Remove handling of TYPE_ALIGN_OK. * tree-affine.c (tree_to_aff_combination, get_inner_reference_aff): Adjust calls to get_inner_reference. * tree-data-ref.c (split_constant_offset_1, dr_analyze_innermost): Likewise. * tree-scalar-evolution.c (interpret_rhs_expr): Likewise. * tree-sra.c (ipa_sra_check_caller): Likewise. * tree-ssa-loop-ivopts.c (split_address_cost): Likewise. * tree-ssa-math-opts.c (find_bswap_or_nop_load, bswap_replace): Likewise. * tree-vect-data-refs.c (vect_check_gather, vect_analyze_data_refs): Likewise. * config/mips/mips.c (r10k_safe_mem_expr_p): Likewise. * config/pa/pa.c (pa_emit_move_sequence): Remove handling of TYPE_ALIGN_OK. ada: 2016-07-11 Bernd Edlinger <bernd.edlinger@hotmail.de> Convert TYPE_ALIGN_OK to a TYPE_LANG_FLAG. * gcc-interface/ada-tree.h (TYPE_ALIGN_OK): Define. * gcc-interface/trans.c (Attribute_to_gnu): Adjust call to get_inner_reference. * gcc-interface/utils2.c (build_unary_op): Likewise. From-SVN: r238210
2016-07-08Do not consider COMPLEX_TYPE as fold_convertible_pMartin Liska1-1/+0
PR middle-end/71606 * fold-const.c (fold_convertible_p): As COMPLEX_TYPE folding produces SAVE_EXPRs, thus return false for the type. * gcc.dg/torture/pr71606.c: New test. From-SVN: r238157
2016-06-30re PR middle-end/71693 (ICE: verify_gimple failed (type mismatch in shift ↵Jakub Jelinek1-6/+10
expression, -O0, -O1, -O2, -O3)) PR middle-end/71693 * fold-const.c (fold_binary_loc) <case RROTATE_EXPR>: Cast TREE_OPERAND (arg0, 0) and TREE_OPERAND (arg0, 1) to type first when permuting bitwise operation with rotate. Cast TREE_OPERAND (arg0, 0) to type when cancelling two rotations. * gcc.c-torture/compile/pr71693.c: New test. From-SVN: r237875
2016-06-14re PR middle-end/71310 (Bitfields cause load hit store with smaller store ↵Richard Biener1-9/+8
and larger load) 2016-06-14 Richard Biener <rguenther@suse.de> PR middle-end/71310 PR bootstrap/71510 * expr.h (get_bit_range): Declare. * expr.c (get_bit_range): Export. * fold-const.c (optimize_bit_field_compare): Use get_bit_range and word_mode again to constrain the bitfield access. From-SVN: r237426
2016-06-13Move optimize_minmax_comparison to match.pdMarc Glisse1-118/+0
2016-06-13 Marc Glisse <marc.glisse@inria.fr> * fold-const.c (optimize_minmax_comparison): Remove. (fold_comparison): Remove call to the above. * match.pd (MIN (X, Y) == X, MIN (X, 5) == 0, MIN (X, C1) < C2): New transformations. From-SVN: r237376
2016-06-13re PR middle-end/64516 (arm: wrong unaligned load generated)Richard Biener1-0/+2
2016-06-13 Richard Biener <rguenther@suse.de> PR middle-end/64516 * fold-const.c (fold_unary_loc): Preserve alignment when folding a VIEW_CONVERT_EXPR into a MEM_REF. * gcc.dg/align-3.c: New testcase. From-SVN: r237355
2016-06-11fold-const: Don't access bit fields with too big mode (PR71310)Segher Boessenkool1-1/+12
Currently, optimize_bit_field_compare reads the bitfield in word_mode if it can. If the bit field is normally accessed in a smaller mode, this might be a violation of the memory model, although the "extra" part of the read is not used. But also, previous stores to the bit field will have been done in the smaller mode, and then bigger loads from it cause a LHS problem. PR middle-end/71310 * fold-const.c (optimize_bit_field_compare): Don't try to use word_mode unconditionally for reading the bit field, look at DECL_BIT_FIELD_REPRESENTATIVE instead. gcc/testsuite/ PR middle-end/71310 * gcc.target/powerpc/pr71310.c: New testcase. From-SVN: r237319
2016-06-08re PR c++/71448 (pointer relational comparison fails inside constant expression)Jakub Jelinek1-4/+5
PR c++/71448 * fold-const.c (fold_comparison): Handle CONSTANT_CLASS_P (base0) the same as DECL_P (base0) for indirect_base0. Use equality_code in one further place. * g++.dg/torture/pr71448.C: New test. Co-Authored-By: Richard Biener <rguenther@suse.de> From-SVN: r237212
2016-06-06Selftest frameworkDavid Malcolm1-0/+80
gcc/ChangeLog: * Makefile.in (OBJS): Add function-tests.o, hash-map-tests.o, hash-set-tests.o, rtl-tests.o, selftest-run-tests.o. (OBJS-libcommon): Add selftest.o. (OBJS-libcommon-target): Add selftest.o. (all.internal): Add "selftest". (all.cross): Likewise. (selftest): New phony target. (s-selftest): New target. (selftest-gdb): New phony target. (COLLECT2_OBJS): Add selftest.o. * bitmap.c: Include "selftest.h". (selftest::test_gc_alloc): New function. (selftest::test_set_range): New function. (selftest::test_clear_bit_in_middle): New function. (selftest::test_copying): New function. (selftest::test_bitmap_single_bit_set_p): New function. (selftest::bitmap_c_tests): New function. * common.opt (fself-test): New. * diagnostic-show-locus.c: Include "selftest.h". (make_range): New function. (test_range_contains_point_for_single_point): New function. (test_range_contains_point_for_single_line): New function. (test_range_contains_point_for_multiple_lines): New function. (assert_eq): New function. (test_get_line_width_without_trailing_whitespace): New function. (selftest::diagnostic_show_locus_c_tests): New function. * et-forest.c: Include "selftest.h". (selftest::test_single_node): New function. (selftest::test_simple_tree): New function. (selftest::test_disconnected_nodes): New function. (selftest::et_forest_c_tests): New function. * fold-const.c: Include "selftest.h". (selftest::assert_binop_folds_to_const): New function. (selftest::assert_binop_folds_to_nonlvalue): New function. (selftest::test_arithmetic_folding): New function. (selftest::fold_const_c_tests): New function. * function-tests.c: New file. * gimple.c: Include "selftest.h". Include "gimple-pretty-print.h". (selftest::verify_gimple_pp): New function. (selftest::test_assign_single): New function. (selftest::test_assign_binop): New function. (selftest::test_nop_stmt): New function. (selftest::test_return_stmt): New function. (selftest::test_return_without_value): New function. (selftest::gimple_c_tests): New function. * hash-map-tests.c: New file. * hash-set-tests.c: New file. * input.c: Include "selftest.h". (selftest::assert_loceq): New function. (selftest::test_accessing_ordinary_linemaps): New function. (selftest::test_unknown_location): New function. (selftest::test_builtins): New function. (selftest::test_reading_source_line): New function. (selftest::input_c_tests): New function. * rtl-tests.c: New file. * selftest-run-tests.c: New file. * selftest.c: New file. * selftest.h: New file. * spellcheck.c: Include "selftest.h". (selftest::levenshtein_distance_unit_test_oneway): New function, adapted from testsuite/gcc.dg/plugin/levenshtein_plugin.c. (selftest::levenshtein_distance_unit_test): Likewise. (selftest::spellcheck_c_tests): Likewise. * toplev.c: Include selftest.h. (toplev::run_self_tests): New. (toplev::main): Handle -fself-test. * toplev.h (toplev::run_self_tests): New. * tree.c: Include "selftest.h". (selftest::test_integer_constants): New function. (selftest::test_identifiers): New function. (selftest::test_labels): New function. (selftest::tree_c_tests): New function. * tree-cfg.c: Include "selftest.h". (selftest::push_fndecl): New function. (selftest::test_linear_chain): New function. (selftest::test_diamond): New function. (selftest::test_fully_connected): New function. (selftest::tree_cfg_c_tests): New function. * vec.c: Include "selftest.h". (selftest::safe_push_range): New function. (selftest::test_quick_push): New function. (selftest::test_safe_push): New function. (selftest::test_truncate): New function. (selftest::test_safe_grow_cleared): New function. (selftest::test_pop): New function. (selftest::test_safe_insert): New function. (selftest::test_ordered_remove): New function. (selftest::test_unordered_remove): New function. (selftest::test_block_remove): New function. (selftest::reverse_cmp): New function. (selftest::test_qsort): New function. (selftest::vec_c_tests): New function.c. * wide-int.cc: Include selftest.h and wide-int-print.h. (selftest::from_int <wide_int>): New function. (selftest::from_int <offset_int>): New function. (selftest::from_int <widest_int>): New function. (selftest::assert_deceq): New function. (selftest::assert_hexeq): New function. (selftest::test_printing <VALUE_TYPE>): New function template. (selftest::test_ops <VALUE_TYPE>): New function template. (selftest::test_comparisons <VALUE_TYPE>): New function template. (selftest::run_all_wide_int_tests <VALUE_TYPE>): New function template. (selftest::wide_int_cc_tests): New function. gcc/testsuite/ChangeLog: * gcc.dg/plugin/levenshtein-test-1.c: Delete. * gcc.dg/plugin/levenshtein_plugin.c: Delete. * gcc.dg/plugin/plugin.exp (plugin_test_list): Remove the above. From-SVN: r237144
2016-05-27re PR middle-end/71279 (ICE on trunk gcc with knl target)Ilya Enkovich1-3/+3
gcc/ PR middle-end/71279 * fold-const.c (fold_ternary_loc): Don't fold VEC_COND_EXPR into comparison. gcc/testsuite/ PR middle-end/71279 * gcc.dg/pr71279.c: New test. From-SVN: r236810
2016-05-20re PR target/29756 (SSE intrinsics hard to use without redundant temporaries ↵Richard Guenther1-0/+41
appearing) 2016-05-20 Richard Guenther <rguenther@suse.de> PR tree-optimization/29756 * tree.def (BIT_INSERT_EXPR): New tcc_expression tree code. * expr.c (expand_expr_real_2): Handle BIT_INSERT_EXPR. * fold-const.c (operand_equal_p): Likewise. (fold_ternary_loc): Add constant folding of BIT_INSERT_EXPR. * gimplify.c (gimplify_expr): Handle BIT_INSERT_EXPR. * tree-inline.c (estimate_operator_cost): Likewise. * tree-pretty-print.c (dump_generic_node): Likewise. * tree-ssa-operands.c (get_expr_operands): Likewise. * cfgexpand.c (expand_debug_expr): Likewise. * gimple-pretty-print.c (dump_ternary_rhs): Likewise. * gimple.c (get_gimple_rhs_num_ops): Handle BIT_INSERT_EXPR. * tree-cfg.c (verify_gimple_assign_ternary): Verify BIT_INSERT_EXPR. * tree-ssa.c (non_rewritable_lvalue_p): We can rewrite vector inserts using BIT_FIELD_REF or MEM_REF on the lhs. (execute_update_addresses_taken): Do it. * gcc.dg/tree-ssa/vector-6.c: New testcase. From-SVN: r236501
2016-05-13re PR bootstrap/71071 (ICE --enable-checking=fold : fold check: original ↵Jakub Jelinek1-1/+3
tree changed by fold) PR bootstrap/71071 * fold-const.c (fold_checksum_tree): Allow modification of TYPE_ALIAS_SET during folding. * gcc.dg/pr71071.c: New test. From-SVN: r236222
2016-05-11re PR middle-end/71002 (-fstrict-aliasing breaks Boost's short string ↵Richard Biener1-22/+30
optimization implementation) 2016-05-11 Richard Biener <rguenther@suse.de> PR middle-end/71002 * alias.c (reference_alias_ptr_type): Preserve alias-set zero if the langhook insists on it. * fold-const.c (make_bit_field_ref): Add arg for the original reference and preserve its alias-set. (decode_field_reference): Take exp by reference and adjust it to the original memory reference. (optimize_bit_field_compare): Adjust callers. (fold_truth_andor_1): Likewise. * gimplify.c (gimplify_expr): Adjust in-SSA form test. * g++.dg/torture/pr71002.C: New testcase. From-SVN: r236117
2016-05-10Simple bitop reassoc in match.pdMarc Glisse1-39/+0
2016-05-10 Marc Glisse <marc.glisse@inria.fr> gcc/ * fold-const.c (fold_binary_loc) [(X ^ Y) & Y]: Remove and merge with... * match.pd ((X & Y) ^ Y): ... this. ((X & Y) & Y, (X | Y) | Y, (X ^ Y) ^ Y, (X & Y) & (X & Z), (X | Y) | (X | Z), (X ^ Y) ^ (X ^ Z)): New transformations. gcc/testsuite/ * gcc.dg/tree-ssa/bit-assoc.c: New testcase. * gcc.dg/tree-ssa/pr69270.c: Adjust. * gcc.dg/tree-ssa/vrp59.c: Disable forwprop. From-SVN: r236103
2016-05-06re PR target/70941 (Test miscompiled with -O2.)Richard Biener1-8/+9
2016-05-06 Richard Biener <rguenther@suse.de> PR middle-end/70941 * fold-const.c (split_tree): Always convert to the original type before negating. * gcc.dg/torture/pr70941.c: New testcase. From-SVN: r235943
2016-05-04re PR c++/70906 (ice in add_expr, at tree.c:7925)Jakub Jelinek1-2/+2
PR c++/70906 PR c++/70933 * tree-core.h (enum operand_equal_flag): Add OEP_HASH_CHECK. * tree.c (inchash::add_expr): If !IS_EXPR_CODE_CLASS (tclass), assert flags & OEP_HASH_CHECK, instead of asserting it never happens. Handle TARGET_EXPR. * fold-const.c (operand_equal_p): For hash verification, or in OEP_HASH_CHECK into flags. * g++.dg/opt/pr70906.C: New test. * g++.dg/opt/pr70933.C: New test. From-SVN: r235902
2016-05-04match.pd: Add BIT_FIELD_REF canonicalizations and vector constructor ↵Richard Biener1-72/+14
simplifications. 2016-05-04 Richard Biener <rguenther@suse.de> * match.pd: Add BIT_FIELD_REF canonicalizations and vector constructor simplifications. * fold-const.c (fold_ternary_loc): Remove duplicate functionality here. From-SVN: r235871
2016-05-02Move "X +- C1 CMP C2 to X CMP C2 -+ C1" to match.pdMarc Glisse1-70/+1
2016-05-02 Marc Glisse <marc.glisse@inria.fr> gcc/ * flag-types.h (enum warn_strict_overflow_code): Move ... * coretypes.h: ... here. * fold-const.h (fold_overflow_warning): Declare. * fold-const.c (fold_overflow_warning): Make non-static. (fold_comparison): Move the transformation of X +- C1 CMP C2 into X CMP C2 -+ C1 ... * match.pd: ... here. * gimple-fold.c (fold_stmt_1): Protect with fold_defer_overflow_warnings. gcc/testsuite/ * gcc.dg/tree-ssa/20040305-1.c: Adjust. From-SVN: r235760
2016-05-02Add a wi::to_wide helper functionRichard Sandiford1-6/+3
As Richard says, we ought to have a convenient way of converting an INTEGER_CST to a wide_int of a particular precision without having to extract the sign of the INTEGER_CST's type each time. This patch adds a wi::to_wide helper for that, alongside the existing wi::to_offset and wi::to_widest. Tested on x86_64-linux-gnu and aarch64-linux-gnu. gcc/ * tree.h (wi::to_wide): New function. * expr.c (expand_expr_real_1): Use wi::to_wide. * fold-const.c (int_const_binop_1): Likewise. (extract_muldiv_1): Likewise. gcc/c-family/ * c-common.c (shorten_compare): Use wi::to_wide. From-SVN: r235721
2016-05-02Support << and >> for offset_int and widest_intRichard Sandiford1-2/+2
Following on from the comparison patch, I think it makes sense to support << and >> for offset_int (int128_t) and widest_int (intNNN_t), with >> being arithmetic shift. It doesn't make sense to use logical right shift on a potentially negative offset_int, since the precision of 128 bits has no meaning on the target. Tested on x86_64-linux-gnu and aarch64-linux-gnu. gcc/ * wide-int.h: Update offset_int and widest_int documentation. (WI_SIGNED_SHIFT_RESULT): New macro. (wi::binary_shift): Define signed_shift_result_type for shifts on offset_int- and widest_int-like types. (generic_wide_int): Support <<= and >>= if << and >> are supported. * tree.h (int_bit_position): Use shift operators instead of wi:: shifts. * alias.c (adjust_offset_for_component_ref): Likewise. * expr.c (get_inner_reference): Likewise. * fold-const.c (fold_comparison): Likewise. * gimple-fold.c (fold_nonarray_ctor_reference): Likewise. * gimple-ssa-strength-reduction.c (restructure_reference): Likewise. * tree-dfa.c (get_ref_base_and_extent): Likewise. * tree-ssa-alias.c (indirect_ref_may_alias_decl_p): Likewise. (stmt_kills_ref_p): Likewise. * tree-ssa-ccp.c (bit_value_binop_1): Likewise. * tree-ssa-math-opts.c (find_bswap_or_nop_load): Likewise. * tree-ssa-sccvn.c (copy_reference_ops_from_ref): Likewise. (ao_ref_init_from_vn_reference): Likewise. gcc/cp/ * init.c (build_new_1): Use shift operators instead of wi:: shifts. From-SVN: r235720
2016-04-29re PR sanitizer/70342 (g++ -fsanitize=undefined never finishes compiling ↵Marek Polacek1-0/+3
(>24h) in qtxmlpatterns test suite) PR sanitizer/70342 * fold-const.c (tree_single_nonzero_warnv_p): For TARGET_EXPR, use TARGET_EXPR_SLOT as a base. * g++.dg/ubsan/null-7.C: New test. Co-Authored-By: Jakub Jelinek <jakub@redhat.com> From-SVN: r235637
2016-04-29re PR middle-end/70843 (ICE in add_expr, at tree.c:7913)Jakub Jelinek1-6/+9
PR middle-end/70843 * fold-const.c (operand_equal_p): Don't verify hash value equality if arg0 == arg1. * tree.c (inchash::add_expr): Handle STATEMENT_LIST. Ignore BLOCK and OMP_CLAUSE. * gcc.dg/pr70843.c: New test. From-SVN: r235615
2016-04-28re PR tree-optimization/70777 (x*x pessimised to pow(x,2) with -Og -ffast-math)Richard Biener1-18/+0
2016-04-28 Richard Biener <rguenther@suse.de> PR middle-end/70777 * fold-const.c (fold_binary_loc): Remove x*x to pow(x,2.0) canonicalization. From-SVN: r235545
2016-04-27re PR sanitizer/70683 (-fcompare-debug bug with -fsanitize=address)Jakub Jelinek1-0/+19
PR sanitizer/70683 * tree-core.h (enum operand_equal_flag): Add OEP_NO_HASH_CHECK. * fold-const.c (operand_equal_p): If flag_checking and OEP_NO_HASH_CHECK is not set in flag, recurse with OEP_NO_HASH_CHECK and if it returns non-zero, assert iterative_hash_expr on both args is the same. From-SVN: r235507
2016-04-26match.pd: X + X --> X * 2 for integersMarc Glisse1-19/+0
2016-04-26 Marc Glisse <marc.glisse@inria.fr> gcc/ * genmatch.c (write_predicate): Add ATTRIBUTE_UNUSED. * fold-const.c (fold_binary_loc): Remove 2 transformations superseded by match.pd. * match.pd (x+x -> x*2): Generalize to integers. gcc/testsuite/ * gcc.dg/fold-plusmult.c: Adjust. * gcc.dg/no-strict-overflow-6.c: Adjust. * gcc.dg/gomp/loop-1.c: Xfail some tests. From-SVN: r235444
2016-04-21re PR middle-end/70747 (ICE on valid code on x86_64-linux-gnu: verify_gimple ↵Richard Biener1-2/+2
failed) 2016-04-21 Richard Biener <rguenther@suse.de> PR middle-end/70747 * fold-const.c (fold_comparison): Return properly typed constant boolean. * gcc.dg/pr70747.c: New testcase. From-SVN: r235335
2016-04-02PR c++/67376 - [5/6 regression] Comparison with pointer to past-the-endMartin Sebor1-10/+50
PR c++/67376 - [5/6 regression] Comparison with pointer to past-the-end of array fails inside constant expression PR c++/70170 - [6 regression] bogus not a constant expression error comparing pointer to array to null PR c++/70172 - incorrect reinterpret_cast from integer to pointer error on invalid constexpr initialization PR c++/70228 - insufficient detail in diagnostics for a constexpr out of bounds array subscript gcc/testsuite/ChangeLog: 2016-04-02 Martin Sebor <msebor@redhat.com> PR c++/67376 PR c++/70170 PR c++/70172 PR c++/70228 * g++.dg/cpp0x/constexpr-array-ptr10.C: New test. * g++.dg/cpp0x/constexpr-array-ptr9.C: New test. * g++.dg/cpp0x/constexpr-nullptr-1.C: New test. * g++.dg/cpp0x/constexpr-array5.C: Adjust text of expected diagnostic. * g++.dg/cpp0x/constexpr-string.C: Same. * g++.dg/cpp0x/constexpr-wstring2.C: Same. * g++.dg/cpp0x/pr65398.C: Same. * g++.dg/ext/constexpr-vla1.C: Same. * g++.dg/ext/constexpr-vla2.C: Same. * g++.dg/ext/constexpr-vla3.C: Same. * g++.dg/ubsan/pr63956.C: Same. gcc/cp/ChangeLog: 2016-04-02 Martin Sebor <msebor@redhat.com> PR c++/67376 PR c++/70170 PR c++/70172 PR c++/70228 * constexpr.c (diag_array_subscript): New function. (cxx_eval_array_reference): Detect out of bounds array indices. gcc/ChangeLog: 2016-04-02 Martin Sebor <msebor@redhat.com> PR c++/67376 * fold-const.c (maybe_nonzero_address): New function. (fold_comparison): Call it. Fold equality and relational expressions involving null pointers. (tree_single_nonzero_warnv_p): Call maybe_nonzero_address. From-SVN: r234698
2016-03-30re PR target/70450 (Wrong code with -O0 and -O1.)Richard Biener1-2/+4
2016-03-30 Richard Biener <rguenther@suse.de> PR middle-end/70450 * fold-const.c (extract_muldiv_1): Fix thinko in wide_int::from usage. * gcc.dg/torture/pr70450.c: New testcase. From-SVN: r234571
2016-03-24re PR middle-end/69845 (Expression getting incorrectly optimized after being ↵Richard Henderson1-5/+3
rewritten by compiler) 2016-03-24 Richard Henderson <rth@redhat.com> PR middle-end/69845 * fold-const.c (extract_muldiv_1): Correct test for multiplication overflow. PR middle-end/69845 * gcc.dg/tree-ssa/pr69845-1.c: New test. * gcc.dg/tree-ssa/pr69845-2.c: New test. From-SVN: r234462
2016-03-22re PR target/70333 (Test miscompiled with -O0.)Richard Biener1-7/+6
2016-03-22 Richard Biener <rguenther@suse.de> PR middle-end/70333 * fold-const.c (extract_muldiv_1): Properly perform multiplication in the wide type. * gcc.dg/torture/pr70333.c: New testcase. From-SVN: r234401
2016-03-09re PR middle-end/70127 (wrong code on x86_64-linux-gnu at -O3 in 32-bit and ↵Jakub Jelinek1-0/+3
64-bit modes) PR tree-optimization/70127 * fold-const.c (operand_equal_p): Revert the 2015-10-28 change. * gcc.c-torture/execute/pr70127.c: New test. From-SVN: r234090
2016-03-01re PR middle-end/70022 (ICE: in tree_to_shwi, at tree.c:7328 with ↵Richard Biener1-10/+13
out-of-bounds vector index) 2016-03-01 Richard Biener <rguenther@suse.de> PR middle-end/70022 * fold-const.c (fold_indirect_ref_1): Fix range checking for vector BIT_FIELD_REF extract. * gcc.dg/pr70022.c: New testcase. From-SVN: r233852
2016-02-23re PR c++/69902 (Bogus -Wnonnull-compare for: dynamic_cast<T*>(&ref) == nullptr)Jakub Jelinek1-2/+5
PR c++/69902 * fold-const.c (fold_truth_not_expr): Propagate TREE_NO_WARNING when inverting comparison. * g++.dg/warn/Wnonnull-compare-5.C: New test. From-SVN: r233631
2016-02-18re PR middle-end/69553 (Optimizations O1/O2 makes std::array value incorrect ↵Richard Biener1-5/+24
when passed to function) 2016-02-18 Richard Biener <rguenther@suse.de> PR middle-end/69553 * fold-const.c (operand_equal_p): Properly compare offsets for IMAGPART_EXPR and ARRAY_REF. * g++.dg/torture/pr69553.C: New testcase. From-SVN: r233520
2016-02-16re PR tree-optimization/69801 (gcc ICE on valid code on x86_64-linux-gnu in ↵Richard Biener1-0/+5
"operand_equal_p") 2016-02-16 Richard Biener <rguenther@suse.de> PR middle-end/69801 * fold-const.c (operand_equal_p): For COND_EXPR zero operand mask OEP_ADDRESS_OF. * gcc.dg/pr69801.c: New testcase. From-SVN: r233444
2016-02-01re PR tree-optimization/67921 ("internal compiler error: in ↵Bin Cheng1-8/+21
build_polynomial_chrec, at tree-chrec.h:147" when using -fsanitize=undefined) PR tree-optimization/67921 * fold-const.c (split_tree): New parameters. Convert pointer type variable part to proper type before negating. (fold_binary_loc): Pass new arguments to split_tree. gcc/testsuite/ChangeLog PR tree-optimization/67921 * c-c++-common/ubsan/pr67921.c: New test. From-SVN: r233042
2016-01-18re PR middle-end/68542 (10% 481.wrf performance regression)Yuri Rumyantsev1-1/+22
gcc/ 2016-01-18 Yuri Rumyantsev <ysrumyan@gmail.com> PR middle-end/68542 * fold-const.c (fold_binary_op_with_conditional_arg): Bail out for case of mixind vector and scalar types. (fold_relational_const): Add handling of vector comparison with boolean result. * tree-cfg.c (verify_gimple_comparison): Add argument CODE, allow comparison of vector operands with boolean result for EQ/NE only. (verify_gimple_assign_binary): Adjust call for verify_gimple_comparison. (verify_gimple_cond): Likewise. * tree-vrp.c (extract_code_and_val_from_cond_with_ops): Modify check on valid type of VAL. From-SVN: r232518
2016-01-11fold-const.c (fold_convertible_p): Don't return true for conversion of ↵Jakub Jelinek1-8/+5
VECTOR_TYPE to same sized integral type. * fold-const.c (fold_convertible_p): Don't return true for conversion of VECTOR_TYPE to same sized integral type. (fold_convert_loc): Fix up formatting. Fold conversion of VECTOR_TYPE to same sized integral type using VIEW_CONVERT_EXPR instead of NOP_EXPR. From-SVN: r232236
2016-01-09re PR middle-end/50865 (Invalid code generation for INT64_MIN % 1 on x86_64)Jakub Jelinek1-0/+41
PR middle-end/50865 PR tree-optimization/69097 * fold-const.h (expr_not_equal_to): New prototype. * fold-const.c: Include stringpool.h and tree-ssanames.h. (expr_not_equal_to): New function. * match.pd (X % -Y is the same as X % Y): Don't optimize unless X is known not to be equal to minimum or Y is known not to be equal to -1. * tree-vrp.c (simplify_div_or_mod_using_ranges): Add GSI argument. fold TRUNC_MOD_EXPR if the second argument is not a power of two. (simplify_stmt_using_ranges): Adjust caller. (vrp_finalize): Call set_value_range on SSA_NAMEs before calling substitute_and_fold. * gcc.c-torture/execute/pr50865.c: New test. * gcc.c-torture/execute/pr69097-1.c: New test. * gcc.c-torture/execute/pr69097-2.c: New test. * gcc.dg/pr69097-1.c: New test. * gcc.dg/pr69097-2.c: New test. From-SVN: r232188
2016-01-04Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r232055
2015-12-22re PR c++/67376 (Comparison with pointer to past-the-end of array fails ↵Jakub Jelinek1-44/+79
inside constant expression) PR c++/67376 * fold-const.c (size_low_cst): Removed. (fold_comparison): For POINTER_PLUS_EXPR where base is ADDR_EXPR call get_inner_reference and handle INDIRECT_REF base of it. Use offset_int for computation of the bitpos. (fold_binary_loc) <case EQ_EXPR, NE_EXPR>: Formatting fixes for X +- Y CMP X and C - X CMP X folding. Add X CMP X +- Y and X CMP C - X folding. * g++.dg/cpp0x/constexpr-67376.C: New test. From-SVN: r231909
2015-12-22This series of patches fix PR61441.Sujoy Saraswati1-8/+36
This series of patches fix PR61441. This patch avoids various transformations with signaling NaN operands when flag_signaling_nans is on, to avoid folding which would lose exceptions. Bootstrapped & regression-tested on x86_64-linux-gnu. gcc/ * fold-const.c (const_binop): Convert sNaN to qNaN when flag_signaling_nans is off. (const_unop): Avoid the operation, other than NEGATE and ABS, if flag_signaling_nans is on and the operand is an sNaN. (fold_convert_const_real_from_real): Avoid the operation if flag_signaling_nans is on and the operand is an sNaN. (integer_valued_real_unary_p): Update comment stating it returns false for sNaN values. (integer_valued_real_binary_p, integer_valued_real_call_p): Same. (integer_valued_real_single_p): Same. (integer_valued_real_invalid_p, integer_valued_real_p): Same. * fold-const-call.c (fold_const_pow): Avoid the operation if flag_signaling_nans is on and the operand is an sNaN. (fold_const_builtin_load_exponent) Same. (fold_const_call_sss): Same for CASE_CFN_POWI. * gimple-fold.c (gimple_assign_integer_valued_real_p): Same. (gimple_call_integer_valued_real_p): Same. (gimple_phi_integer_valued_real_p): Same. (gimple_stmt_integer_valued_real_p): Same. * simplify-rtx.c (simplify_const_unary_operation): Avoid the operation if flag_signaling_nans is on and the operand is an sNaN. (simplify_const_binary_operation): Same. * tree-ssa-math-opts.c (gimple_expand_builtin_pow): Avoid the operation if flag_signaling_nans is on and the operand is an sNaN. * gcc.dg/pr61441.c: New testcase. From-SVN: r231901
2015-12-20This series of patches are for fixing PR61441.Sujoy Saraswati1-2/+3
This series of patches are for fixing PR61441. This patch modifies code to use REAL_VALUE_ISSIGNALING_NAN instead of REAL_VALUE_ISNAN to avoid the operatins only for sNaN operands. Bootstrapped & regression-tested on x86_64-linux-gnu. gcc/ * fold-const.c (const_binop): Use REAL_VALUE_ISSIGNALING_NAN instead of REAL_VALUE_ISNAN to avoid the operation for sNaN operands. * simplify-rtx.c (simplify_const_binary_operation): Same. From-SVN: r231857
2015-12-07* fold-const.c (operand_equal_p): Drp flag_strict_aliasing check.Jan Hubicka1-8/+7
From-SVN: r231377
2015-11-25re PR middle-end/68528 ([5 Only] Wrong constant folding)Richard Biener1-30/+25
2015-11-25 Richard Biener <rguenther@suse.de> PR middle-end/68528 * fold-const.c (fold_binary_loc): Do not call negate_expr_p on stripped operands. * gcc.dg/torture/pr68528.c: New testcase. From-SVN: r230870
2015-11-17Make more use of combined_fnRichard Sandiford1-161/+160
This patch generalises fold-const.[hc] routines to use combined_fn instead of built_in_function. It also updates gimple-ssa-backprop,c since the update is simple and it avoids churn on the call to negate_mathfn_p. Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi. gcc/ * fold-const.h (negate_mathfn_p): Take a combined_fn rather than a built_in_function. (tree_call_nonnegative_warnv_p): Take a combined_fn rather than a function decl. (integer_valued_real_call_p): Likewise. * fold-const.c: Include case-cfn-macros.h (negate_mathfn_p): Take a combined_fn rather than a built_in_function. (negate_expr_p): Update accordingly. (tree_call_nonnegative_warnv_p): Take a combined_fn rather than a function decl. (integer_valued_real_call_p): Likewise. (tree_invalid_nonnegative_warnv_p): Update accordingly. (integer_valued_real_p): Likewise. * gimple-fold.c (gimple_call_nonnegative_warnv_p): Update call to tree_call_nonnegative_warnv_p. (gimple_call_integer_valued_real_p): Likewise integer_valued_real_call_p. * gimple-ssa-backprop.c: Include case-cfn-macros.h. (backprop::process_builtin_call_use): Extend to combined_fn. (strip_sign_op_1): Likewise. (backprop::process_use): Don't check for built-in calls here. (backprop::execute): Likewise. (backprop::optimize_builtin_call): Update call to negate_mathfn_p. From-SVN: r230478
2015-11-13fold-const.c (fold_convert_const): Fold changing cv-quals on VECTOR_CST.Jason Merrill1-0/+19
* fold-const.c (fold_convert_const): Fold changing cv-quals on VECTOR_CST. From-SVN: r230358
2015-11-12fold-const.c (fold_binary_loc): Move Convert A/B/C to A/(B*C) to match.pd.Naveen H.S1-45/+0
2015-11-12 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com> * fold-const.c (fold_binary_loc) : Move Convert A/B/C to A/(B*C) to match.pd. Move Convert A/(B/C) to (A/B)*C to match.pd. Move Convert C1/(X*C2) into (C1/C2)/X to match.pd. Move Optimize (X & (-A)) / A where A is a power of 2, to X >> log2(A) to match.pd. * match.pd (rdiv (rdiv:s @0 @1) @2): New simplifier. (rdiv @0 (rdiv:s @1 @2)): New simplifier. (div (convert? (bit_and @0 INTEGER_CST@1)) INTEGER_CST@2): New simplifier. (rdiv REAL_CST@0 (mult @1 REAL_CST@2)): New simplifier. From-SVN: r230204
2015-11-11Fix whitespace+typo from "Share code from fold_array_ctor_reference with fold."Alan Lawrence1-29/+29
* fold-const.c (get_array_ctor_element_at_index): Fix whitespace, typo. From-SVN: r230159