Commit Graph

181287 Commits

Author SHA1 Message Date
Andrea Corallo 156edf21fa arm: Make use of RTL predicates
2020-11-13  Andrea Corallo  <andrea.corallo@arm.com>

	* config/arm/aarch-common.c (aarch_accumulator_forwarding): Use
	RTL predicates where possible.
	* config/arm/arm.c (legitimate_pic_operand_p)
	(legitimize_pic_address, arm_is_segment_info_known)
	(can_avoid_literal_pool_for_label_p)
	(thumb1_legitimate_address_p, arm_legitimize_address)
	(arm_tls_referenced_p, thumb_legitimate_constant_p)
	(REG_OR_SUBREG_REG, thumb1_rtx_costs, thumb1_size_rtx_costs)
	(arm_adjust_cost, arm_coproc_mem_operand_wb)
	(neon_vector_mem_operand, neon_struct_mem_operand)
	(symbol_mentioned_p, label_mentioned_p, )
	(load_multiple_sequence, store_multiple_sequence)
	(arm_select_cc_mode, arm_reload_in_hi, arm_reload_out_hi)
	(mem_ok_for_ldrd_strd, arm_emit_call_insn, output_move_neon)
	(arm_attr_length_move_neon, arm_assemble_integer)
	(arm_emit_coreregs_64bit_shift, arm_valid_symbolic_address_p)
	(extract_base_offset_in_addr, fusion_load_store): Likewise.
2020-11-13 15:45:48 +01:00
Andrew MacLeod 47923622c6 Cleanup range of address calculations.
Align EVRP and ranger for how ranges of ADDR_EXPR are calculated.

	gcc/
	* gimple-range.cc: (gimple_ranger::range_of_range_op): Check for
	ADDR_EXPR and call range_of_address.
	(gimple_ranger::range_of_address): Rename from
	range_of_non_trivial_assignment and match vrp_stmt_computes_nonzero.
	* gimple-range.h: (range_of_address): Renamed.
	* range-op.cc: (pointer_table): Add INTEGER_CST handler.
	gcc/testsuite/
	* gcc.dg/tree-ssa/pr78655.c: New.
2020-11-13 09:36:20 -05:00
Martin Jambor ac91af71c9 loops: Invoke lim after successful loop interchange
This patch makes the entry point to loop invariant motion public, so
that it can be called after loop interchange when that pass has
swapped loops.  This avoids the non-LTO -Ofast run-time regressions of
410.bwaves and 503.bwaves_r (which are 19% and 15% faster than current
master on an AMD zen2 machine) while not introducing a full LIM pass
into the pass pipeline.

The patch also adds a parameter which allows not to perform any store
motion so that it is not done after an interchange.

gcc/ChangeLog:

2020-11-12  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/94406
	* tree-ssa-loop-im.c (tree_ssa_lim): Renamed to
	loop_invariant_motion_in_fun, added a parameter to control store
	motion.
	(pass_lim::execute): Adjust call to tree_ssa_lim, now
	loop_invariant_motion_in_fun.
	* tree-ssa-loop-manip.h (loop_invariant_motion_in_fun): Declare.
	* gimple-loop-interchange.cc (pass_linterchange::execute): Call
	loop_invariant_motion_in_fun if any interchange has been done.
2020-11-13 15:35:18 +01:00
Richard Biener 4d6b8d4213 improve VN PHI hashing
This reduces the number of collisions for PHIs in the VN hashtable
by always hashing the number of predecessors and separately hashing
the block number when we never merge PHIs from different blocks.

This improves collisions seen for the PR69609 testcase dramatically.

2020-11-13  Richard Biener  <rguenther@suse.de>

	* tree-ssa-sccvn.c (vn_phi_compute_hash): Always hash the
	number of predecessors.  Hash the block number also for
	loop header PHIs.
	(expressions_equal_p): Short-cut SSA name compares, remove
	test for NULL operands.
	(vn_phi_eq): Cache number of predecessors, change inlined
	test from expressions_equal_p.
2020-11-13 15:19:49 +01:00
Iain Buclaw be6169045e libphobos: Update libtool version to 2:0:0
This is so that the library is not to conflict with gcc-10.

libphobos/ChangeLog:

	* configure: Regenerate.
	* configure.ac (libtool_VERSION): Update to 2:0.0.
2020-11-13 14:58:58 +01:00
Iain Buclaw d975d6dce9 d: Explicitly determine which built-in copysign function to call.
For some targets, mathfn_built_in returns NULL as copysign is not
implicitly available, causing an ICE.  Now copysign is explicitly
requested when expanding the intrinsic.

gcc/d/ChangeLog:

	* intrinsics.cc (expand_intrinsic_copysign): Explicitly determine
	which built-in copysign function to call.
2020-11-13 14:58:58 +01:00
Iain Buclaw 5d4b824faf d: Fix ICE in finish_thunk (PR97644)
Because this what the upstream reference compiler did, thunks for the D
front-end were associated with the class definition, so were forced
code-gen even if the target function was extern.  This has now been
changed so there are now only generated if there is a function
definition, fixing the ICE that occurred in PR 97644, which was caused
by calling expand_thunk() early.

gcc/d/ChangeLog:

	PR d/97644
	* dmd/MERGE: Merge upstream dmd 95044d8e4.
	* d-target.cc (TargetCPP::thunkMangle): New function.
	* decl.cc (finish_thunk): Don't force expand thunks for external
	functions.
	(make_thunk): Emit thunks only if the function has a definition.
	Generate correct mangling for thunks to C++ classes.

gcc/testsuite/ChangeLog:

	* gdc.dg/pr92216.d: Update scan-assember.
2020-11-13 14:58:58 +01:00
Martin Liska 5fa821bba7 clang: fix -Wmisleading-indentation warning.
gcc/c-family/c-attribs.c:4698:5: warning: misleading indentation; statement is not part of the previous 'if' [-Wmisleading-indentation]

gcc/c-family/ChangeLog:

	* c-attribs.c (build_attr_access_from_parms): Format properly.
2020-11-13 14:05:17 +01:00
Iain Sandoe 4cfa85396c doc : Fix build error from r11-4972.
Some tex tools don't allow the @r{} command to be split across
lines.  Fixed by making the change occupy a long line.

gcc/ChangeLog:

	* doc/extend.texi: Don't try to line-wrap an @r command.
2020-11-13 11:50:20 +00:00
Richard Biener dcfd302a79 tree-optimization/97812 - fix range query in VRP assert discovery
This makes sure to properly extend the input range before seeing
whether it fits the target.

2020-11-13  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/97812
	* tree-vrp.c (register_edge_assert_for_2): Extend the range
	according to its sign before seeing whether it fits.

	* gcc.dg/torture/pr97812.c: New testcase.
2020-11-13 12:24:54 +01:00
Andrea Corallo 3793ecc10f aarch64: Make use of RTL predicates
2020-11-10  Andrea Corallo  <andrea.corallo@arm.com>

	* config/aarch64/aarch64.c (tls_symbolic_operand_type)
	(aarch64_load_symref_appropriately, aarch64_mov128_immediate)
	(aarch64_expand_mov_immediate)
	(aarch64_maybe_expand_sve_subreg_move)
	(aarch64_tls_referenced_p, aarch64_cannot_force_const_mem)
	(aarch64_base_register_rtx_p, aarch64_classify_index)
	(aarch64_classify_address, aarch64_symbolic_address_p)
	(aarch64_reinterpret_float_as_int, aarch64_float_const_rtx_p)
	(aarch64_can_const_movi_rtx_p, aarch64_select_cc_mode)
	(aarch64_print_operand, aarch64_label_mentioned_p)
	(aarch64_secondary_reload, aarch64_preferred_reload_class)
	(aarch64_address_cost, aarch64_tls_symbol_p)
	(aarch64_classify_symbol, aarch64_legitimate_pic_operand_p)
	(aarch64_legitimate_constant_p)
	(aarch64_sve_float_arith_immediate_p)
	(aarch64_sve_float_mul_immediate_p, aarch64_mov_operand_p)
	(fusion_load_store): Use RTL operands where possible.
2020-11-13 12:03:43 +01:00
Jonathan Wakely 8c4e33d203 libstdc++: Add -pthread options to std::future polling test
For linux targets this test doesn't need -lpthread because it only uses
atomics, but for all other targets std::call_once still needs pthreads.
Add the necessary test directives to make that work.

The timings in this test might be too fragile or too target-specific, so
it might need to be adjusted in future, or restricted to only run on
specific targets. For now I've increased the allowed ratio between
wait_for calls before and after the future is made ready, because it was
failing with -O3 -march=native sometimes.

libstdc++-v3/ChangeLog:

	* testsuite/30_threads/future/members/poll.cc: Require gthreads
	and add -pthread for targets that require it. Relax required
	ratio of wait_for calls before/after the future is ready.
2020-11-13 11:01:24 +00:00
Sudakshina Das 54bbde550e aarch64: Add backend support for expanding __builtin_memset
This patch implements aarch64 backend expansion for __builtin_memset. Most of
the implementation is based on the expansion of __builtin_memcpy. We change the
values of SET_RATIO and MOVE_RATIO for cases where we do not have to strictly
align and where we can benefit from NEON instructions in the backend.

