- 19 Dec, 2018 29 commits
-
-
Not all qualifiers are asm qualifiers. We can talk about that in a nicer way than just giving a generic parser error. This also adds two testcases for C++, that previously were for C only. c/ * c-parser.c (c_parser_asm_statement) <RID_CONST, RID_RESTRICT>: Give a more specific error message (instead of just falling through). cp/ * parser.c (cp_parser_asm_definition) <RID_CONST, RID_RESTRICT>: Give a more specific error message (instead of just falling through). testsuite/ * g++.dg/asm-qual-1.C: New testcase. * g++.dg/asm-qual-2.C: New testcase. * gcc.dg/asm-qual-1.c: Update. From-SVN: r267279
Segher Boessenkool committed -
Also as suggested by Jason. c/ * c-parser.c (c_parser_asm_statement): Keep track of the location each asm qualifier is first seen; use that to give nicer "duplicate asm qualifier" messages. Delete 'quals" variable, instead pass the "is_volatile_ flag to build_asm_stmt directly. * c-tree.h (build_asm_stmt): Make the first arg bool instead of tree. * c-typeck.c (build_asm_stmt): Ditto; adjust. cp/ * parser.c (cp_parser_asm_definition): Rewrite the loop to work without "done" boolean variable. * parser.c (cp_parser_asm_definition): Keep track of the location each asm qualifier is first seen; use that to give nicer "duplicate asm qualifier" messages. From-SVN: r267278
Segher Boessenkool committed -
As suggested by Jason. c/ * c-parser.c (c_parser_asm_statement): Rewrite the loop to work without "done" boolean variable. cp/ * parser.c (cp_parser_asm_definition): Rewrite the loop to work without "done" boolean variable. From-SVN: r267277
Segher Boessenkool committed -
PR c++/88375 reports that errors relating to invalid conversions in initializations are reported at unhelpfully vague locations, as in e.g.: enum struct a : int { one, two }; struct foo { int e1, e2; a e3; } arr[] = { { 1, 2, a::one }, { 3, a::two }, { 4, 5, a::two } }; for which g++ trunk emits the vague: pr88375.cc:12:1: error: cannot convert 'a' to 'int' in initialization 12 | }; | ^ with the error at the final closing brace. This patch uses location information for the initializers, converting the above to: pr88375.cc:10:11: error: cannot convert 'a' to 'int' in initialization 10 | { 3, a::two }, | ~~~^~~ | | | a highlighting which subexpression is problematic, and its type. Ideally we'd also issue a note showing the field decl being initialized, but that turned out to be more invasive. gcc/cp/ChangeLog: PR c++/88375 * typeck.c (convert_for_assignment): Capture location of rhs before stripping, and if available. Use the location when complaining about bad conversions, labelling it with the rhstype if the location was present. * typeck2.c (digest_init_r): Capture location of init before stripping. gcc/testsuite/ChangeLog: PR c++/88375 * g++.dg/init/pr88375-2.C: New test. * g++.dg/init/pr88375.C: New test. From-SVN: r267276
David Malcolm committed -
Expose oacc_fn_attrib_level to be used in backends. 2018-12-19 Tom de Vries <tdevries@suse.de> * omp-offload.c (oacc_fn_attrib_level): Remove static. * omp-offload.h (oacc_fn_attrib_level): Declare. From-SVN: r267275
Tom de Vries committed -
Expose oacc_default_dims to backends. 2018-12-19 Tom de Vries <tdevries@suse.de> * omp-offload.c (oacc_get_default_dim): New function. * omp-offload.h (oacc_get_default_dim): Declare. From-SVN: r267274
Tom de Vries committed -
The C frontend is able (where expression locations are available) to print problems with binary operators in 3-location form, labelling the types of the expressions: arg_0 op arg_1 ~~~~~ ^~ ~~~~~ | | | arg1 type arg0 type The C++ frontend currently just shows the combined location: arg_0 op arg_1 ~~~~~~^~~~~~~~ and fails to highlight where the subexpressions are, or their types. This patch introduces a op_location_t struct for handling the above operator-location vs combined-location split, and a new class binary_op_rich_location for displaying the above, so that the C++ frontend is able to use the more detailed 3-location form for type mismatches in binary operators, and for -Wtautological-compare (where types are not displayed). Both forms can be seen in this example: bad-binary-ops.C:69:20: error: no match for 'operator&&' (operand types are 's' and 't') 69 | return ns_4::foo && ns_4::inner::bar; | ~~~~~~~~~ ^~ ~~~~~~~~~~~~~~~~ | | | | s t bad-binary-ops.C:69:20: note: candidate: 'operator&&(bool, bool)' <built-in> 69 | return ns_4::foo && ns_4::inner::bar; | ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~ The patch also allows for some uses of macros in -Wtautological-compare, where both sides of the comparison have been spelled the same way, e.g.: Wtautological-compare-ranges.c:23:11: warning: self-comparison always evaluates to true [-Wtautological-compare] 23 | if (FOO == FOO); | ^~ gcc/c-family/ChangeLog: PR c++/87504 * c-common.h (warn_tautological_cmp): Convert 1st param from location_t to const op_location_t &. * c-warn.c (find_array_ref_with_const_idx_r): Call fold_for_warn when testing for INTEGER_CST. (warn_tautological_bitwise_comparison): Convert 1st param from location_t to const op_location_t &; use it to build a binary_op_rich_location, and use this. (spelled_the_same_p): New function. (warn_tautological_cmp): Convert 1st param from location_t to const op_location_t &. Warn for macro expansions if spelled_the_same_p. Use binary_op_rich_location. gcc/c/ChangeLog: PR c++/87504 * c-typeck.c (class maybe_range_label_for_tree_type_mismatch): Move from here to gcc-rich-location.h and gcc-rich-location.c. (build_binary_op): Use struct op_location_t and class binary_op_rich_location. gcc/cp/ChangeLog: PR c++/87504 * call.c (op_error): Convert 1st param from location_t to const op_location_t &. Use binary_op_rich_location for binary ops. (build_conditional_expr_1): Convert 1st param from location_t to const op_location_t &. (build_conditional_expr): Likewise. (build_new_op_1): Likewise. (build_new_op): Likewise. * cp-tree.h (build_conditional_expr): Likewise. (build_new_op): Likewise. (build_x_binary_op): Likewise. (cp_build_binary_op): Likewise. * parser.c (cp_parser_primary_expression): Build a location for id-expression nodes. (cp_parser_binary_expression): Use an op_location_t when calling build_x_binary_op. (cp_parser_operator): Build a location for user-defined literals. * typeck.c (build_x_binary_op): Convert 1st param from location_t to const op_location_t &. (cp_build_binary_op): Likewise. Use binary_op_rich_location. gcc/ChangeLog: PR c++/87504 * gcc-rich-location.c (maybe_range_label_for_tree_type_mismatch::get_text): Move here from c/c-typeck.c. (binary_op_rich_location::binary_op_rich_location): New ctor. (binary_op_rich_location::use_operator_loc_p): New function. * gcc-rich-location.h (class maybe_range_label_for_tree_type_mismatch)): Move here from c/c-typeck.c. (struct op_location_t): New forward decl. (class binary_op_rich_location): New class. * tree.h (struct op_location_t): New struct. gcc/testsuite/ChangeLog: * c-c++-common/Wtautological-compare-ranges.c: New test. * g++.dg/cpp0x/pr51420.C: Add -fdiagnostics-show-caret and update expected output. * g++.dg/diagnostic/bad-binary-ops.C: Update expected output from 1-location form to 3-location form, with labelling of ranges with types. Add examples of id-expression nodes with namespaces. * g++.dg/diagnostic/param-type-mismatch-2.C: Likewise. From-SVN: r267273
David Malcolm committed -
This is v6 of the patch, as posted to: https://gcc.gnu.org/ml/gcc-patches/2018-12/msg01331.html The C++ frontend gained various location wrapper nodes in r256448 (GCC 8). That patch: https://gcc.gnu.org/ml/gcc-patches/2018-01/msg00799.html added wrapper nodes around all nodes with !CAN_HAVE_LOCATION_P for: * arguments at callsites, and for * typeid, alignof, sizeof, and offsetof. This is a followup to that patch, adding many more location wrappers to the C++ frontend. It adds location wrappers for nodes with !CAN_HAVE_LOCATION_P to: * all literal nodes (in cp_parser_primary_expression) * all id-expression nodes (in finish_id_expression), except within a decltype. * all mem-initializer nodes within a mem-initializer-list (in cp_parser_mem_initializer) However, the patch also adds some suppressions: regions in the parser for which wrapper nodes will not be created: * within a template-parameter-list or template-argument-list (in cp_parser_template_parameter_list and cp_parser_template_argument_list respectively), to avoid encoding the spelling location of the nodes in types. For example, "array<10>" and "array<10>" are the same type, despite the fact that the two different "10" tokens are spelled in different locations in the source. * within a gnu-style attribute (none of are handlers are set up to cope with location wrappers yet) * within various OpenMP clauses The patch enables various improvements to locations for bad initializations, for -Wchar-subscripts, and enables various other improvements in the followup patch. For example, given the followup buggy mem-initializer: class X { X() : bad(42), good(42) { } void* bad; int good; }; previously, our diagnostic was on the final close parenthesis of the mem-initializer-list, leaving it unclear where the problem is: t.cc: In constructor 'X::X()': t.cc:3:16: error: invalid conversion from 'int' to 'void*' [-fpermissive] 3 | good(42) | ^ | | | int whereas with the patch we highlight which expression is bogus: t.cc: In constructor 'X::X()': t.cc:2:13: error: invalid conversion from 'int' to 'void*' [-fpermissive] 2 | X() : bad(42), | ^~ | | | int Similarly, the diagnostic for this bogus initialization: i.cc:1:44: error: initializer-string for array of chars is too long [-fpermissive] 1 | char test[3][4] = { "ok", "too long", "ok" }; | ^ is improved by the patch so that it indicates which string is too long: i.cc:1:27: error: initializer-string for array of chars is too long [-fpermissive] 1 | char test[3][4] = { "ok", "too long", "ok" }; | ^~~~~~~~~~ gcc/c-family/ChangeLog: PR c++/43064 PR c++/43486 * c-common.c (unsafe_conversion_p): Fold any location wrapper. (verify_tree): Handle location wrappers. (c_common_truthvalue_conversion): Strip any location wrapper. Handle CONST_DECL. (fold_offsetof): Strip any location wrapper. (complete_array_type): Likewise for initial_value. (convert_vector_to_array_for_subscript): Call fold_for_warn on the index before checking for INTEGER_CST. * c-pretty-print.c (c_pretty_printer::primary_expression): Don't print parentheses around location wrappers. * c-warn.c (warn_logical_operator): Call fold_for_warn on op_right before checking for INTEGER_CST. (warn_tautological_bitwise_comparison): Call tree_strip_any_location_wrapper on lhs, rhs, and bitop's operand before checking for INTEGER_CST. (readonly_error): Strip any location wrapper. (warn_array_subscript_with_type_char): Strip location wrappers before checking for INTEGER_CST. Use the location of the index if available. gcc/ChangeLog: PR c++/43064 PR c++/43486 * convert.c: Include "selftest.h". (preserve_any_location_wrapper): New function. (convert_to_pointer_maybe_fold): Update to handle location wrappers. (convert_to_real_maybe_fold): Likewise. (convert_to_integer_1): Strip expr when using TREE_OVERFLOW. Handle location wrappers when checking for INTEGER_CST. (convert_to_integer_maybe_fold): Update to handle location wrappers. (convert_to_complex_maybe_fold): Likewise. (selftest::test_convert_to_integer_maybe_fold): New functions. (selftest::convert_c_tests): New function. * convert.h (preserve_any_location_wrapper): New decl. * fold-const.c (size_binop_loc): Strip location wrappers when using TREE_OVERFLOW. (operand_equal_p): Strip any location wrappers. (integer_valued_real_p): Strip any location wrapper. * selftest-run-tests.c (selftest::run_tests): Call selftest::convert_c_tests. * selftest.h (selftest::convert_c_tests): New decl. * tree.c (build_complex): Assert that REAL and IMAG are constants. (integer_zerop): Look through location wrappers. (integer_onep): Likewise. (integer_each_onep): Likewise. (integer_all_onesp): Likewise. (integer_minus_onep): Likewise. (integer_pow2p): Likewise. (integer_nonzerop): Likewise. (integer_truep): Likewise. (fixed_zerop): Likewise. (real_zerop): Likewise. (real_onep): Likewise. (real_minus_onep): Likewise. (tree_int_cst_equal): Likewise. (simple_cst_equal): Treat location wrappers with non-equal source locations as being unequal. (uniform_integer_cst_p): Look through location wrappers. (maybe_wrap_with_location): Don't create wrappers if any auto_suppress_location_wrappers are active. (suppress_location_wrappers): New variable. (selftest::test_predicates): New test. (selftest::tree_c_tests): Call it. * tree.h (CONSTANT_CLASS_OR_WRAPPER_P): New macro. (suppress_location_wrappers): New decl. (class auto_suppress_location_wrappers): New class. gcc/cp/ChangeLog: PR c++/43064 PR c++/43486 * call.c (build_conditional_expr_1): Strip location wrappers when checking for CONST_DECL. (conversion_null_warnings): Use location of "expr" if available. * class.c (fixed_type_or_null): Handle location wrappers. * constexpr.c (potential_constant_expression_1): Likewise. * cvt.c (ignore_overflows): Strip location wrappers when checking for INTEGER_CST, and re-wrap the result if present. (ocp_convert): Call fold_for_warn before checking for INTEGER_CST. * decl.c (reshape_init_r): Strip any location wrapper. (undeduced_auto_decl): Likewise. * expr.c (mark_discarded_use): Likewise for expr. * init.c (build_aggr_init): Likewise before checking init for DECL_P. (warn_placement_new_too_small): Call fold_for_warn on adj before checking for CONSTANT_CLASS_P, and on nelts. Strip any location wrapper from op0 and on oper before checking for VAR_P. * parser.c (cp_parser_primary_expression): Call maybe_add_location_wrapper on numeric and string literals. (cp_parser_postfix_expression): Strip any location wrapper when checking for DECL_IS_BUILTIN_CONSTANT_P. (cp_parser_unary_expression): Ensure that folding of NEGATE_EXPR around a constant happens in the presence of location wrappers and returns a wrapped result. (cp_parser_has_attribute_expression): Strip any location wrapper from "oper". (cp_parser_binary_expression): Strip any location wrapper when checking for DECL_P on the lhs. (cp_parser_decltype): Strip any location wrapper from result of cp_parser_decltype_expr. (cp_parser_mem_initializer): Add location wrappers to the parenthesized expression list. (cp_parser_template_parameter_list): Don't create wrapper nodes within a template-parameter-list. (cp_parser_template_argument_list): Don't create wrapper nodes within a template-argument-list. (cp_parser_parameter_declaration): Strip location wrappers from default arguments. (cp_parser_gnu_attribute_list): Don't create wrapper nodes. (cp_parser_std_attribute_spec_seq): Likewise. (cp_parser_omp_all_clauses): Don't create wrapper nodes within OpenMP clauses. (cp_parser_omp_for_loop): Likewise. (cp_parser_omp_declare_reduction_exprs): Likewise. * pt.c (convert_nontype_argument_function): Strip location wrappers from fn_no_ptr before checking for FUNCTION_DECL. (tsubst_default_argument): Move note about which callsite led to instantiation to after the check_default_argument call. (do_auto_deduction): Likewise from init before checking for DECL_P. * semantics.c (force_paren_expr): Likewise from expr before checking for DECL_P. (finish_parenthesized_expr): Likewise from expr before checking for STRING_CST. (perform_koenig_lookup): Likewise from fn. (finish_call_expr): Likewise. (finish_id_expression): Rename to... (finish_id_expression_1): ...this, calling maybe_add_location_wrapper on the result. (capture_decltype): Use lookup_name_real rather than value_member when looking up decl within the capture-list. * tree.c (cp_stabilize_reference): Strip any location wrapper. (builtin_valid_in_constant_expr_p): Likewise. (strip_typedefs_expr): Strip any location wrapper before checking for decls or constants. (is_overloaded_fn): Likewise. (maybe_get_fns): Likewise. (selftest::test_lvalue_kind): Verify lvalue_p. * typeck.c (cxx_sizeof_expr): Strip any location wrapper. (cxx_alignof_expr): Likewise. (is_bitfield_expr_with_lowered_type): Handle location wrappers. (cp_build_array_ref): Call maybe_constant_value on "idx". (cp_build_binary_op): Strip location wrapper from first_arg before checking for PARM_DECL. Likewise for op1 before checking for INTEGER_CST in two places. Likewise for orig_op0 and orig_op1 when checking for STRING_CST. (cp_build_addr_expr_1): Likewise for arg when checking for FUNCTION_DECL. (cp_build_modify_expr): Likewise for newrhs when checking for STRING_CST. (convert_for_assignment): Don't strip location wrappers when stripping NON_LVALUE_EXPR. (maybe_warn_about_returning_address_of_local): Strip location wrapper from whats_returned before checking for DECL_P. (can_do_nrvo_p): Strip location wrapper from retval. (treat_lvalue_as_rvalue_p): Likewise. (check_return_expr): Likewise. * typeck2.c (cxx_incomplete_type_diagnostic): Strip location wrapper from value before checking for VAR_P or PARM_DECL. (digest_init_r): Strip location wrapper from init. When copying "init", also copy the wrapped node. gcc/objc/ChangeLog: PR c++/43064 PR c++/43486 * objc-act.c (objc_maybe_build_component_ref): Strip any location wrapper before checking for UOBJC_SUPER_decl and self_decl. (objc_finish_message_expr): Strip any location wrapper. (gen_declaration): Strip location wrappers from "w". gcc/testsuite/ChangeLog: PR c++/43064 PR c++/43486 * c-c++-common/pr51712.c (valid2): Mark xfail as passing on C++. * g++.dg/cpp0x/constexpr-47969.C: Update column of expected error. * g++.dg/cpp0x/constexpr-ex2.C: Likewise. * g++.dg/cpp0x/scoped_enum2.C: Likewise. * g++.dg/cpp1z/decomp48.C: Update expected location of warning for named local variables to use that of the local variable. * g++.dg/ext/vla1.C: Update column. * g++.dg/init/array43.C: Update expected column to be that of the initializer. * g++.dg/init/initializer-string-too-long.C: New test. * g++.dg/init/new44.C: Add "-ftrack-macro-expansion=0". * g++.dg/init/pr43064-1.C: New test. * g++.dg/init/pr43064-2.C: New test. * g++.dg/init/pr43064-3.C: New test. * g++.dg/other/fold1.C: Update column of expected error. * g++.dg/parse/crash36.C: Likewise. * g++.dg/plugin/diagnostic-test-expressions-1.C: Add negative integer and float expressions. * g++.dg/template/defarg6.C: Move expected error to the default argument; add expected message about where instantiated. * g++.dg/wrappers/Wparentheses.C: New test. * g++.old-deja/g++.bugs/900402_02.C: Update column of expected error. From-SVN: r267272
David Malcolm committed -
This patch is the analog to r266868-r266870, but for SSSE3. The SSSE3 tests had been inadvertently made to PASS without actually running the test code. Actually running the code turned up some previously undetected issues. This patch fixes some issues in the implementations, fixes up the tests to use a union for the test data, which avoids strict aliasing issues, and enables the tests to actually run (by removing a dependency on __BUILTIN_CPU_SUPPORTS). Also, there's a fairly insignificant change in the testcases that walk through the data as pairs of vectors from: [0] and [1] [2] and [3] ... [n-4] and [n-3] [n-2] and [n-1] to: [0] and [1] [1] and [2] ... [n-3] and [n-2] [n-2] and [n-1] Since the testcases compute the correct answers based on the input, no other changes were necessary to effect the change. 2018-12-19 Paul A. Clarke <pc@us.ibm.com> [gcc] * config/rs6000/tmmintrin.h (_mm_hadds_epi16): Vector lanes swapped. (_mm_hsub_epi32): Likewise. (_mm_shuffle_epi8): Fix reversed interpretation of parameters. (_mm_shuffle_pi8): Likewise. (_mm_addubs_pi16): Likewise. [gcc/testsuite] * gcc.target/powerpc/ssse3-check.h: Enable tests to run. * gcc.target/powerpc/ssse3-pabsb.c: Code fixes for strict aliasing issues. * gcc.target/powerpc/ssse3-pabsd.c: Likewise. * gcc.target/powerpc/ssse3-palignr.c: Likewise. * gcc.target/powerpc/ssse3-phaddd.c: Likewise. * gcc.target/powerpc/ssse3-phaddsw.c: Likewise. * gcc.target/powerpc/ssse3-phaddw.c: Likewise. * gcc.target/powerpc/ssse3-phsubd.c: Likewise. * gcc.target/powerpc/ssse3-phsubw.c: Likewise. * gcc.target/powerpc/ssse3-pmulhrsw.c: Likewise. * gcc.target/powerpc/ssse3-pshufb.c: Likewise. * gcc.target/powerpc/ssse3-psignb.c: Likewise. * gcc.target/powerpc/ssse3-psignd.c: Likewise. * gcc.target/powerpc/ssse3-psignw.c: Likewise. * gcc.target/powerpc/ssse3-vals.h: Provide input data as a union. From-SVN: r267271
Paul A. Clarke committed -
FP instructions are only enabled for TARGET_32BIT and TARGET_HARD_FLOAT but GCC only gives an error when TARGET_HARD_FLOAT is true and -mfpu is not set. Among other things, it makes some of the cmse tests (eg. gcc.target/arm/cmse/baseline/softfp.c) fail when targeting -march=armv8-m.base -mcmse -mfpu=<something> -mfloat-abi=softfp. This commit adds an extra check for TARGET_32BIT to TARGET_HARD_FLOAT such that it is false on TARGET_THUMB1 targets even when a FPU is specified. 2018-12-19 thomas Preud'homme <thomas.preudhomme@linaro.org> gcc/ * config/arm/arm.h (TARGET_HARD_FLOAT): Restrict to TARGET_32BIT targets. * config/arm/arm.c (output_return_instruction): Only check TARGET_HARD_FLOAT to decide whether FP instructions are available. gcc/testsuite/ * gcc.target/arm/cmse/baseline/softfp.c: Force an FPU. From-SVN: r267270
Thomas Preud'homme committed -
Add pr85381*.c test-cases that are already passing without the fix for PR85381. Build and reg-tested on x86_64 with nvptx accelerator. 2018-12-19 Tom de Vries <tdevries@suse.de> * testsuite/libgomp.oacc-c-c++-common/pr85381-2.c: New test. * testsuite/libgomp.oacc-c-c++-common/pr85381-3.c: New test. * testsuite/libgomp.oacc-c-c++-common/pr85381-4.c: New test. From-SVN: r267268
Tom de Vries committed -
The goacc.exp test-cases nvptx-merged-loop.c and nvptx-sese-1.c are failing during linking due to missing libgomp.spec. Move them to the libgomp testsuite. Build and reg-tested on x86_64 with nvptx accelerator. 2018-12-19 Tom de Vries <tdevries@suse.de> * gcc.dg/goacc/nvptx-merged-loop.c: Move to libgomp/testsuite/libgomp.oacc-c-c++-common. * gcc.dg/goacc/nvptx-sese-1.c: Same. * testsuite/lib/libgomp.exp: Add load_lib of scanoffloadrtl.exp. * testsuite/libgomp.oacc-c-c++-common/nvptx-merged-loop.c: Move from gcc/testsuite/gcc.dg/goacc. * testsuite/libgomp.oacc-c-c++-common/nvptx-sese-1.c: Same. From-SVN: r267267
Tom de Vries committed -
Add scan-offload-rtl-dump, similar to scan-offload-tree-dump. Build and reg-tested on x86_64 with nvptx accelerator. 2018-12-19 Tom de Vries <tom@codesourcery.com> * lib/scanoffloadrtl.exp: New file. * gcc.dg-selftests/dg-final.exp (dg_final_directive_check_num_args): Add offload-rtl. * doc/sourcebuild.texi (Commands for use in dg-final, Scan optimization dump files): Add offload-rtl. From-SVN: r267266
Tom de Vries committed -
This pattern optimises a scalar extract from a vector loaded from memory to be just a scalar load from memory. But to do a 64-bit integer load you need 64-bit integer registers, which needs TARGET_POWERPC64. PR target/88213 * config/rs6000/vsx.md (*vsx_extract_<P:mode>_<VSX_D:mode>_load): Require TARGET_POWERPC64. From-SVN: r267263
Segher Boessenkool committed -
re PR tree-optimization/88533 (Higher performance penalty of array-bounds checking for sparse-matrix vector multiply) 2018-12-19 Richard Biener <rguenther@suse.de> PR tree-optimization/88533 Revert 2018-04-30 Richard Biener <rguenther@suse.de> PR tree-optimization/28364 PR tree-optimization/85275 * tree-ssa-loop-ch.c (ch_base::copy_headers): Stop after copying first exit test. * gcc.dg/tree-ssa/ssa-dom-thread-7.c: Adjust. * tree-ssa-loop-ch.c: Include tree-phinodes.h and ssa-iterators.h. (should_duplicate_loop_header_p): Track whether stmt compute loop invariants or values based on IVs. Apart from the original loop header only duplicate blocks with exit tests that are based on IVs or invariants. * gcc.dg/tree-ssa/copy-headers-6.c: New testcase. * gcc.dg/tree-ssa/copy-headers-7.c: Likewise. * gcc.dg/tree-ssa/ivopt_mult_1.c: Un-XFAIL. * gcc.dg/tree-ssa/ivopt_mult_2.c: Likewise. From-SVN: r267262
Richard Biener committed -
Use MAX, MIN, and ROUND_UP macros to simplify code. Build and reg-tested on x86_64 with nvptx accelerator. 2018-12-19 Tom de Vries <tdevries@suse.de> * config/nvptx/nvptx.c (nvptx_gen_shared_bcast, shared_prop_gen) (nvptx_goacc_expand_accel_var): Use MAX and ROUND_UP. (nvptx_assemble_value, nvptx_output_skip): Use MIN. (nvptx_shared_propagate, nvptx_single, nvptx_expand_shared_addr): Use MAX. From-SVN: r267261
Tom de Vries committed -
Rename state propagation functions to avoid worker/vector terminology. Build and reg-tested on x86_64 with nvptx accelerator. 2018-12-19 Tom de Vries <tdevries@suse.de> * config/nvptx/nvptx.c (nvptx_gen_wcast): Rename as nvptx_gen_warp_bcast. (nvptx_gen_wcast): Rename to nvptx_gen_shared_bcast, add bool vector argument, and update call to nvptx_gen_shared_bcast. (propagator_fn): Add bool argument. (nvptx_propagate): New bool argument, pass bool argument to fn. (vprop_gen): Rename to warp_prop_gen, update call to nvptx_gen_warp_bcast. (nvptx_vpropagate): Rename to nvptx_warp_propagate, update call to nvptx_propagate. (wprop_gen): Rename to shared_prop_gen, update call to nvptx_gen_shared_bcast. (nvptx_wpropagate): Rename to nvptx_shared_propagate, update call to nvptx_propagate. (nvptx_wsync): Rename to nvptx_cta_sync. (nvptx_single): Update calls to nvptx_gen_warp_bcast, nvptx_gen_shared_bcast and nvptx_cta_sync. (nvptx_process_pars): Likewise. (write_worker_buffer): Rename as write_shared_buffer. (nvptx_file_end): Update calls to write_shared_buffer. (nvptx_expand_worker_addr): Rename as nvptx_expand_shared_addr. (nvptx_expand_builtin): Update call to nvptx_expand_shared_addr. (nvptx_get_worker_red_addr): Rename as nvptx_get_shared_red_addr. (nvptx_goacc_reduction_setup): Update call to nvptx_get_shared_red_addr. (nvptx_goacc_reduction_fini): Likewise. (nvptx_goacc_reduction_teardown): Likewise. From-SVN: r267260
Tom de Vries committed -
Rename worker_bcast variables to oacc_bcast, avoiding worker terminology. Build and reg-tested on x86_64 with nvptx accelerator. 2018-12-19 Tom de Vries <tdevries@suse.de> * config/nvptx/nvptx.c (worker_bcast_size): Rename as oacc_bcast_size. (worker_bcast_align): Rename as oacc_bcast_align. (worker_bcast_sym): Rename as oacc_bcast_sym. (nvptx_option_override): Update usage of oacc_bcast_*. (struct wcast_data_t): Rename as broadcast_data_t. (nvptx_gen_wcast): Update type of data argument and usage of oacc_bcast_align. (wprop_gen): Update type of data_ and usage of oacc_bcast_align. (nvptx_wpropagate): Update type of data and usage of oacc_bcast_{sym,size}. (nvptx_single): Update type of data and usage of oacc_bcast_size. (nvptx_file_end): Update usage of oacc_bcast_{sym,align,size}. From-SVN: r267259
Tom de Vries committed -
Allow the logical barrier operand of nvptx_barsync to be a register, and add a thread count operand. Build and reg-tested on x86_64 with nvptx accelerator. 2018-12-19 Tom de Vries <tdevries@suse.de> * config/nvptx/nvptx.md (nvptx_barsync): Add and handle operand. * config/nvptx/nvptx.c (nvptx_wsync): Update call to gen_nvptx_barsync. From-SVN: r267258
Tom de Vries committed -
For openacc loops, we generate this style of code: ... @%r41 bra.uni $L5; @%r40 bra $L6; mov.u64 %r32, %ar0; cvta.shared.u64 %r39, __worker_bcast; st.u64 [%r39], %r32; $L6: $L5: bar.sync 0; @%r40 bra $L4; cvta.shared.u64 %r38, __worker_bcast; ld.u64 %r32, [%r38]; ... $L4: bar.sync 1; ... The first barrier is there to ensure that no thread reads the broadcast buffer before it's written. The second barrier is there to ensure that no thread overwrites the broadcast buffer before all threads have read it (as well as implementing the obligatory synchronization after a worker loop). We've been using the logical barrier resources '0' and '1' for these two barriers, but there's no reason why we can't use the same one. Use logical barrier resource '0' for both barriers, making the openacc implementation claim less resources. Build and reg-tested on x86_64 with nvptx accelerator. 2018-12-19 Tom de Vries <tdevries@suse.de> * config/nvptx/nvptx.c (nvptx_single): Always pass false to nvptx_wsync. (nvptx_process_pars): Likewise. From-SVN: r267257
Tom de Vries committed -
Implement TARGET_SET_CURRENT_FUNCTION for nvptx. This gives us a place to add initialization or reset actions that need to be executed on a per-function basis. Build and reg-tested on x86_64 with nvptx accelerator. 2018-12-19 Tom de Vries <tdevries@suse.de> * config/nvptx/nvptx.c (nvptx_previous_fndecl): Declare. (nvptx_set_current_function): New function. (TARGET_SET_CURRENT_FUNCTION): Define. From-SVN: r267256
Tom de Vries committed -
For HiSilicon's tsv110 cpu core, it supports some v8_4A features, but some mandatory features are not implemented. 2018-12-19 Shaokun Zhang <zhangshaokun@hisilicon.com> * config/aarch64/aarch64-cores.def (tsv110): Fix architecture. This part is really Armv8.2 with some permitted Armv8.4 extensions. From-SVN: r267255
Shaokun Zhang committed -
re PR target/88541 (VPCLMULQDQ 256-bit inline function unavailable with optimization but without enabled AVX512VL support) PR target/88541 * config/i386/vpclmulqdqintrin.h (_mm256_clmulepi64_epi128): Enable for -mavx -mvpclmulqdq rather than just for -mavx512vl -mvpclmulqdq. * gcc.target/i386/avx-vpclmulqdq-1.c: New test. From-SVN: r267254
Jakub Jelinek committed -
PR c++/87934 * constexpr.c (cxx_eval_constant_expression) <case CONSTRUCTOR>: Do re-process TREE_CONSTANT CONSTRUCTORs if they aren't reduced constant expressions. * g++.dg/cpp0x/constexpr-87934.C: New test. From-SVN: r267253
Jakub Jelinek committed -
PR 86153 was originally filed when changes to the C++11's implementation of vector resize(size_type) limited inlining that were required for testsuite/g++.dg/pr83239.C to verify that we did not issue an undesired warning. That was worked by increasing the limit for inlining, but that in turn caused the C++98 implementation of vector resize, that is significantly different, to also be fully inlined, and that happened to issue the very warnings the test was meant to verify we did NOT issue. The reason we issued the warnings was that we failed to optimize out some parts of _M_fill_insert, used by the C++98 version of vector resize, although the call of _M_fill_insert was guarded by a test that could never pass: test testcase only calls resize when the vector size is >= 3, to decrement the size by two. The limitation we hit in VRP was that the compared values could pass as an overflow test, if the vector size was 0 or 1 (we knew it wasn't), but even with dynamic ranges we failed to decide that the test result could be determined at compile time, even though after the test we introduced ASSERT_EXPRs that required a condition known to be false from earlier ones. I pondered turning ASSERT_EXPRs that show impossible conditions into traps, to enable subsequent instructions to be optimized, but I ended up finding an earlier spot in which an overflow test that would have introduced the impossible ASSERT_EXPR can have its result deduced from earlier known ranges and resolved to the other path. Although such overflow tests could be uniformly simplified to compares against a constant, the original code would only perform such simplifications when the test could be resolved to an equality test against zero. I've thus avoided introducing compares against other constants, and instead added code that will only simplify overflow tests that weren't simplified before when the condition can be evaluated at compile time. for gcc/ChangeLog PR testsuite/86153 PR middle-end/83239 * vr-values.c (vr_values::vrp_evaluate_conditional_warnv_with_ops): Extend simplification of overflow tests to cover cases in which we can determine the result of the comparison. for gcc/testsuite/ChangeLog PR testsuite/86153 PR middle-end/83239 * gcc.dg/vrp-overflow-1.c: New. From-SVN: r267252
Alexandre Oliva committed -
When binding an object to a template parameter of reference type, we take the address of the object and dereference that address. The type of the address may still carry (template) typedefs, but verify_unstripped_args_1 rejects such typedefs other than in the top level of template arguments. Canonicalizing the type we want to convert to right after any substitutions or deductions avoids that issue. for gcc/cp/ChangeLog PR c++/87012 * pt.c (convert_template_argument): Canonicalize type after tsubst/deduce. for gcc/testsuite/ChangeLog PR c++/87012 * g++.dg/cpp0x/pr87012.C: New. From-SVN: r267251
Alexandre Oliva committed -
This patch started out from the testcase in PR88146, that attempted to synthesize an inherited ctor without any args before a varargs ellipsis and crashed while at that, because of the unguarded dereferencing of the parm type list, that usually contains a terminator. The terminator is not there for varargs functions, however, and without any other args, we ended up dereferencing a NULL pointer. Oops. Guarding accesses to parm would be easy, but not necessary. In do_build_copy_constructor, non-inherited ctors are copy-ctors, that always have at least one parm, so parm needs not be guarded when we know the access will only take place when we're dealing with an inherited ctor. The only other problematic use was in the cvquals initializer, a variable only used in a loop over fields, that we skipped individually in inherited ctors. I've guarded the cvquals initialization and the entire loop over fields so they only run for copy-ctors. Avoiding the crash from unguarded accesses was easy, but I thought we should still produce the sorry message we got in other testcases that passed arguments through the ellipsis in inherited ctors. I put a check in, and noticed the inherited ctors were synthesized with the location assigned to the class name, although they were initially assigned the location of the using declaration. I decided the latter was better, and arranged for the better location to be retained. Further investigation revealed the lack of a sorry message had to do with the call being in a non-evaluated context, in this case, a noexcept expression. The sorry would be correctly reported in other contexts, so I rolled back the check I'd added, but retained the source location improvement. I was still concerned about issuing sorry messages while instantiating template ctors even in non-evaluated contexts, e.g., if a template ctor had a base initializer that used an inherited ctor with enough arguments that they'd go through an ellipsis. I wanted to defer the instantiation of such template ctors, but that would have been wrong for constexpr template ctors, and already done for non-constexpr ones. So, I just consolidated multiple test variants into a single testcase that explores and explains various of the possibilities I thought of. for gcc/cp/ChangeLog PR c++/88146 * method.c (do_build_copy_constructor): Guard cvquals init and loop over fields to run for non-inherited ctors only. (synthesize_method): Retain location of inherited ctor. for gcc/testsuite/ChangeLog PR c++/88146 * g++.dg/cpp0x/inh-ctor32.C: New. From-SVN: r267250
Alexandre Oliva committed -
auto-profile.c (afdo_indirect_call): Skip generating histogram value if we can't find cgraph_node for then... * auto-profile.c (afdo_indirect_call): Skip generating histogram value if we can't find cgraph_node for then indirected callee. Save profile_id of the cgraph_node in histogram value's first counter. * value-prof.c (gimple_value_profile_transformations): Don't skip for flag_auto_profile. From-SVN: r267249
Bin Cheng committed -
From-SVN: r267248
GCC Administrator committed
-
- 18 Dec, 2018 11 commits
-
-
re PR rtl-optimization/87759 (ICE in lra_assign, at lra-assigns.c:1624, or ICE: Maximum number of LRA assignment passes is achieved (30), or compile-time hog) PR rtl-optimization/87759 * gcc.target/i386/pr87759.c: Require int128 effective target. From-SVN: r267245
Jakub Jelinek committed -
re PR rtl-optimization/87759 (ICE in lra_assign, at lra-assigns.c:1624, or ICE: Maximum number of LRA assignment passes is achieved (30), or compile-time hog) 2018-12-18 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/87759 * lra-assigns.c (lra_split_hard_reg_for): Recalculate non_reload_pseudos. 2018-12-18 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/87759 * gcc.target/i386/pr87759.c: New. From-SVN: r267244
Vladimir Makarov committed -
re PR tree-optimization/88464 (AVX-512 vectorization of masked scatter failing with "not suitable for scatter store") PR target/88464 * config/i386/i386-builtin-types.def (VOID_FTYPE_PDOUBLE_QI_V8SI_V4DF_INT, VOID_FTYPE_PFLOAT_QI_V4DI_V8SF_INT, VOID_FTYPE_PLONGLONG_QI_V8SI_V4DI_INT, VOID_FTYPE_PINT_QI_V4DI_V8SI_INT, VOID_FTYPE_PDOUBLE_QI_V4SI_V2DF_INT, VOID_FTYPE_PFLOAT_QI_V2DI_V4SF_INT, VOID_FTYPE_PLONGLONG_QI_V4SI_V2DI_INT, VOID_FTYPE_PINT_QI_V2DI_V4SI_INT): New builtin types. * config/i386/i386.c (enum ix86_builtins): Add IX86_BUILTIN_SCATTERALTSIV4DF, IX86_BUILTIN_SCATTERALTDIV8SF, IX86_BUILTIN_SCATTERALTSIV4DI, IX86_BUILTIN_SCATTERALTDIV8SI, IX86_BUILTIN_SCATTERALTSIV2DF, IX86_BUILTIN_SCATTERALTDIV4SF, IX86_BUILTIN_SCATTERALTSIV2DI and IX86_BUILTIN_SCATTERALTDIV4SI. (ix86_init_mmx_sse_builtins): Fix up names of IX86_BUILTIN_GATHERALT*, IX86_BUILTIN_GATHER3ALT* and IX86_BUILTIN_SCATTERALT* builtins to match the IX86_BUILTIN codes. Build IX86_BUILTIN_SCATTERALTSIV4DF, IX86_BUILTIN_SCATTERALTDIV8SF, IX86_BUILTIN_SCATTERALTSIV4DI, IX86_BUILTIN_SCATTERALTDIV8SI, IX86_BUILTIN_SCATTERALTSIV2DF, IX86_BUILTIN_SCATTERALTDIV4SF, IX86_BUILTIN_SCATTERALTSIV2DI and IX86_BUILTIN_SCATTERALTDIV4SI decls. (ix86_vectorize_builtin_scatter): Expand those new builtins. * gcc.target/i386/avx512f-pr88464-5.c: New test. * gcc.target/i386/avx512f-pr88464-6.c: New test. * gcc.target/i386/avx512f-pr88464-7.c: New test. * gcc.target/i386/avx512f-pr88464-8.c: New test. * gcc.target/i386/avx512vl-pr88464-5.c: New test. * gcc.target/i386/avx512vl-pr88464-6.c: New test. * gcc.target/i386/avx512vl-pr88464-7.c: New test. * gcc.target/i386/avx512vl-pr88464-8.c: New test. * gcc.target/i386/avx512vl-pr88464-9.c: New test. * gcc.target/i386/avx512vl-pr88464-10.c: New test. * gcc.target/i386/avx512vl-pr88464-11.c: New test. * gcc.target/i386/avx512vl-pr88464-12.c: New test. * gcc.target/i386/avx512vl-pr88464-13.c: New test. * gcc.target/i386/avx512vl-pr88464-14.c: New test. * gcc.target/i386/avx512vl-pr88464-15.c: New test. * gcc.target/i386/avx512vl-pr88464-16.c: New test. From-SVN: r267239
Jakub Jelinek committed -
* include/bits/fs_dir.h (operator<<): Overload for directory_entry, as per LWG 3171. * testsuite/27_io/filesystem/directory_entry/lwg3171.cc: New test. From-SVN: r267238
Jonathan Wakely committed -
* src/filesystem/std-dir.cc (filesystem::_Dir::advance): Move new path instead of copying. From-SVN: r267237
Jonathan Wakely committed -
Now that path::operator/=(basic_string_view<value_type>) works directly from the string argument, instead of constructing a temporary path from the string, it's potentially more efficient to do 'path(x) /= s' instead of 'x / s'. This changes the only relevant place in the library. * src/filesystem/std-dir.cc (filesystem::_Dir::advance): Append string to lvalue to avoid creating temporary path. From-SVN: r267236
Jonathan Wakely committed -
The resolution for LWG 2936 defines the comparison more precisely, which this patch implements. The patch also defines comparisons with strings to work without constructing a temporary path object (so avoids any memory allocations). * include/bits/fs_path.h (path::compare(const string_type&)) (path::compare(const value_type*)): Add noexcept and construct a string view to compare to instead of a path. (path::compare(basic_string_view<value_type>)): Add noexcept. Remove inline definition. * src/filesystem/std-path.cc (path::_Parser): Track last type read from input. (path::_Parser::next()): Return a final empty component when the input ends in a non-root directory separator. (path::_M_append(basic_string_view<value_type>)): Remove special cases for trailing non-root directory separator. (path::_M_concat(basic_string_view<value_type>)): Likewise. (path::compare(const path&)): Implement LWG 2936. (path::compare(basic_string_view<value_type>)): Define in terms of components returned by parser, consistent with LWG 2936. * testsuite/27_io/filesystem/path/compare/lwg2936.cc: New. * testsuite/27_io/filesystem/path/compare/path.cc: Test more cases. * testsuite/27_io/filesystem/path/compare/strings.cc: Likewise. From-SVN: r267235
Jonathan Wakely committed -
* include/std/string_view [__cplusplus > 201703L] (basic_string_view::starts_with(basic_string_view)): Implement proposed resolution of LWG 3040 to avoid redundant length check. (basic_string_view::starts_with(_CharT)): Implement proposed resolution of LWG 3040 to check at most one character. (basic_string_view::ends_with(_CharT)): Likewise. From-SVN: r267234
Jonathan Wakely committed -
extend.texi (PowerPC Altivec/VSX Built-in Functions): Describe when a typedef name can be used as the type specifier for a vector type... 2018-12-18 Bill Schmidt <wschmidt@linux.ibm.com> * doc/extend.texi (PowerPC Altivec/VSX Built-in Functions): Describe when a typedef name can be used as the type specifier for a vector type, and when it cannot. From-SVN: r267232
Bill Schmidt committed -
In GCC 9 the aarch64 port learned how to do V16QImode SAD operations on signed and unsigned chars. But I had missed enabling the effective target for that. This patch enables that target for non-SVE aarch64. Two new tests now PASS on aarch64: gcc.dg/vect/slp-reduc-sad.c gcc.dg/vect/vect-reduc-sad.c * lib/target-supports.exp (check_effective_target_vect_usad_char): Add non-SVE aarch64 to supported list. From-SVN: r267230
Kyrylo Tkachov committed -
2018-12-18 Jozef Lawrynowicz <jozef.l@mittosystems.com> * config/msp430/msp430.h: Define TARGET_VTABLE_ENTRY_ALIGN. From-SVN: r267229
Jozef Lawrynowicz committed
-