gcc/ChangeLog:

	* config/aarch64/aarch64-protos.h (aarch64_expand_setmem): New
	declaration.
	* config/aarch64/aarch64.c (aarch64_gen_store_pair): Add case for
	E_V16QImode.
	(aarch64_set_one_block_and_progress_pointer): New helper for
	aarch64_expand_setmem.
	(aarch64_expand_setmem): Define the expansion for memset.
	* config/aarch64/aarch64.h (CLEAR_RATIO): Tweak to favor
	aarch64_expand_setmem when allowed and profitable.
	(SET_RATIO): Likewise.
	* config/aarch64/aarch64.md: Define pattern for setmemdi.

gcc/testsuite/ChangeLog:

	* g++.dg/tree-ssa/pr90883.C: Remove xfail for aarch64.
	* gcc.dg/tree-prof/stringop-2.c: Add xfail for aarch64.
	* gcc.target/aarch64/memset-corner-cases.c: New test.
	* gcc.target/aarch64/memset-q-reg.c: New test.
2020-11-13 10:48:27 +00:00
Iain Sandoe 5e28fca09c C-Family, Objective-C : Implement Objective-C nullability Part 1[PR90707].
This part of the implementation covers property nullability attributes
and includes the changes to common code. Follow-on changes will be needed
to cover Objective-C method definitions, but those are expected to be
local to the Objective-C front end.

The basis of the implementation is to translate the Objective-C-specific
keywords into an attribute (objc_nullability) which has the required
states to carry the attribute markup.

We introduce the keywords, and these are parsed and validated in the same
manner as other property attributes.  The resulting value is attached to
the property as an objc_nullability attribute.

gcc/c-family/ChangeLog:

	PR objc/90707
	* c-common.c (c_common_reswords): null_unspecified, nullable,
	nonnull, null_resettable: New keywords.
	* c-common.h (enum rid): RID_NULL_UNSPECIFIED, RID_NULLABLE,
	RID_NONNULL, RID_NULL_RESETTABLE: New.
	(OBJC_IS_PATTR_KEYWORD): Include nullability keywords in the
	ranges accepted for property attributes.
	* c-attribs.c (handle_objc_nullability_attribute): New.
	* c-objc.h (enum objc_property_attribute_group): Add
	OBJC_PROPATTR_GROUP_NULLABLE.
	(enum objc_property_attribute_kind):Add
	OBJC_PROPERTY_ATTR_NULL_UNSPECIFIED, OBJC_PROPERTY_ATTR_NULLABLE,
	OBJC_PROPERTY_ATTR_NONNULL, OBJC_PROPERTY_ATTR_NULL_RESETTABLE.

gcc/objc/ChangeLog:

	PR objc/90707
	* objc-act.c (objc_prop_attr_kind_for_rid): Handle nullability.
	(objc_add_property_declaration): Handle nullability attributes.
	Check that these are applicable to the property type.
	* objc-act.h (enum objc_property_nullability): New.

gcc/testsuite/ChangeLog:

	PR objc/90707
	* obj-c++.dg/property/at-property-4.mm: Add basic nullability
	tests.
	* objc.dg/property/at-property-4.m: Likewise.
	* obj-c++.dg/attributes/nullability-00.mm: New test.
	* obj-c++.dg/property/nullability-00.mm: New test.
	* objc.dg/attributes/nullability-00.m: New test.
	* objc.dg/property/nullability-00.m: New test.

gcc/ChangeLog:

	PR objc/90707
	* doc/extend.texi: Document the objc_nullability attribute.
2020-11-13 10:40:54 +00:00
Iain Sandoe 64f191b152 Objective-C [3/3] : Implement Wobjc-root-class [PR77404].
Add Wno-objc-root-class where needed to the objective-c++
tests.

gcc/testsuite/ChangeLog:

	PR objc/77404
	* obj-c++.dg/attributes/class-attribute-1.mm:
	Add Wno-objc-root-class.
	* obj-c++.dg/attributes/class-attribute-2.mm: Likewise.
	* obj-c++.dg/attributes/class-attribute-3.mm: Likewise.
	* obj-c++.dg/attributes/method-deprecated-1.mm: Likewise.
	* obj-c++.dg/attributes/method-deprecated-2.mm: Likewise.
	* obj-c++.dg/attributes/method-deprecated-3.mm: Likewise.
	* obj-c++.dg/attributes/method-format-1.mm: Likewise.
	* obj-c++.dg/attributes/method-nonnull-1.mm: Likewise.
	* obj-c++.dg/attributes/method-noreturn-1.mm: Likewise.
	* obj-c++.dg/attributes/method-sentinel-1.mm: Likewise.
	* obj-c++.dg/attributes/nsobject-01.mm: Likewise.
	* obj-c++.dg/attributes/parameter-attribute-1.mm: Likewise.
	* obj-c++.dg/attributes/parameter-attribute-2.mm: Likewise.
	* obj-c++.dg/attributes/proto-attribute-1.mm: Likewise.
	* obj-c++.dg/attributes/proto-attribute-3.mm: Likewise.
	* obj-c++.dg/attributes/proto-attribute-4.mm: Likewise.
	* obj-c++.dg/attributes/unused-parameter-1.mm: Likewise.
	* obj-c++.dg/bad-receiver-type.mm: Likewise.
	* obj-c++.dg/bitfield-3.mm: Likewise.
	* obj-c++.dg/bitfield-5.mm: Likewise.
	* obj-c++.dg/class-extension-1.mm: Likewise.
	* obj-c++.dg/class-extension-2.mm: Likewise.
	* obj-c++.dg/class-extension-3.mm: Likewise.
	* obj-c++.dg/class-extension-4.mm: Likewise.
	* obj-c++.dg/class-protocol-1.mm: Likewise.
	* obj-c++.dg/comp-types-1.mm: Likewise.
	* obj-c++.dg/comp-types-10.mm: Likewise.
	* obj-c++.dg/comp-types-2.mm: Likewise.
	* obj-c++.dg/comp-types-3.mm: Likewise.
	* obj-c++.dg/comp-types-5.mm: Likewise.
	* obj-c++.dg/comp-types-6.mm: Likewise.
	* obj-c++.dg/comp-types-7.mm: Likewise.
	* obj-c++.dg/comp-types-8.mm: Likewise.
	* obj-c++.dg/demangle-2.mm: Likewise.
	* obj-c++.dg/demangle-3.mm: Likewise.
	* obj-c++.dg/duplicate-class-1.mm: Likewise.
	* obj-c++.dg/encode-1-next.mm: Likewise.
	* obj-c++.dg/encode-1.mm: Likewise.
	* obj-c++.dg/enhanced-proto-2.mm: Likewise.
	* obj-c++.dg/exceptions-1.mm: Likewise.
	* obj-c++.dg/exceptions-3.mm: Likewise.
	* obj-c++.dg/exceptions-4.mm: Likewise.
	* obj-c++.dg/exceptions-5.mm: Likewise.
	* obj-c++.dg/extern-c-1.mm: Likewise.
	* obj-c++.dg/fobjc-std-1.mm: Likewise.
	* obj-c++.dg/gnu-api-2-class-meta.mm: Likewise.
	* obj-c++.dg/gnu-api-2-class.mm: Likewise.
	* obj-c++.dg/gnu-api-2-ivar.mm: Likewise.
	* obj-c++.dg/gnu-api-2-method.mm: Likewise.
	* obj-c++.dg/gnu-api-2-objc.mm: Likewise.
	* obj-c++.dg/gnu-api-2-objc_msg_lookup.mm: Likewise.
	* obj-c++.dg/gnu-api-2-object.mm: Likewise.
	* obj-c++.dg/gnu-api-2-property.mm: Likewise.
	* obj-c++.dg/gnu-api-2-protocol.mm: Likewise.
	* obj-c++.dg/gnu-api-2-resolve-method.mm: Likewise.
	* obj-c++.dg/gnu-api-2-sel.mm: Likewise.
	* obj-c++.dg/invalid-method-2.mm: Likewise.
	* obj-c++.dg/ivar-invalid-type-1.mm: Likewise.
	* obj-c++.dg/ivar-problem-1.mm: Likewise.
	* obj-c++.dg/lto/lto.exp: Likewise.
	* obj-c++.dg/lto/trivial-1_0.mm: Likewise.
	* obj-c++.dg/method-1.mm: Likewise.
	* obj-c++.dg/method-12.mm: Likewise.
	* obj-c++.dg/method-18.mm: Likewise.
	* obj-c++.dg/method-19.mm: Likewise.
	* obj-c++.dg/method-20.mm: Likewise.
	* obj-c++.dg/method-3.mm: Likewise.
	* obj-c++.dg/method-4.mm: Likewise.
	* obj-c++.dg/method-5.mm: Likewise.
	* obj-c++.dg/method-8.mm: Likewise.
	* obj-c++.dg/method-9.mm: Likewise.
	* obj-c++.dg/method-namespace-1.mm: Likewise.
	* obj-c++.dg/plugin/diagnostic-test-expressions-1.mm:
	Likewise.
	* obj-c++.dg/pr23709.mm: Likewise.
	* obj-c++.dg/pragma-2.mm: Likewise.
	* obj-c++.dg/private-1.mm: Likewise.
	* obj-c++.dg/private-2.mm: Likewise.
	* obj-c++.dg/property/property.exp: Likewise.
	* obj-c++.dg/proto-lossage-1.mm: Likewise.
	* obj-c++.dg/proto-lossage-5.mm: Likewise.
	* obj-c++.dg/proto-qual-1.mm: Likewise.
	* obj-c++.dg/protocol-inheritance-1.mm: Likewise.
	* obj-c++.dg/protocol-inheritance-2.mm: Likewise.
	* obj-c++.dg/protocol-optional-1.mm: Likewise.
	* obj-c++.dg/selector-1.mm: Likewise.
	* obj-c++.dg/selector-2.mm: Likewise.
	* obj-c++.dg/selector-3.mm: Likewise.
	* obj-c++.dg/selector-4.mm: Likewise.
	* obj-c++.dg/strings/strings.exp: Likewise.
	* obj-c++.dg/stubify-1.mm: Likewise.
	* obj-c++.dg/stubify-2.mm: Likewise.
	* obj-c++.dg/super-dealloc-1.mm: Likewise.
	* obj-c++.dg/super-dealloc-2.mm: Likewise.
	* obj-c++.dg/sync-3.mm: Likewise.
	* obj-c++.dg/syntax-error-2.mm: Likewise.
	* obj-c++.dg/syntax-error-4.mm: Likewise.
	* obj-c++.dg/syntax-error-7.mm: Likewise.
	* obj-c++.dg/syntax-error-9.mm: Likewise.
	* obj-c++.dg/template-4.mm: Likewise.
	* obj-c++.dg/template-7.mm: Likewise.
	* obj-c++.dg/template-8.mm: Likewise.
	* obj-c++.dg/threedotthree-abi-1.mm: Likewise.
	* obj-c++.dg/torture/dg-torture.exp: Likewise.
	* obj-c++.dg/torture/strings/strings.exp: Likewise.
	* obj-c++.dg/try-catch-12.mm: Likewise.
	* obj-c++.dg/try-catch-13.mm: Likewise.
2020-11-13 10:40:54 +00:00
Iain Sandoe d35fbf7f76 Objective-C [2/3] : Implement Wobjc-root-class [PR77404].
Add "Wno-objc-root-class" to tests in the Objective-C suite where
needed.

gcc/testsuite/ChangeLog:

	PR objc/77404
	* objc.dg/anon-1.m: Add Wno-objc-root-class.
	* objc.dg/attributes/class-attribute-1.m: Likewise.
	* objc.dg/attributes/class-attribute-2.m: Likewise.
	* objc.dg/attributes/class-attribute-3.m: Likewise.
	* objc.dg/attributes/method-deprecated-1.m: Likewise.
	* objc.dg/attributes/method-deprecated-2.m: Likewise.
	* objc.dg/attributes/method-deprecated-3.m: Likewise.
	* objc.dg/attributes/method-format-1.m: Likewise.
	* objc.dg/attributes/method-nonnull-1.m: Likewise.
	* objc.dg/attributes/method-noreturn-1.m: Likewise.
	* objc.dg/attributes/method-sentinel-1.m: Likewise.
	* objc.dg/attributes/nsobject-01.m: Likewise.
	* objc.dg/attributes/objc-exception-1.m: Likewise.
	* objc.dg/attributes/parameter-attribute-1.m: Likewise.
	* objc.dg/attributes/parameter-attribute-2.m: Likewise.
	* objc.dg/attributes/proto-attribute-1.m: Likewise.
	* objc.dg/attributes/proto-attribute-2.m: Likewise.
	* objc.dg/attributes/proto-attribute-3.m: Likewise.
	* objc.dg/attributes/proto-attribute-4.m: Likewise.
	* objc.dg/bitfield-2.m: Likewise.
	* objc.dg/break-in-ifstmt.m: Likewise.
	* objc.dg/class-1.m: Likewise.
	* objc.dg/class-extension-1.m: Likewise.
	* objc.dg/class-extension-2.m: Likewise.
	* objc.dg/class-extension-3.m: Likewise.
	* objc.dg/class-extension-4.m: Likewise.
	* objc.dg/class-protocol-1.m: Likewise.
	* objc.dg/comp-types-7.m: Likewise.
	* objc.dg/demangle-1.m: Likewise.
	* objc.dg/duplicate-class-1.m: Likewise.
	* objc.dg/encode-6-next.m: Likewise.
	* objc.dg/encode-6.m: Likewise.
	* objc.dg/enhanced-proto-2.m: Likewise.
	* objc.dg/exceptions-1.m: Likewise.
	* objc.dg/exceptions-3.m: Likewise.
	* objc.dg/exceptions-4.m: Likewise.
	* objc.dg/exceptions-5.m: Likewise.
	* objc.dg/fobjc-std-1.m: Likewise.
	* objc.dg/foreach-2.m: Likewise.
	* objc.dg/foreach-4.m: Likewise.
	* objc.dg/foreach-5.m: Likewise.
	* objc.dg/fsyntax-only.m: Likewise.
	* objc.dg/gnu-api-2-class-meta.m: Likewise.
	* objc.dg/gnu-api-2-class.m: Likewise.
	* objc.dg/gnu-api-2-ivar.m: Likewise.
	* objc.dg/gnu-api-2-method.m: Likewise.
	* objc.dg/gnu-api-2-objc.m: Likewise.
	* objc.dg/gnu-api-2-objc_msg_lookup.m: Likewise.
	* objc.dg/gnu-api-2-object.m: Likewise.
	* objc.dg/gnu-api-2-property.m: Likewise.
	* objc.dg/gnu-api-2-protocol.m: Likewise.
	* objc.dg/gnu-api-2-resolve-method.m: Likewise.
	* objc.dg/gnu-api-2-sel.m: Likewise.
	* objc.dg/incomplete-type-1.m: Likewise.
	* objc.dg/instancetype-0.m: Likewise.
	* objc.dg/invalid-method-2.m: Likewise.
	* objc.dg/ivar-invalid-type-1.m: Likewise.
	* objc.dg/ivar-problem-1.m: Likewise.
	* objc.dg/ivar-scope-1.m: Likewise.
	* objc.dg/ivar-scope-2.m: Likewise.
	* objc.dg/ivar-scope-4.m: Likewise.
	* objc.dg/ivar-visibility-1.m: Likewise.
	* objc.dg/ivar-visibility-2.m: Likewise.
	* objc.dg/ivar-visibility-3.m: Likewise.
	* objc.dg/ivar-visibility-4.m: Likewise.
	* objc.dg/local-decl-1.m: Likewise.
	* objc.dg/lto/lto.exp: Likewise.
	* objc.dg/lto/trivial-1_0.m: Likewise.
	* objc.dg/method-1.m: Likewise.
	* objc.dg/method-12.m: Likewise.
	* objc.dg/method-13.m: Likewise.
	* objc.dg/method-14.m: Likewise.
	* objc.dg/missing-proto-3.m: Likewise.
	* objc.dg/next-runtime-1.m: Likewise.
	* objc.dg/objc-foreach-1.m: Likewise.
	* objc.dg/objc-foreach-2.m: Likewise.
	* objc.dg/objc-foreach-3.m: Likewise.
	* objc.dg/objc-nofilename-1.m: Likewise.
	* objc.dg/param-1.m: Likewise.
	* objc.dg/pch/pch.exp: Likewise.
	* objc.dg/plugin/diagnostic-test-expressions-1.m: Likewise.
	* objc.dg/pr23709.m: Likewise.
	* objc.dg/private-1.m: Likewise.
	* objc.dg/private-2.m: Likewise.
	* objc.dg/property/property.exp: Likewise.
	* objc.dg/proto-hier-1.m: Likewise.
	* objc.dg/proto-hier-2.m: Likewise.
	* objc.dg/proto-lossage-1.m: Likewise.
	* objc.dg/proto-lossage-5.m: Likewise.
	* objc.dg/proto-qual-1.m: Likewise.
	* objc.dg/protocol-inheritance-1.m: Likewise.
	* objc.dg/protocol-inheritance-2.m: Likewise.
	* objc.dg/protocol-optional-1.m: Likewise.
	* objc.dg/selector-1.m: Likewise.
	* objc.dg/selector-2.m: Likewise.
	* objc.dg/selector-3.m: Likewise.
	* objc.dg/selector-4.m: Likewise.
	* objc.dg/shadow-1.m: Likewise.
	* objc.dg/shadow-2.m: Likewise.
	* objc.dg/special/load-category-1.m: Likewise.
	* objc.dg/special/load-category-2.m: Likewise.
	* objc.dg/special/load-category-3.m: Likewise.
	* objc.dg/special/special.exp: Likewise.
	* objc.dg/special/unclaimed-category-1.h: Likewise.
	* objc.dg/special/unclaimed-category-1.m: Likewise.
	* objc.dg/stabs-1.m: Likewise.
	* objc.dg/strings/strings.exp: Likewise.
	* objc.dg/stubify-1.m: Likewise.
	* objc.dg/stubify-2.m: Likewise.
	* objc.dg/super-class-2.m: Likewise.
	* objc.dg/super-dealloc-1.m: Likewise.
	* objc.dg/super-dealloc-2.m: Likewise.
	* objc.dg/sync-3.m: Likewise.
	* objc.dg/threedotthree-abi-1.m: Likewise.
	* objc.dg/torture/dg-torture.exp: Likewise.
	* objc.dg/torture/strings/strings.exp: Likewise.
	* objc.dg/try-catch-11.m: Likewise.
	* objc.dg/try-catch-12.m: Likewise.
	* objc.dg/type-size-2.m: Likewise.
	* objc.dg/type-size-3.m: Likewise.
	* objc.dg/type-size-4.m: Likewise.
	* objc.dg/type-size-5.m: Likewise.
	* objc.dg/undeclared-selector.m: Likewise.
	* objc.dg/volatile-1.m: Likewise.
2020-11-13 10:40:54 +00:00
Iain Sandoe 3fe07cdec8 C-family, Objective-C [1/3] : Implement Wobjc-root-class [PR77404].
This warning catches the case that the user has left the
superclass specification from a class interface.  Root
classes are, of course, permitted and an attribute is added
to mark these so that the diagnostic is suppressed.

The warning and attribute spellings have been kept in sync
with the language reference implementation (clang).

The diagnostic location information present in the objective-c
interface and class definitions is relatively poor.  This patch
adds a location for the class name to the interface and makes use
of it in existing warnings.

Part 1 is the changes to code and added tests.

Many entries in the testsuite make use of root classes so
there are a large number of mechanical changes there adding
"-Wno-objc-root-class" to the options.

The test changes are parts 2 (objective-c) and 3 (objective-c++)
in the patch series.

gcc/c-family/ChangeLog:

	PR objc/77404
	* c-attribs.c (handle_objc_root_class_attribute): New
	* c-objc.h (objc_start_class_interface): Add a location
	value for the position of the class name.
	* c.opt: Add Wobjc-root-class.
	* stub-objc.c (objc_start_class_interface): Add a location
	value for the position of the class name.

gcc/c/ChangeLog:

	PR objc/77404
	* c-parser.c (c_parser_objc_class_definition): Pass the
	location of the class name to the interface declaration.

gcc/cp/ChangeLog:

	PR objc/77404
	* parser.c (cp_parser_objc_class_interface): Pass the
	location of the class name to the interface declaration.

gcc/objc/ChangeLog:

	PR objc/77404
	* objc-act.c (objc_start_class_interface): Accept the location
	of the class name, use it in existing diagnostic.
	(start_class): Accept obj_root_class type attributes.  Warn when
	the interface for an implementation does not contain a super
	class (unless the diagnostic is suppressed by the the command
	line flag or the objc_root_class type attribute).

gcc/testsuite/ChangeLog:

	PR objc/77404
	* objc.dg/attributes/root-class-01.m: New test.
	* objc.dg/root-class-00.m: New test.
	* obj-c++.dg/attributes/root-class-01.mm: New test.
	* obj-c++.dg/root-class-00.mm: New test.

gcc/ChangeLog:

	PR objc/77404
	* doc/extend.texi: Document the objc_root_class attribute.
	* doc/invoke.texi: Document -Wobjc-root-class.
2020-11-13 10:39:48 +00:00
Richard Biener 4852c3266e remove almost all users of gimple_expr_code
This replaces the old-school gimple_expr_code with more selective
functions throughout the compiler, in all cases making the code
shorter or more clear.

2020-11-13  Richard Biener  <rguenther@suse.de>

	* cfgexpand.c (gimple_assign_rhs_to_tree): Use
	gimple_assign_rhs_class.
	(expand_gimple_stmt_1): Likewise.
	* gimplify-me.c (gimple_regimplify_operands): Use
	gimple_assign_single_p.
	* ipa-icf-gimple.c (func_checker::compare_gimple_assign):
	Remove redundant compare.
	(func_checker::compare_gimple_cond): Use gimple_cond_code.
	* tree-ssa-tail-merge.c (gimple_equal_p): Likewise.
	* predict.c (predict_loops): Use gimple_assign_rhs_code.
2020-11-13 11:35:01 +01:00
Aldy Hernandez 8299083667 Inline delegators in vrp_folder.
gcc/ChangeLog:

	* tree-vrp.c (class vrp_folder): Make visit_stmt, visit_phi,
	and m_vr_values private.
	(vrp_folder::vrp_evaluate_conditional): Remove.
	(vrp_folder::vrp_simplify_stmt_using_ranges): Remove.
	(vrp_folder::fold_predicate_in): Inline
	vrp_evaluate_conditional and vrp_simplify_stmt_using_ranges.
	(vrp_folder::fold_stmt): Same.
2020-11-13 08:34:49 +01:00
Aldy Hernandez 40c4eb67f5 Move vr_values out of vrp_prop into execute_vrp so it can be shared.
vr_values is being shared among the propagator and the folder and
passed around.  I've pulled it out from the propagator so it can be
passed around to each, instead of being publicly accessible from the
propagator.

gcc/ChangeLog:

	* tree-vrp.c (class vrp_prop): Rename vr_values to m_vr_values.
	(vrp_prop::vrp_prop): New.
	(vrp_prop::initialize): Rename vr_values to m_vr_values.
	(vrp_prop::visit_stmt): Same.
	(vrp_prop::visit_phi): Same.
	(vrp_prop::finalize): Same.
	(execute_vrp): Instantiate vrp_vr_values and pass it to folder
	and propagator.
2020-11-13 08:34:49 +01:00
Aldy Hernandez 022b99bcba Move vrp_prop before vrp_folder.
gcc/ChangeLog:

	* tree-vrp.c (class vrp_prop): Move entire class...
	(class vrp_folder): ...before here.
2020-11-13 08:34:49 +01:00
Aldy Hernandez 7cc52bc85e Refactor VRP threading code into vrp_jump_threader class.
gcc/ChangeLog:

	* tree-vrp.c (identify_jump_threads): Refactor to..
	(vrp_jump_threader::vrp_jump_threader): ...here
	(vrp_jump_threader::~vrp_jump_threader): ...and here.
	(vrp_jump_threader::after_dom_children): Rename vr_values to
	m_vr_values.
	(execute_vrp): Use vrp_jump_threader.
2020-11-13 08:34:48 +01:00
Aldy Hernandez 2efb9eaaed Group tree-vrp.c by functionality.
Earlier in this cycle there was some work by Giuliano Belinassi and
myself to refactor tree-vrp.c.  A lot of functions and globals were
moved into independent classes, but the haphazard layout remained.
Assertion methods were indispersed with the propagation code, and with
the jump threading code, etc etc.

This series of patches moves things around so that common
functionality is geographically close.  There is no change in
behavior.

I know this is all slated to go in the next release, but finding
things in the current code base, even if just to compare with the
ranger, is difficult.

Since I keep getting bit by aarch64 regressions, I've tested the whole
set of patches on aarch64, as well as individually on x86-64 Linux.

gcc/ChangeLog:

	* tree-vrp.c (struct assert_locus): Move.
	(class vrp_insert): Rename to vrp_asserts.
	(vrp_insert::build_assert_expr_for): Move to vrp_asserts.
	(fp_predicate): Same.
	(vrp_insert::dump): Same.
	(vrp_insert::register_new_assert_for): Same.
	(extract_code_and_val_from_cond_with_ops): Move.
	(vrp_insert::finish_register_edge_assert_for): Move to vrp_asserts.
	(maybe_set_nonzero_bits): Move.
	(vrp_insert::find_conditional_asserts): Move to vrp_asserts.
	(stmt_interesting_for_vrp): Move.
	(struct case_info): Move.
	(compare_case_labels): Move.
	(lhs_of_dominating_assert): Move.
	(find_case_label_index): Move.
	(find_case_label_range): Move.
	(class vrp_asserts): New.
	(vrp_asserts::build_assert_expr_for): Rename from vrp_insert.
	(vrp_asserts::dump): Same.
	(vrp_asserts::register_new_assert_for): Same.
	(vrp_asserts::finish_register_edge_assert_for): Same.
	(vrp_asserts::find_conditional_asserts): Same.
	(vrp_asserts::compare_case_labels): Same.
	(vrp_asserts::find_switch_asserts): Same.
	(vrp_asserts::find_assert_locations_in_bb): Same.
	(vrp_asserts::find_assert_locations): Same.
	(vrp_asserts::process_assert_insertions_for): Same.
	(vrp_asserts::compare_assert_loc): Same.
	(vrp_asserts::process_assert_insertions): Same.
	(vrp_asserts::insert_range_assertions): Same.
	(vrp_asserts::all_imm_uses_in_stmt_or_feed_cond): Same.
	(vrp_asserts::remove_range_assertions): Same.
	(class vrp_prop): Move.
	(all_imm_uses_in_stmt_or_feed_cond): Move.
	(vrp_prop::vrp_initialize): Move.
	(class vrp_folder): Move.
	(vrp_folder::fold_predicate_in): Move.
	(vrp_folder::fold_stmt): Move.
	(vrp_prop::initialize): Move.
	(vrp_prop::visit_stmt): Move.
	(enum ssa_prop_result): Move.
	(vrp_prop::visit_phi): Move.
	(vrp_prop::finalize): Move.
	(class vrp_dom_walker): Rename to...
	(class vrp_jump_threader): ...this.
	(vrp_jump_threader::before_dom_children): Rename from
	vrp_dom_walker.
	(simplify_stmt_for_jump_threading): Rename to...
	(vrp_jump_threader::simplify_stmt): ...here.
	(vrp_jump_threader::after_dom_children): Same.
	(identify_jump_threads): Move.
	(vrp_prop::vrp_finalize): Move array bounds setup code to...
	(execute_vrp): ...here.
2020-11-13 08:34:48 +01:00
Haochen Gui 4109adf256 MAINTAINERS: add myself for write after approval
ChangeLog:

2020-11-13  Haochen Gui  <guihaoc@gcc.gnu.org>

	* MAINTAINERS (Write After Approval): add myself
2020-11-13 11:01:12 +08:00
Andrew MacLeod ee24da1b98 Change range_handler, was Re: Fix gimple_expr_code?
Adjust the range_handler to not use gimple_expr_code/type.

	* gimple-range.h (gimple_range_handler): Use gimple_assign and
	gimple_cond routines to get type and code.
	* range-op.cc (range_op_handler): Check for integral types.
2020-11-12 19:28:45 -05:00
GCC Administrator a5a115258a Daily bump. 2020-11-13 00:16:35 +00:00
Patrick Palka de6f64f955 c++: Don't form a templated TARGET_EXPR in finish_compound_literal
The atom_cache in normalize_atom relies on the assumption that two
equivalent (templated) trees (in the sense of cp_tree_equal) must use
the same template parameters (according to find_template_parameters).

This assumption unfortunately doesn't always hold for TARGET_EXPRs,
because cp_tree_equal ignores an artificial target of a TARGET_EXPR, but
find_template_parameters walks this target (and its DECL_CONTEXT).

Hence two TARGET_EXPRs built by force_target_expr with the same
initializer and under different settings of current_function_decl will
compare equal according to cp_tree_equal, but find_template_parameters
may return a different set of template parameters for them.  This breaks
the below testcase because during normalization we build two such
TARGET_EXPRs (one under current_function_decl=f and another under =g),
and then share the same ATOMIC_CONSTR for the two corresponding atoms,
leading to a crash during satisfaction of g's associated constraints.

This patch works around this issue by removing the source of these
templated TARGET_EXPRs.  The relevant call to get_target_expr_sfinae was
added in r9-6043, and it seems it's no longer necessary (according to
https://gcc.gnu.org/pipermail/gcc-patches/2019-February/517323.html, the
call was added in order to avoid regressing on initlist109.C at the time).

gcc/cp/ChangeLog:

	* semantics.c (finish_compound_literal): Don't wrap the original
	compound literal in a TARGET_EXPR when inside a template.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts-decltype3.C: New test.
2020-11-12 19:07:40 -05:00
Jonathan Wakely 93fc477468 libstdc++: Optimise std::future::wait_for and fix futex polling
To poll a std::future to see if it's ready you have to call one of the
timed waiting functions. The most obvious way is wait_for(0s) but this
was previously very inefficient because it would turn the relative
timeout to an absolute one by calling system_clock::now(). When the
relative timeout is zero (or less) we're obviously going to get a time
that has already passed, but the overhead of obtaining the current time
can be dozens of microseconds. The alternative is to call wait_until
with an absolute timeout that is in the past. If you know the clock's
epoch is in the past you can use a default constructed time_point.
Alternatively, using some_clock::time_point::min() gives the earliest
time point supported by the clock, which should be safe to assume is in
the past. However, using a futex wait with an absolute timeout before
the UNIX epoch fails and sets errno=EINVAL. The new code using futex
waits with absolute timeouts was not checking for this case, which could
result in hangs (or killing the process if the libray is built with
assertions enabled).

This patch checks for times before the epoch before attempting to wait
on a futex with an absolute timeout, which fixes the hangs or crashes.
It also makes it very fast to poll using an absolute timeout before the
epoch (because we skip the futex syscall).

It also makes future::wait_for avoid waiting at all when the relative
timeout is zero or less, to avoid the unnecessary overhead of getting
the current time. This makes polling with wait_for(0s) take only a few
cycles instead of dozens of milliseconds.

libstdc++-v3/ChangeLog:

	* include/std/future (future::wait_for): Do not wait for
	durations less than or equal to zero.
	* src/c++11/futex.cc (_M_futex_wait_until)
	(_M_futex_wait_until_steady): Do not wait for timeouts before
	the epoch.
	* testsuite/30_threads/future/members/poll.cc: New test.
2020-11-12 23:47:04 +00:00
David Malcolm 421d0d0f54 jit: add support for inline asm [PR87291]
This patch adds various entrypoints to libgccjit for directly embedding
asm statements into a compile, analogous to inline asm in the C frontend:
  gcc_jit_block_add_extended_asm
  gcc_jit_block_end_with_extended_asm_goto
  gcc_jit_extended_asm_as_object
  gcc_jit_extended_asm_set_volatile_flag
  gcc_jit_extended_asm_set_inline_flag
  gcc_jit_extended_asm_add_output_operand
  gcc_jit_extended_asm_add_input_operand
  gcc_jit_extended_asm_add_clobber
  gcc_jit_context_add_top_level_asm

gcc/jit/ChangeLog:
	PR jit/87291
	* docs/cp/topics/asm.rst: New file.
	* docs/cp/topics/index.rst (Topic Reference): Add it.
	* docs/topics/asm.rst: New file.
	* docs/topics/compatibility.rst (LIBGCCJIT_ABI_15): New.
	* docs/topics/functions.rst (Statements): Add link to extended
	asm.
	* docs/topics/index.rst (Topic Reference): Add asm.rst.
	* docs/topics/objects.rst: Add gcc_jit_extended_asm to ASCII art.
	* docs/_build/texinfo/Makefile: Regenerate.
	* docs/_build/texinfo/libgccjit.texi: Regenerate.
	* jit-common.h (gcc::jit::recording::extended_asm): New forward
	decl.
	(gcc::jit::recording::top_level_asm): Likewise.
	* jit-playback.c: Include "stmt.h".
	(build_string): New.
	(gcc::jit::playback::context::new_string_literal): Disambiguate
	build_string call.
	(gcc::jit::playback::context::add_top_level_asm): New.
	(build_operand_chain): New.
	(build_clobbers): New.
	(build_goto_operands): New.
	(gcc::jit::playback::block::add_extended_asm): New.
	* jit-playback.h (gcc::jit::playback::context::add_top_level_asm):
	New decl.
	(struct gcc::jit::playback::asm_operand): New struct.
	(gcc::jit::playback::block::add_extended_asm): New decl.
	* jit-recording.c (gcc::jit::recording::context::dump_to_file):
	Dump top-level asms.
	(gcc::jit::recording::context::add_top_level_asm): New.
	(gcc::jit::recording::block::add_extended_asm): New.
	(gcc::jit::recording::block::end_with_extended_asm_goto): New.
	(gcc::jit::recording::asm_operand::asm_operand): New.
	(gcc::jit::recording::asm_operand::print): New.
	(gcc::jit::recording::asm_operand::make_debug_string): New.
	(gcc::jit::recording::output_asm_operand::write_reproducer): New.
	(gcc::jit::recording::output_asm_operand::print): New.
	(gcc::jit::recording::input_asm_operand::write_reproducer): New.
	(gcc::jit::recording::input_asm_operand::print): New.
	(gcc::jit::recording::extended_asm::add_output_operand): New.
	(gcc::jit::recording::extended_asm::add_input_operand): New.
	(gcc::jit::recording::extended_asm::add_clobber): New.
	(gcc::jit::recording::extended_asm::replay_into): New.
	(gcc::jit::recording::extended_asm::make_debug_string): New.
	(gcc::jit::recording::extended_asm::write_flags): New.
	(gcc::jit::recording::extended_asm::write_clobbers): New.
	(gcc::jit::recording::extended_asm_simple::write_reproducer): New.
	(gcc::jit::recording::extended_asm::maybe_populate_playback_blocks):
	New.
	(gcc::jit::recording::extended_asm_goto::extended_asm_goto): New.
	(gcc::jit::recording::extended_asm_goto::replay_into): New.
	(gcc::jit::recording::extended_asm_goto::write_reproducer): New.
	(gcc::jit::recording::extended_asm_goto::get_successor_blocks):
	New.
	(gcc::jit::recording::extended_asm_goto::maybe_print_gotos): New.
	(gcc::jit::recording::extended_asm_goto::maybe_populate_playback_blocks):
	New.
	(gcc::jit::recording::top_level_asm::top_level_asm): New.
	(gcc::jit::recording::top_level_asm::replay_into): New.
	(gcc::jit::recording::top_level_asm::make_debug_string): New.
	(gcc::jit::recording::top_level_asm::write_to_dump): New.
	(gcc::jit::recording::top_level_asm::write_reproducer): New.
	* jit-recording.h
	(gcc::jit::recording::context::add_top_level_asm): New decl.
	(gcc::jit::recording::context::m_top_level_asms): New field.
	(gcc::jit::recording::block::add_extended_asm): New decl.
	(gcc::jit::recording::block::end_with_extended_asm_goto): New
	decl.
	(gcc::jit::recording::asm_operand): New class.
	(gcc::jit::recording::output_asm_operand): New class.
	(gcc::jit::recording::input_asm_operand): New class.
	(gcc::jit::recording::extended_asm): New class.
	(gcc::jit::recording::extended_asm_simple): New class.
	(gcc::jit::recording::extended_asm_goto): New class.
	(gcc::jit::recording::top_level_asm): New class.
	* libgccjit++.h (gccjit::extended_asm): New forward decl.
	(gccjit::context::add_top_level_asm): New.
	(gccjit::block::add_extended_asm): New.
	(gccjit::block::end_with_extended_asm_goto): New.
	(gccjit::extended_asm): New class.
	(gccjit::extended_asm::extended_asm): New ctors.
	(gccjit::extended_asm::set_volatile_flag): New.
	(gccjit::extended_asm::set_inline_flag): New.
	(gccjit::extended_asm::add_output_operand): New.
	(gccjit::extended_asm::add_input_operand): New.
	(gccjit::extended_asm::add_clobber): New.
	(gccjit::extended_asm::get_inner_extended_asm): New.
	* libgccjit.c (struct gcc_jit_extended_asm): New.
	(jit_error): Make "loc" param take a gcc::jit::recording::location *
	rather than a gcc_jit_location *.
	(gcc_jit_block_add_extended_asm): New entrypoint.
	(gcc_jit_block_end_with_extended_asm_goto): New entrypoint.
	(gcc_jit_extended_asm_as_object): New entrypoint.
	(gcc_jit_extended_asm_set_volatile_flag): New entrypoint.
	(gcc_jit_extended_asm_set_inline_flag): New entrypoint.
	(gcc_jit_extended_asm_add_output_operand): New entrypoint.
	(gcc_jit_extended_asm_add_clobber): New entrypoint.
	(gcc_jit_context_add_top_level_asm): New entrypoint.
	* libgccjit.h: Add gcc_jit_extended_asm to ASCII art.
	(gcc_jit_extended_asm): New typedef.
	(LIBGCCJIT_HAVE_ASM_STATEMENTS): New define.
	(gcc_jit_block_add_extended_asm): New entrypoint.
	(gcc_jit_block_end_with_extended_asm_goto): New entrypoint.
	(gcc_jit_extended_asm_as_object): New entrypoint.
	(gcc_jit_extended_asm_set_volatile_flag): New entrypoint.
	(gcc_jit_extended_asm_set_inline_flag): New entrypoint.
	(gcc_jit_extended_asm_add_output_operand): New entrypoint.
	(gcc_jit_extended_asm_add_input_operand): New entrypoint.
	(gcc_jit_extended_asm_add_clobber): New entrypoint.
	(gcc_jit_context_add_top_level_asm): New entrypoint.
	* libgccjit.map (LIBGCCJIT_ABI_15): New.

gcc/testsuite/ChangeLog:
	PR jit/87291
	* jit.dg/jit.exp: Load target-supports-dg.exp.
	Set dg-do-what-default.
	(jit-dg-test): Set dg-do-what and call dg-get-options, skipping
	the test if it's not supported on the given target.
	* jit.dg/test-asm.c: New test.
	* jit.dg/test-asm.cc: New test.
2020-11-12 17:30:01 -05:00
David Malcolm fec5734083 jit: fix string escaping
This patch fixes a bug in recording::string::make_debug_string in which
'\t' and '\n' were "escaped" by simply prepending a '\', thus emitting
'\' then '\n', rather than '\' then 'n'.  It also removes a hack that
determined if a string is to be escaped by checking for a leading '"',
by instead adding a flag.

gcc/jit/ChangeLog:
	* jit-recording.c (recording::context::new_string): Add "escaped"
	param and use it when creating the new recording::string instance.
	(recording::string::string): Add "escaped" param and use it to
	initialize m_escaped.
	(recording::string::make_debug_string): Replace check that first
	char is double-quote with use of m_escaped.  Fix escaping of
	'\t' and '\n'.  Set "escaped" on the result.
	* jit-recording.h (recording::context::new_string): Add "escaped"
	param.
	(recording::string::string): Add "escaped" param.
	(recording::string::m_escaped): New field.

gcc/testsuite/ChangeLog:
	* jit.dg/test-debug-strings.c (create_code): Add tests of
	string literal escaping.
2020-11-12 17:27:28 -05:00
David Malcolm 8948a5715b libgccjit.h: fix typo in comment
gcc/jit/ChangeLog:
	* libgccjit.h: Fix typo in comment.
2020-11-12 17:26:01 -05:00
Nelson Chu 97976c0757 RISC-V: Enable ifunc if it was supported in the binutils for linux toolchain.
gcc/
	* configure: Regenerated.
	* configure.ac: If ifunc was supported in the binutils for
	linux toolchain, then set enable_gnu_indirect_function to yes.
2020-11-12 13:47:16 -08:00
Joseph Myers 1d00f8c863 c: C2x __has_c_attribute
C2x adds the __has_c_attribute preprocessor operator, similar to C++
__has_cpp_attribute.

GCC implements __has_cpp_attribute as exactly equivalent to
__has_attribute.  (The documentation says they differ regarding the
values returned for standard attributes, but that's actually only a
matter of the particular nonzero value returned not being specified in
the documentation for __has_attribute; the implementation makes no
distinction between the two.)

I don't think having them exactly equivalent is actually correct,
either for __has_cpp_attribute or for __has_c_attribute.
Specifically, I think it is only correct for __has_cpp_attribute or
__has_c_attribute to return nonzero if the given attribute is
supported, with the particular pp-tokens passed to __has_cpp_attribute
or __has_c_attribute, with [[]] syntax, not if it's only accepted in
__attribute__ or with gnu:: added in [[]].  For example, they should
return nonzero for gnu::packed, but zero for plain packed, because
[[gnu::packed]] is accepted but [[packed]] is ignored as not a
standard attribute.

This patch implements that for __has_c_attribute, leaving any changes
to __has_cpp_attribute for the C++ maintainers.  A new
BT_HAS_STD_ATTRIBUTE is added for __has_c_attribute (which I think,
based on the above, would actually be correct to use for
__has_cpp_attribute as well).  The code in c_common_has_attribute that
deals with scopes has its C++ conditional removed; instead, whether
the language is C or C++ is used only to determine the numeric values
returned for standard attributes (and which standard attributes are
handled there at all).  A new argument is passed to
c_common_has_attribute to distinguish BT_HAS_STD_ATTRIBUTE from
BT_HAS_ATTRIBUTE, and that argument is used to stop attributes with no
scope specified from being accepted with __has_c_attribute unless they
are one of the known standard attributes and so handled specially.

Although the standard specify constants ending with 'L' as the values
for the standard attributes, there is no correctness issue with the
lack of code in GCC to add that 'L' to the expansion:
__has_c_attribute and __has_cpp_attribute are expanded in #if after
other macro expansion has occurred, with no semantics being specified
if they occur outside #if, so there is no way for a conforming program
to inspect the exact text of the expansion of those macros, only to
use the resulting pp-number in a #if expression, where long and int
have the same set of values.

Bootstrapped with no regressions for x86_64-pc-linux-gnu.

gcc/
2020-11-12  Joseph Myers  <joseph@codesourcery.com>

	* doc/cpp.texi (__has_attribute): Document when scopes are allowed
	for C.
	(__has_c_attribute): New.

gcc/c-family/
2020-11-12  Joseph Myers  <joseph@codesourcery.com>

	* c-lex.c (c_common_has_attribute): Take argument std_syntax.
	Allow scope for C.  Handle standard attributes for C.  Do not
	accept unscoped attributes if std_syntax and not handled as
	standard attributes.
	* c-common.h (c_common_has_attribute): Update prototype.

gcc/testsuite/
2020-11-12  Joseph Myers  <joseph@codesourcery.com>

	* gcc.dg/c2x-has-c-attribute-1.c, gcc.dg/c2x-has-c-attribute-2.c,
	gcc.dg/c2x-has-c-attribute-3.c, gcc.dg/c2x-has-c-attribute-4.c:
	New tests.

libcpp/
2020-11-12  Joseph Myers  <joseph@codesourcery.com>

	* include/cpplib.h (struct cpp_callbacks): Add bool argument to
	has_attribute.
	(enum cpp_builtin_type): Add BT_HAS_STD_ATTRIBUTE.
	* init.c (builtin_array): Add __has_c_attribute.
	(cpp_init_special_builtins): Handle BT_HAS_STD_ATTRIBUTE.
	* macro.c (_cpp_builtin_macro_text): Handle BT_HAS_STD_ATTRIBUTE.
	Update call to has_attribute for BT_HAS_ATTRIBUTE.
	* traditional.c (fun_like_macro): Handle BT_HAS_STD_ATTRIBUTE.
2020-11-12 21:13:51 +00:00
Jakub Jelinek 6fcc3cac42 openmp: Implement allocate clause in omp lowering.
For now, task/taskloop constructs aren't handled and C/C++ array reductions
and reductions with task or inscan modifiers need further work.
Instead of calling omp_alloc/omp_free (where the former doesn't have
alignment argument and omp_aligned_alloc is 5.1 only feature), this calls
GOMP_alloc/GOMP_free, so that the library can fail if it would fall back
into NULL (exception is zero length allocations).

2020-11-12  Jakub Jelinek  <jakub@redhat.com>

gcc/
	* builtin-types.def (BT_FN_PTR_SIZE_SIZE_PTRMODE): New function type.
	* omp-builtins.def (BUILT_IN_GOACC_DECLARE): Move earlier.
	(BUILT_IN_GOMP_ALLOC, BUILT_IN_GOMP_FREE): New builtins.
	* gimplify.c (gimplify_scan_omp_clauses): Force allocator into a
	decl if it is not NULL, INTEGER_CST or decl.
	(gimplify_adjust_omp_clauses): Clear GOVD_EXPLICIT on explicit clauses
	which are being removed.  Remove allocate clauses for variables not seen
	if they are private, firstprivate or linear too.  Call
	omp_notice_variable on the allocator otherwise.
	(gimplify_omp_for): Handle iterator vars mentioned in allocate clauses
	similarly to non-is_gimple_reg iterators.
	* omp-low.c (struct omp_context): Add allocate_map field.
	(delete_omp_context): Delete it.
	(scan_sharing_clauses): Fill it from allocate clauses.  Remove it
	if mentioned also in shared clause.
	(lower_private_allocate): New function.
	(lower_rec_input_clauses): Handle allocate clause for privatized
	variables, except for task/taskloop, C/C++ array reductions for now
	and task/inscan variables.
	(lower_send_shared_vars): Don't consider variables in allocate_map
	as shared.
	* omp-expand.c (expand_omp_for_generic, expand_omp_for_static_nochunk,
	expand_omp_for_static_chunk): Use expand_omp_build_assign instead of
	gimple_build_assign + gsi_insert_after.
	* builtins.c (builtin_fnspec): Handle BUILTIN_GOMP_ALLOC and
	BUILTIN_GOMP_FREE.
	* tree-ssa-ccp.c (evaluate_stmt): Handle BUILTIN_GOMP_ALLOC.
	* tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Handle
	BUILTIN_GOMP_ALLOC.
	(mark_all_reaching_defs_necessary_1): Handle BUILTIN_GOMP_ALLOC
	and BUILTIN_GOMP_FREE.
	(propagate_necessity): Likewise.
gcc/fortran/
	* f95-lang.c (ATTR_ALLOC_WARN_UNUSED_RESULT_SIZE_2_NOTHROW_LIST):
	Define.
	(gfc_init_builtin_functions): Add alloc_size and warn_unused_result
	attributes to __builtin_GOMP_alloc.
	* types.def (BT_PTRMODE): New primitive type.
	(BT_FN_VOID_PTR_PTRMODE, BT_FN_PTR_SIZE_SIZE_PTRMODE): New function
	types.
libgomp/
	* libgomp.map (GOMP_alloc, GOMP_free): Export at GOMP_5.0.1.
	* omp.h.in (omp_alloc): Add malloc and alloc_size attributes.
	* libgomp_g.h (GOMP_alloc, GOMP_free): Declare.
	* allocator.c (omp_aligned_alloc): New for now static function,
	add alignment argument and handle it.
	(omp_alloc): Reimplement using omp_aligned_alloc.
	(GOMP_alloc, GOMP_free): New functions.
	(omp_free): Add ialias.
	* testsuite/libgomp.c-c++-common/allocate-1.c: New test.
	* testsuite/libgomp.c++/allocate-1.C: New test.
2020-11-12 21:38:04 +01:00
Thomas Schwinge 9106c51e57 Adjust 'libgomp.oacc-fortran/attach-descriptor-1.f90' for improved location information
Fix-up for commit b71ff8c15f "Fortran: improve
location data for OpenACC/OpenMP directives [PR97782]".

	libgomp/
	PR fortran/97782
	* testsuite/libgomp.oacc-fortran/attach-descriptor-1.f90: Adjust.
2020-11-12 20:20:10 +01:00
Martin Jambor 25a0d08b7f cgraph: Avoid segfault when attempting to dump NULL clone_info
cgraph_node::materialize_clone segfaulted when I tried compiling
Tramp3D with -fdump-ipa-all because there was no clone_info - IPA-CP
created a clone only for an aggregate constant, adding a note to its
transformation summary but not creating any tree_map nor
param_adjustements.

Fixed with the following obvious extra checks which has passed
bootstrap and testing on x86_64-linux.

gcc/ChangeLog:

2020-11-12  Martin Jambor  <mjambor@suse.cz>

	* cgraphclones.c (cgraph_node::materialize_clone): Check that clone
	info is not NULL before attempting to dump it.
2020-11-12 19:56:22 +01:00
Martin Jambor b86aedb0cc ipa-cp: Work with time benefits and frequencies in sreals
This patch converts the variables that hold time benefits and
frequencies in IPA-CP from plain integers to sreals, avoiding the need
to cap them to avoid overflows and also fixing a potential underflows.

Size costs corresponding to individual constants are left as ints so
that they do not take up too much space.  Care must be taken that
adding it up does not overflow, especially in the case of
prop_size_cost, because in cases of extremely long chains of lattice
dependencies it can overflow (e.g. in testsuite/gcc.dg/ipa/pr50744.c).
The overall size is already tracked in long ints.

gcc/ChangeLog:

2020-11-11  Martin Jambor  <mjambor@suse.cz>

	* ipa-cp.c (class ipcp_value_base): Change the type of
	local_time_benefit and prop_time_benefit to sreal.  Adjust the
	constructor initializer.
	(ipcp_lattice::print): Dump sreals.
	(struct caller_statistics): Change the type of freq_sum to sreal.
	(gather_caller_stats): Work with sreal freq_sum.
	(incorporate_penalties): Work with sreal evaluation.
	(good_cloning_opportunity_p): Adjusted for sreal sreal time_benefit
	and freq_sum.  Bail out if size_cost is INT_MAX.
	(perform_estimation_of_a_value): Work with sreal time_benefit.  Avoid
	unnecessary capping.
	(estimate_local_effects): Pass sreal time benefit to
	good_cloning_opportunity_p without capping it.  Adjust dumping.
	(safe_add): If there can be overflow, return INT_MAX.
	(propagate_effects): Work with sreal times.
	(get_info_about_necessary_edges): Work with sreal frequencies.
	(decide_about_value): Likewise and with sreal time benefits.
2020-11-12 19:56:07 +01:00
Marek Polacek 876b45db81 system: Add WARN_UNUSED_RESULT
I'd like to have the option of marking functions with
__attribute__ ((__warn_unused_result__)), so this patch adds a macro.
And use it for maybe_wrap_with_location, it's always a bug if the
return value is not used, which happened to me and got me confused.

gcc/ChangeLog:

	* system.h (WARN_UNUSED_RESULT): Define for GCC >= 3.4.
	* tree.h (maybe_wrap_with_location): Add WARN_UNUSED_RESULT.
2020-11-12 11:24:23 -05:00
Jan Hubicka f8f575d759 Compare field offsets in operand_equal_p and OEP_ADDRESS_OF
* fold-const.c (operand_compare::operand_equal_p): Compare field
	offsets in operand_equal_p and OEP_ADDRESS_OF.
	(operand_compare::hash_operand): Update.
2020-11-12 17:15:19 +01:00
Jonathan Wakely d21776ef90 libstdc++: Simplify __numeric_traits definition
This changes the __numeric_traits primary template to assume its
argument is an integer type. For the three floating point types that are
supported by __numeric_traits_floating an explicit specialization of
__numeric_traits chooses the right base class.

This improves the failure mode for using __numeric_traits with an
unsupported type. Previously it would use __numeric_traits_floating as
the base class, and give somewhat obscure errors for trying to access
the static data members. Now it will use __numeric_traits_integer which
has a static_assert to check for supported types.

As a side effect of this change there is no need to instantiate
__conditional_type to decide which base class to use.

libstdc++-v3/ChangeLog:

	* include/ext/numeric_traits.h (__numeric_traits): Change
	primary template to always derive from __numeric_traits_integer.
	(__numeric_traits<float>, __numeric_traits<double>)
	(__numeric_traits<long double>): Add explicit specializations.
2020-11-12 14:36:39 +00:00
Richard Biener 896db49a44 More PRE compile-time optimizations
This fixes a bug in bitmap_list_view which could end up with
a NULL head->current which makes followup searches fail.  Oops.

It also further optimizes the PRE DFS walk by removing useless
stuff and special-casing bitmaps with just one element for
EXECUTE_IF_AND_IN_BITMAP which makes a quite big difference.

2020-11-12  Richard Biener  <rguenther@suse.de>

	* bitmap.c (bitmap_list_view): Restore head->current.
	* tree-ssa-pre.c (pre_expr_DFS): Elide expr_visited bitmap.
	Special-case value expression bitmaps with one element.
	(bitmap_find_leader): Likewise.
	(sorted_array_from_bitmap_set): Elide expr_visited bitmap.
2020-11-12 15:08:43 +01:00
Nicholas Guriev cb808c583d Specify reason of -Winvalid-pch warning
gcc/c-family
	PR pch/86674
	* c-pch.c (c_common_valid_pch): Use cpp_warning with CPP_W_INVALID_PCH
	reason to fix -Werror=invalid-pch and -Wno-error=invalid-pch switches.

libcpp
	PR pch/86674
	* files.c (_cpp_find_file): Use CPP_DL_NOTE not CPP_DL_ERROR in call to
	cpp_error.
2020-11-12 09:02:12 -05:00
Jan Hubicka 071a31a533 Add support for copy specifiers in fnspec
* attr-fnspec.h: Update topleve comment.
	(attr_fnspec::arg_direct_p): Accept 1...9.
	(attr_fnspec::arg_maybe_written_p): Reject 1...9.
	(attr_fnspec::arg_copied_to_arg_p): New member function.
	* builtins.c (builtin_fnspec): Update fnspec of block copy.
	* tree-ssa-alias.c (attr_fnspec::verify): Update.
2020-11-12 14:56:40 +01:00
Tobias Burnus b71ff8c15f Fortran: improve location data for OpenACC/OpenMP directives [PR97782]
gcc/fortran/ChangeLog:

	PR fortran/97782
	* trans-openmp.c (gfc_trans_oacc_construct, gfc_trans_omp_parallel_do,
	gfc_trans_omp_parallel_do_simd, gfc_trans_omp_parallel_sections,
	gfc_trans_omp_parallel_workshare, gfc_trans_omp_sections
	gfc_trans_omp_single, gfc_trans_omp_task, gfc_trans_omp_teams
	gfc_trans_omp_target, gfc_trans_omp_target_data,
	gfc_trans_omp_workshare): Use code->loc instead of input_location
	when building the OMP_/OACC_ construct.

gcc/testsuite/ChangeLog:

	PR fortran/97782
	* gfortran.dg/goacc/classify-kernels-unparallelized.f95: Move dg-message
	one line up.
	* gfortran.dg/goacc/classify-kernels.f95: Likewise.
2020-11-12 14:13:45 +01:00
Jonathan Wakely 7f851c3341 libstdc++: Fix __numeric_traits_integer<__int20> [PR 97798]
The expression used to calculate the maximum value for an integer type
assumes that the number of bits in the value representation is always
sizeof(T) * CHAR_BIT. This is not true for the __int20 type on msp430,
which has only 20 bits in the value representation but 32 bits in the
object representation. This causes an integer overflow in a constant
expression, which is ill-formed.

This problem was already solved by DJ for std::numeric_limits<__int20>
by generalizing the helper macros to use a specified number of bits
instead of assuming sizeof(T) * CHAR_BIT. Then the INT_N_n types can
specify the number of bits using the __GLIBCXX_BITSIZE_INT_N_n macros
that the compiler defines.

I'm using a slightly different approach here. I've replaced the helper
macros entirely, and just expanded the calculations in the initializers
for the static data members. By reordering the data members we can reuse
__is_signed and __digits in the other initializers. This removes the
repetition of expanding __glibcxx_signed(T) and __glibcxx_digits(T)
multiple times in each initializer.

The __is_integer_nonstrict trait now defines a new constant, __width,
which is sizeof(T) * CHAR_BIT by default (defined as an enumerator so
that no storage is needed for a static data member). By specializing
__is_integer_nonstrict for the INT_N types that have padding bits, we
can provide the correct width via the __GLIBCXX_BITSIZE_INT_N_n macros.

libstdc++-v3/ChangeLog:

	PR libstdc++/97798
	* include/ext/numeric_traits.h (__glibcxx_signed)
	(__glibcxx_digits, __glibcxx_min, __glibcxx_max): Remove
	macros.
	(__is_integer_nonstrict::__width): Define new constant.
	(__numeric_traits_integer): Define constants in terms of each
	other and __is_integer_nonstrict::__width, rather than the
	removed macros.
	(_GLIBCXX_INT_N_TRAITS): Macro to define explicit
	specializations for non-standard integer types.
2020-11-12 12:10:10 +00:00
Thomas Koenig 3c3beb1a81 Add test case for PR 97799.
gcc/testsuite/ChangeLog:

	* gfortran.dg/entry_23.f: New test.
2020-11-12 12:51:36 +01:00
Richard Biener 512c6ba041 Avoid PRE insert iteration when possible
The following make sure to only iterate PRE insertion when
necessary - which is when AVAIL_OUT of a predecessor of a
block we already visited changed (that's backedge destinations).

To not regress this also makes sure to locally iterate insertion
since even topological sort of expressions isn't enough to
guarantee we get all opportunities of a block in one iteration.
This avoids costly re-compute of the topologically sorted expression
array (more micro-optimization is possible here).

2020-11-12  Richard Biener  <rguenther@suse.de>

	* tree-ssa-pre.c (bitmap_value_replace_in_set): Return
	whether we have changed anything.
	(do_pre_regular_insertion): Get topologically sorted array
	of expressions from caller.
	(do_pre_partial_partial_insertion): Likewise.
	(insert): Compute topologically sorted arrays of expressions
	here and locally iterate actual insertion.  Iterate only
	when AVAIL_OUT of an already visited block source changed.
2020-11-12 11:56:18 +01:00
Alex Coplan 7f445b5d61 aarch64: Fix SVE2 BCAX pattern [PR97730]
This patch adds a missing not to the SVE2 BCAX (Bitwise clear and
exclusive or) pattern, fixing the PR. Since SVE doesn't have an
unpredicated not instruction, we need to use a (vacuously) predicated
not here.

To ensure that the predicate is instantiated correctly (to all 1s) for
the intrinsics, we pull out a separate expander from the define_insn.

From the ISA reference [1]:
> Bitwise AND elements of the second source vector with the
> corresponding inverted elements of the third source vector, then
> exclusive OR the results with corresponding elements of the first
> source vector.

[1] : https://developer.arm.com/docs/ddi0602/g/a64-sve-instructions-alphabetic-order/bcax-bitwise-clear-and-exclusive-or

gcc/ChangeLog:

	PR target/97730
	* config/aarch64/aarch64-sve2.md (@aarch64_sve2_bcax<mode>):
	Change to define_expand, add missing (trivially-predicated) not
	rtx to fix wrong code bug.
	(*aarch64_sve2_bcax<mode>): New.

gcc/testsuite/ChangeLog:

	PR target/97730
	* gcc.target/aarch64/sve2/bcax_1.c (OP): Add missing bitwise not
	to match correct bcax semantics.
	* gcc.dg/vect/pr97730.c: New test.
2020-11-12 10:03:21 +00:00
Richard Biener 64326bb428 tree-optimization/97806 - fix PRE expression post order
This fixes the postorder compute for the case of multiple
expression leaders for a value.

2020-11-12  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/97806
	* tree-ssa-pre.c (pre_expr_DFS): New overload for visiting
	values, visiting all leaders for a value.  Use a bitmap
	for visited values.
	(sorted_array_from_bitmap_set): Walk over values and adjust.

	* gcc.dg/pr97806.c: New testcase.
2020-11-12 11:00:47 +01:00
Jakub Jelinek fc531c2ed3 c++: Fix up constexpr CLEANUP_POINT_EXPR and TRY_FINALLY_EXPR handling [PR97790]
As the testcase shows, CLEANUP_POINT_EXPR (and I think TRY_FINALLY_EXPR too)
suffer from the same problem that I was trying to fix in
r10-3597-g1006c9d4395a939820df76f37c7b085a4a1a003f
for CLEANUP_STMT, namely that if in the middle of the body expression of
those stmts is e.g. return stmt, goto, break or continue (something that
changes *jump_target and makes it start skipping stmts), we then skip the
cleanups too, which is not appropriate - the cleanups were either queued up
during the non-skipping execution of the body (for CLEANUP_POINT_EXPR), or
for TRY_FINALLY_EXPR are relevant already after entering the body block.

> Would it make sense to always use a NULL jump_target when evaluating
> cleanups?

I was afraid of that, especially for TRY_FINALLY_EXPR, but it seems that
during constexpr evaluation the cleanups will most often be just very simple
destructor calls (or calls to cleanup attribute functions).
Furthermore, for neither of these 3 tree codes we'll reach that code if
jump_target && *jump_target initially (there is a return NULL_TREE much
earlier for those except for trees that could embed labels etc. in it and
clearly these 3 don't count in that).

2020-11-12  Jakub Jelinek  <jakub@redhat.com>

	PR c++/97790
	* constexpr.c (cxx_eval_constant_expression) <case CLEANUP_POINT_EXPR,
	case TRY_FINALLY_EXPR, case CLEANUP_STMT>: Don't pass jump_target to
	cxx_eval_constant_expression when evaluating the cleanups.

	* g++.dg/cpp2a/constexpr-dtor9.C: New test.
2020-11-12 10:46:04 +01:00