1. 14 Aug, 2019 40 commits
    • [Ada] Defer processing of unknown CTW/E conditions to the back end · 2d1439c7
      2019-08-14  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* sem_prag.adb (Process_Compile_Time_Warning_Or_Error): Defer
      	processing to the back end in all cases where the pragma's
      	condition is not known at compile time during the front end
      	(except in generics), as opposed to detecting 'Size attributes
      	and the like. This ensures that we take advantage of whatever
      	can be compile-time known after running the back end, as opposed
      	to having the front end guess what the back end can do.  Remove
      	a little duplicated code at the call site.
      	* gnat1drv.adb (Post_Compilation_Validation_Checks): Unlock the
      	Elists while in Validate_Compile_Time_Warning_Errors, because it
      	does analysis and name resolution, which sometimes involves
      	adding Elists.
      
      From-SVN: r274466
      Bob Duff committed
    • [Ada] Compiler speedup with inlining across units · 4b96d386
      This change is aimed at speeding up the inlining across units done by
      the Ada compiler when -gnatn is specified and in the presence of units
      instantiating a lot of generic packages.
      
      The current implementation is as follows: when a generic package is
      being instantiated, the compiler scans its spec for the presence of
      subprograms with an aspect/pragma Inline and, upon finding one,
      schedules the instantiation of its body.  That's not very efficient
      because the compiler doesn't know yet if one of those inlined
      subprograms will eventually be called from the main unit.
      
      The new implementation arranges for the compiler to instantiate the body
      on demand, i.e. when it encounters a call to one of the inlined
      subprograms.  That's still not optimal because, at this point, the
      compiler has not yet computed whether the call itself is reachable from
      the main unit (it will do this computation at the very end of the
      processing, just before sending the inlined units to the code generator)
      but that's nevertheless a net progress.
      
      The patch also enhances the -gnatd.j option to make it output the list
      of instances "inlined" this way.  The following package is a simple
      example:
      
      with Q;
      
      procedure P is
      begin
        Q.Proc;
      end;
      
      package Q is
      
        procedure Proc;
        pragma Inline (Proc);
      
      end Q;
      
      with G;
      
      package body Q is
      
        package My_G is new G (1);
      
        procedure Proc is
          Val : constant Integer := My_G.Func;
        begin
          if Val /= 1 then
            raise Program_Error;
          end if;
        end;
      
      end Q;
      
      generic
      
        Value : Integer;
      
      package G is
      
        function Func return Integer;
        pragma Inline (Func);
      
      end G;
      
      package body G is
      
        function Func return Integer is
        begin
          return Value;
        end;
      
      end G;
      
      2019-08-14  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* einfo.ads (Is_Called): Document new usage on E_Package
      	entities.
      	* einfo.adb (Is_Called): Accept E_Package entities.
      	(Set_Is_Called): Likewise.
      	* exp_ch6.adb (Expand_Call_Helper): Move code dealing with
      	instances for back-end inlining to Add_Inlined_Body.
      	* inline.ads: Remove with clauses for Alloc and Table.
      	(Pending_Instantiations): Move to...
      	* inline.adb: Add with clauses for Alloc, Uintp, Table and
      	GNAT.HTable.
      	(Backend_Instances): New variable.
      	(Pending_Instantiations): ...here.
      	(Called_Pending_Instantiations): New table.
      	(Node_Table_Size): New constant.
      	(Node_Header_Num): New subtype.
      	(Node_Hash): New function.
      	(To_Pending_Instantiations): New hash table.
      	(Add_Inlined_Body): Bail out early for subprograms in the main
      	unit or subunit.  Likewise if the Is_Called flag is set.  If the
      	subprogram is an instance, invoke Add_Inlined_Instance.  Call
      	Set_Is_Called earlier.  If the subrogram is within an instance,
      	invoke Add_Inlined_Instance.  Also deal with the case where the
      	call itself is within an instance.
      	(Add_Inlined_Instance): New procedure.
      	(Add_Inlined_Subprogram): Remove conditions always fulfilled.
      	(Add_Pending_Instantiation): Move the defence against ludicruous
      	number of instantiations to here. When back-end inlining is
      	enabled, associate an instantiation with its index in table and
      	mark a few selected kinds of instantiations as always needed.
      	(Initialize): Set Backend_Instances to No_Elist.
      	(Instantiate_Body): New procedure doing the work extracted
      	from...
      	(Instantiate_Bodies): ...here.  When back-end inlining is
      	enabled, loop over Called_Pending_Instantiations instead of
      	Pending_Instantiations.
      	(Is_Nested): Minor tweak.
      	(List_Inlining_Info): Also list the contents of
      	Backend_Instances.
      	* sem_ch12.adb (Might_Inline_Subp): Return early if Is_Inlined
      	is set and otherwise set it before returning true.
      	(Analyze_Package_Instantiation): Remove the defence against
      	ludicruous number of instantiations.  Invoke
      	Remove_Dead_Instance instead of doing the removal manually if
      	there is a guaranteed ABE.
      
      From-SVN: r274465
      Eric Botcazou committed
    • [Ada] Equality for nonabstract type derived from interface treated as abstract · 72e324b6
      The compiler was creating an abstract function for the equality
      operation of a (nonlimited) interface type, and that could result in
      errors on generic instantiations that are passed nonabstract types
      derived from the interface type along with the derived type's inherited
      equality operation (complaining about an abstract subprogram being
      passed to a nonabstract formal). The "=" operation of an interface is
      supposed to be nonabstract (a direct consequence of the rule in RM
      4.5.2(6-7)), so we now create an expression function rather than an
      abstract function. The function returns False, but the result is
      unimportant since a function of an abstract type can never actually be
      invoked (its arguments must generally be class-wide, since there can be
      no objects of the type, and calling it will dispatch).
      
      2019-08-14  Gary Dismukes  <dismukes@adacore.com>
      
      gcc/ada/
      
      	* exp_ch3.adb (Predef_Spec_Or_Body): For an equality operation
      	of an interface type, create an expression function (that
      	returns False) rather than declaring an abstract function.
      	* freeze.adb (Check_Inherited_Conditions): Set Needs_Wrapper to
      	False unconditionally at the start of the loop creating wrappers
      	for inherited operations.
      
      gcc/testsuite/
      
      	* gnat.dg/equal11.adb, gnat.dg/equal11_interface.ads,
      	gnat.dg/equal11_record.adb, gnat.dg/equal11_record.ads: New
      	testcase.
      
      From-SVN: r274464
      Gary Dismukes committed
    • [Ada] Strengthen Locked flag · ae3a2b54
      This patch strengthens the Locked flag, by Asserting that it is False on
      operations that might cause reallocation.
      
      No change in behavior (except in the presence of compiler bugs), so no
      test.
      
      2019-08-14  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* table.adb: Assert that the table is not locked when increasing
      	Last, even if it doesn't cause reallocation.  In other words,
      	assert that on operations that MIGHT cause reallocation.
      	* table.ads: Fix comment accordingly.
      
      From-SVN: r274463
      Bob Duff committed
    • [Ada] Remove documentation of gnatelim · 27af94e7
      2019-08-14  Arnaud Charlet  <charlet@adacore.com>
      
      gcc/ada/
      
      	* doc/gnat_ugn/gnat_and_program_execution.rst: Remove
      	documentation of gnatelim.
      
      From-SVN: r274462
      Arnaud Charlet committed
    • [Ada] Tweak the sloc of Compile_Time_Warning warnings · 3a02b469
      2019-08-14  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* sem_prag.adb (Validate_Compile_Time_Warning_Error): Attach the
      	warning to the Sloc of the first pragma argument, rather than to
      	the pragma itself. This is to make pragmas processed after the
      	back end use the same Sloc as pragmas processed earlier, in the
      	front end. There's no reason for this discrepancy, and it
      	hinders further work on this ticket.
      
      From-SVN: r274461
      Bob Duff committed
    • [Ada] Minor: remove a ??? comment · 6d0ca6ac
      Minor: remove the ??? comment for the Inside_A_Generic flag. The current
      name is clear and concise, even though we are noun-ing the adjective
      "generic".
      
      2019-08-14  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* sem.ads (Inside_A_Generic): Remove the ??? comment.
      
      From-SVN: r274460
      Bob Duff committed
    • [Ada] Remove obsolete Pending_Descriptor table and related bits · 0984258e
      The table has been unused for a while.  No functional changes.
      
      2019-08-14  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* inline.ads (Pending_Descriptor): Delete.
      	* inline.adb (Initialize): Do not initialize it.
      	* sem_ch12.adb (Delay_Descriptors): Delete.
      	(Analyze_Package_Instantiation): Call
      	Set_Delay_Subprogram_Descriptors instead of Delay_Descriptors
      	throughout.
      
      From-SVN: r274459
      Eric Botcazou committed
    • [Ada] Spurious error in discriminated aggregate · f056076f
      This patch fixes a bug in which a spurious error is given on an
      aggregate of a type derived from a subtype with a constrained
      discriminant.
      
      2019-08-14  Bob Duff  <duff@adacore.com>
      
      gcc/ada/
      
      	* exp_aggr.adb (Init_Hidden_Discriminants): Avoid processing the
      	wrong discriminant, which could be of the wrong type.
      
      gcc/testsuite/
      
      	* gnat.dg/discr57.adb: New testcase.
      
      From-SVN: r274458
      Bob Duff committed
    • [Ada] Fix internal error on inlined subprogram instance · 2a127979
      This fixes a long-standing oddity in the procedure analyzing the
      instantiation of a generic subprogram, which would set the
      Is_Generic_Instance flag on the enclosing package generated for the
      instantiation but only to reset it a few lines below.  Now this flag is
      relied upon by the machinery which computes the set of public entities
      to be exposed by a package.
      
      2019-08-14  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* sem_ch12.adb (Analyze_Instance_And_Renamings): Do not reset
      	the Is_Generic_Instance flag previously set on the package
      	generated for the instantiation of a generic subprogram.
      
      gcc/testsuite/
      
      	* gnat.dg/generic_inst11.adb, gnat.dg/generic_inst11_pkg.adb,
      	gnat.dg/generic_inst11_pkg.ads: New testcase.
      
      From-SVN: r274457
      Eric Botcazou committed
    • [Ada] Crash on quantified expression in disabled assertion · 16b9e3c3
      The defining identifier of a quantified expression may be the freeze
      point of its type.  If the quantified expression appears in an assertion
      that is disavbled, the freeze node for that type may appear in a tree
      that will be discarded when the enclosing pragma is elaborated. To
      ensure that the freeze node is reachable for subsquent uses we must
      generate its freeze node explicitly when the quantified expression is
      analyzed.
      
      2019-08-14  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* exp_ch4.adb (Expand_N_Quantified_Expression): Freeze
      	explicitly the type of the loop parameter.
      
      gcc/testsuite/
      
      	* gnat.dg/assert2.adb, gnat.dg/assert2.ads: New testcase.
      
      From-SVN: r274456
      Ed Schonberg committed
    • [Ada] Sem_Util: fix a bug in New_Copy_Tree · 4cac730c
      No impact on GCC-based compilation.
      
      2019-08-14  Javier Miranda  <miranda@adacore.com>
      
      gcc/ada/
      
      	* sem_util.adb (New_Copy_Tree.Copy_Node_With_Replacement):
      	Update the Chars attribute of identifiers.
      
      From-SVN: r274455
      Javier Miranda committed
    • [Ada] Expose part of ownership checking for use in GNATprove · 1384d88f
      GNATprove needs to be able to call a subset of the ownership legality
      rules from marking. This is provided by a new function
      Sem_SPARK.Is_Legal.
      
      There is no impact on compilation.
      
      2019-08-14  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* sem_spark.adb, sem_spark.ads (Is_Legal): New function exposed
      	for use in GNATprove, to test legality rules not related to
      	permissions.
      	(Check_Declaration_Legality): Extract the part of
      	Check_Declaration that checks rules not related to permissions.
      	(Check_Declaration): Call the new Check_Declaration_Legality.
      	(Check_Type_Legality): Rename of Check_Type. Introduce
      	parameters to force or not checking, and update a flag detecting
      	illegalities.
      	(Check_Node): Ignore attribute references in statement position.
      
      From-SVN: r274454
      Yannick Moy committed
    • [Ada] Check SPARK restriction on Old/Loop_Entry with pointers · 05b77088
      --#! r336866
      --#! no-mail
      
      SPARK RM rule 3.10(14) restricts the use of Old and Loop_Entry
      attributes on prefixes of an owning or observing type (i.e. a type with
      access inside).
      
      There is no impact on compilation.
      
      2019-08-14  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* sem_spark.adb (Check_Old_Loop_Entry): New procedure to check
      	correct use of Old  and Loop_Entry.
      	(Check_Node): Check subprogram contracts.
      	(Check_Pragma): Check Loop_Variant.
      	(Check_Safe_Pointers): Apply checking to library-level
      	subprogram  declarations as well, in order to check their
      	contract.
      
      From-SVN: r274453
      Yannick Moy committed
    • [Ada] Fix spurious ownership error in GNATprove · 9d792131
      Like Is_Path_Expression, function Is_Subpath_Expression should consider
      the possibility that the subpath is a type conversion or type
      qualification over the actual subpath node. This avoids spurious
      ownership errors in GNATprove.
      
      There is no impact on compilation.
      
      2019-08-14  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* sem_spark.adb (Is_Subpath_Expression): Take into account
      	conversion and qualification.
      
      From-SVN: r274452
      Yannick Moy committed
    • [Ada] Fix discrepancy in mechanism tracking private and full views · ebe1a04f
      This fixes a discrepancy in the mechanism tracking the private and full
      views of entities when entering and leaving scopes.  This mechanism
      records private entities that are dependent on other private entities,
      so that the exchange done on entering and leaving scopes can be
      propagated.
      
      The propagation is done recursively on entering child units, but it was
      not done recursively on leaving them, which would leave the dependency
      chains in a uncertain state in this case.  That's mostly visible when
      inlining across units is enabled for code involving a lot of generic
      units.
      
      2019-08-14  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* sem_ch7.adb (Install_Private_Declarations)
      	<Swap_Private_Dependents>: Do not rely solely on the
      	Is_Child_Unit flag on the unit to recurse.
      	(Uninstall_Declarations) <Swap_Private_Dependents>: New
      	function.  Use it to recurse on the private dependent entities
      	for child units.
      
      gcc/testsuite/
      
      	* gnat.dg/inline18.adb, gnat.dg/inline18.ads,
      	gnat.dg/inline18_gen1-inner_g.ads, gnat.dg/inline18_gen1.adb,
      	gnat.dg/inline18_gen1.ads, gnat.dg/inline18_gen2.adb,
      	gnat.dg/inline18_gen2.ads, gnat.dg/inline18_gen3.adb,
      	gnat.dg/inline18_gen3.ads, gnat.dg/inline18_pkg1.adb,
      	gnat.dg/inline18_pkg1.ads, gnat.dg/inline18_pkg2-child.ads,
      	gnat.dg/inline18_pkg2.ads: New testcase.
      
      From-SVN: r274451
      Eric Botcazou committed
    • [Ada] Fix a recent ACATS regression (c552001) · d2d56bba
      2019-08-14  Javier Miranda  <miranda@adacore.com>
      
      gcc/ada/
      
      	* exp_aggr.adb (Is_CCG_Supported_Aggregate): Return False for
      	arrays with bounds not known at compile time.
      
      From-SVN: r274450
      Javier Miranda committed
    • [Ada] Crash on precondition involving quantified expression · cc248146
      This patch fixes a compiler abort on a precondition whose condition
      includes a quantified expression.
      
      2019-08-14  Ed Schonberg  <schonberg@adacore.com>
      
      gcc/ada/
      
      	* sem_util.adb (New_Copy_Tree, Visit_Entity): A quantified
      	expression includes the implicit declaration of the loop
      	parameter. When a quantified expression is copied during
      	expansion, for example when building the precondition code from
      	the generated pragma, a new loop parameter must be created for
      	the new tree, to prevent duplicate declarations for the same
      	symbol.
      
      gcc/testsuite/
      
      	* gnat.dg/predicate12.adb, gnat.dg/predicate12.ads: New
      	testcase.
      
      From-SVN: r274449
      Ed Schonberg committed
    • [Ada] Fix failing assertions on SPARK elaboration · bab15911
      Checking of SPARK elaboration rules may lead to assertion failures on a
      compiler built with assertions. Now fixed.
      
      There is no impact on compilation.
      
      2019-08-14  Yannick Moy  <moy@adacore.com>
      
      gcc/ada/
      
      	* sem_disp.adb (Check_Dispatching_Operation): Update assertion
      	for the separate declarations created in GNATprove mode.
      	* sem_disp.ads (Is_Overriding_Subprogram): Update comment.
      	* sem_elab.adb (SPARK_Processor): Fix test for checking of
      	overriding primitives.
      
      From-SVN: r274448
      Yannick Moy committed
    • [Ada] Small internal improvements to the inlining machinery · 4a6db9fd
      No functional changes.
      
      2019-08-14  Eric Botcazou  <ebotcazou@adacore.com>
      
      gcc/ada/
      
      	* inline.adb (Add_Inlined_Body): Tweak comments.
      	(List_Inlining_Info): Also list information about non-main
      	units.
      
      From-SVN: r274447
      Eric Botcazou committed
    • [Ada] Illegal selection of first object in a task type's body not detected · 27de857e
      The compiler was improperly allowing selection of an object declared
      within a task body when the prefix was of the task type, specifically in
      the case where the object was the very first declared in the body
      (selections of later body declarations were being flagged).  The flag
      Is_Private_Op was only set at the point of the first "private"
      declaration of the type in cases where the first declaration's name
      didn't match the selector.
      
      2019-08-14  Gary Dismukes  <dismukes@adacore.com>
      
      gcc/ada/
      
      	* sem_ch4.adb (Analyze_Selected_Component): In the case where
      	the prefix is of a concurrent type, and the selected entity
      	matching the selector is the first private declaration of the
      	type (such as the first local variable in a task's body), set
      	Is_Private_Op.
      
      gcc/testsuite/
      
      	* gnat.dg/task5.adb: New testcase.
      
      From-SVN: r274446
      Gary Dismukes committed
    • [Ada] Minor refactoring in Einfo · bc1f44ef
      2019-08-14  Piotr Trojanek  <trojanek@adacore.com>
      
      gcc/ada/
      
      	* einfo.adb (Is_Generic_Actual_Subprogram): Replace repeated
      	calls to Ekind with Ekind_In.
      
      From-SVN: r274445
      Piotr Trojanek committed
    • re PR testsuite/91419 (gcc.dg/tree-ssa/pr91091-2.c, ssa-fre-61.c, ssa-fre-61.c with r273232) · f78fac4b
      2019-08-14  Richard Biener  <rguenther@suse.de>
      
      	PR testsuite/91419
      	* lib/target-supports.exp (natural_alignment_32): Amend target
      	list based on BIGGEST_ALIGNMENT.
      	(natural_alignment_64): Targets not natural_alignment_32 cannot
      	be natural_alignment_64.
      	* gcc.dg/tree-ssa/pr91091-2.c: XFAIL for !natural_alignment_32.
      	* gcc.dg/tree-ssa/ssa-fre-77.c: Likewise.
      	* gcc.dg/tree-ssa/ssa-fre-61.c: Require natural_alignment_32.
      
      From-SVN: r274444
      Richard Biener committed
    • [AArch64] Add support for SVE absolute comparisons · 42b4e87d
      This patch adds support for floating-point absolute comparisons
      FACLT and FACLE (aliased as FACGT and FACGE with swapped operands).
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/iterators.md (SVE_COND_FP_ABS_CMP): New iterator.
      	* config/aarch64/aarch64-sve.md (*aarch64_pred_fac<cmp_op><mode>):
      	New pattern.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/vcond_21.c: New test.
      	* gcc.target/aarch64/sve/vcond_21_run.c: Likewise.
      
      From-SVN: r274443
      Richard Sandiford committed
    • [AArch64] Use SVE MOV /M of scalars · 88a37c4d
      This patch uses MOV /M to optimise selects between a duplicated
      scalar variable and a vector.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64-sve.md (*aarch64_sel_dup<mode>): New pattern.
      
      gcc/testsuite/
      	* g++.target/aarch64/sve/dup_sel_1.C: New test.
      	* g++.target/aarch64/sve/dup_sel_2.C: Likewise.
      	* g++.target/aarch64/sve/dup_sel_3.C: Likewise.
      	* g++.target/aarch64/sve/dup_sel_4.C: Likewise.
      	* g++.target/aarch64/sve/dup_sel_5.C: Likewise.
      	* g++.target/aarch64/sve/dup_sel_6.C: Likewise.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274442
      Richard Sandiford committed
    • [AArch64] Make more use of SVE conditional constant moves · d29f7dd5
      This patch extends the SVE UNSPEC_SEL patterns so that they can use:
      
      (1) MOV /M of a duplicated integer constant
      (2) MOV /M of a duplicated floating-point constant bitcast to an integer,
          accepting the same constants as (1)
      (3) FMOV /M of a duplicated floating-point constant
      (4) MOV /Z of a duplicated integer constant
      (5) MOV /Z of a duplicated floating-point constant bitcast to an integer,
          accepting the same constants as (4)
      (6) MOVPRFXed FMOV /M of a duplicated floating-point constant
      
      We already handled (4) with a special pattern; the rest are new.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      	    Kugan Vivekanandarajah  <kugan.vivekanandarajah@linaro.org>
      
      gcc/
      	* config/aarch64/aarch64.c (aarch64_bit_representation): New function.
      	(aarch64_print_vector_float_operand): Also handle 8-bit floats.
      	(aarch64_print_operand): Add support for %I.
      	(aarch64_sve_dup_immediate_p): Handle scalars as well as vectors.
      	Bitcast floating-point constants to the corresponding integer constant.
      	(aarch64_float_const_representable_p): Handle vectors as well
      	as scalars.
      	(aarch64_expand_sve_vcond): Make sure that the operands are valid
      	for the new vcond_mask_<mode><vpred> expander.
      	* config/aarch64/predicates.md (aarch64_sve_dup_immediate): Also
      	test aarch64_float_const_representable_p.
      	(aarch64_sve_reg_or_dup_imm): New predicate.
      	* config/aarch64/aarch64-sve.md (vec_extract<vpred><Vel>): Use
      	gen_vcond_mask_<mode><vpred> instead of
      	gen_aarch64_sve_dup<mode>_const.
      	(vcond_mask_<mode><vpred>): Turn into a define_expand that
      	accepts aarch64_sve_reg_or_dup_imm and aarch64_simd_reg_or_zero
      	for operands 1 and 2 respectively.  Force operand 2 into a
      	register if operand 1 is a register.  Fold old define_insn...
      	(aarch64_sve_dup<mode>_const): ...and this define_insn...
      	(*vcond_mask_<mode><vpred>): ...into this new pattern.  Handle
      	floating-point constants that can be moved as integers.  Add
      	alternatives for MOV /M and FMOV /M.
      	(vcond<mode><v_int_equiv>, vcondu<mode><v_int_equiv>)
      	(vcond<mode><v_fp_equiv>): Accept nonmemory_operand for operands
      	1 and 2 respectively.
      	* config/aarch64/constraints.md (Ufc): Handle vectors as well
      	as scalars.
      	(vss): New constraint.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/vcond_18.c: New test.
      	* gcc.target/aarch64/sve/vcond_18_run.c: Likewise.
      	* gcc.target/aarch64/sve/vcond_19.c: Likewise.
      	* gcc.target/aarch64/sve/vcond_19_run.c: Likewise.
      	* gcc.target/aarch64/sve/vcond_20.c: Likewise.
      	* gcc.target/aarch64/sve/vcond_20_run.c: Likewise.
      
      Co-Authored-By: Kugan Vivekanandarajah <kuganv@linaro.org>
      
      From-SVN: r274441
      Richard Sandiford committed
    • [AArch64] Add support for SVE F{MAX,MIN}NM immediate · 75079ddf
      This patch uses the immediate forms of FMAXNM and FMINNM for
      unconditional arithmetic.
      
      The same rules apply to FMAX and FMIN, but we only generate those
      via the ACLE.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/predicates.md (aarch64_sve_float_maxmin_immediate)
      	(aarch64_sve_float_maxmin_operand): New predicates.
      	* config/aarch64/constraints.md (vsB): New constraint.
      	(vsM): Fix typo.
      	* config/aarch64/iterators.md (sve_pred_fp_rhs2_operand): Use
      	aarch64_sve_float_maxmin_operand for UNSPEC_COND_FMAXNM and
      	UNSPEC_COND_FMINNM.
      	* config/aarch64/aarch64-sve.md (<maxmin_uns><SVE_F:mode>3):
      	Use aarch64_sve_float_maxmin_operand for operand 2.
      	(*<SVE_COND_FP_MAXMIN_PUBLIC:optab><SVE_F:mode>3): Likewise.
      	Add alternatives for the constant forms.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/fmaxnm_1.c: New test.
      	* gcc.target/aarch64/sve/fminnm_1.c: Likewise.
      
      From-SVN: r274440
      Richard Sandiford committed
    • [AArch64] Add support for SVE [SU]{MAX,MIN} immediate · f8c22a8b
      This patch adds support for the immediate forms of SVE SMAX, SMIN, UMAX
      and UMIN.  SMAX and SMIN take the same range as MUL, so the patch
      basically just moves and generalises the existing MUL patterns.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/constraints.md (vsb): New constraint.
      	(vsm): Generalize description.
      	* config/aarch64/iterators.md (SVE_INT_BINARY_IMM): New code
      	iterator.
      	(sve_imm_con): Handle smax, smin, umax and umin.
      	(sve_imm_prefix): New code attribute.
      	* config/aarch64/predicates.md (aarch64_sve_vsb_immediate)
      	(aarch64_sve_vsb_operand): New predicates.
      	(aarch64_sve_mul_immediate): Rename to...
      	(aarch64_sve_vsm_immediate): ...this.
      	(aarch64_sve_mul_operand): Rename to...
      	(aarch64_sve_vsm_operand): ...this.
      	* config/aarch64/aarch64-sve.md (mul<mode>3): Generalize to...
      	(<SVE_INT_BINARY_IMM:optab><SVE_I:mode>3): ...this.
      	(*mul<mode>3, *post_ra_mul<mode>3): Generalize to...
      	(*<SVE_INT_BINARY_IMM:optab><SVE_I:mode>3)
      	(*post_ra_<SVE_INT_BINARY_IMM:optab><SVE_I:mode>3): ...these and
      	add movprfx support for the immediate alternatives.
      	(<su><maxmin><mode>3, *<su><maxmin><mode>3): Delete in favor
      	of the above.
      	(*<SVE_INT_BINARY_SD:optab><SVE_SDI:mode>3): Fix incorrect predicate
      	for operand 3.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/smax_1.c: New test.
      	* gcc.target/aarch64/sve/smin_1.c: Likewise.
      	* gcc.target/aarch64/sve/umax_1.c: Likewise.
      	* gcc.target/aarch64/sve/umin_1.c: Likewise.
      
      From-SVN: r274439
      Richard Sandiford committed
    • [AArch64] Add support for SVE CNOT · e0a0be93
      This patch adds support for predicated and unpredicated CNOT
      (logical NOT on integers).  In RTL terms, this is a select between
      1 and 0 in which the predicate is fed by a comparison with zero.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/predicates.md (aarch64_simd_imm_one): New predicate.
      	* config/aarch64/aarch64-sve.md (*cnot<mode>): New pattern.
      	(*cond_cnot<mode>_2, *cond_cnot<mode>_any): Likewise.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/cnot_1.c: New test.
      	* gcc.target/aarch64/sve/cond_cnot_1.c: Likewise.
      	* gcc.target/aarch64/sve/cond_cnot_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_cnot_2.c: Likewise.
      	* gcc.target/aarch64/sve/cond_cnot_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/cond_cnot_3.c: Likewise.
      	* gcc.target/aarch64/sve/cond_cnot_3_run.c: Likewise.
      
      From-SVN: r274438
      Richard Sandiford committed
    • [AArch64] Add support for SVE CLS and CLZ · bca5a997
      This patch adds support for unpredicated SVE CLS and CLZ.  A later patch
      will add support for predicated unary integer arithmetic.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/iterators.md (SVE_INT_UNARY): Add clrsb and clz.
      	(optab, sve_int_op): Handle them.
      	* config/aarch64/aarch64-sve.md: Expand comment.
      
      gcc/testsuite/
      	* gcc.target/aarch64/vect-clz.c: Force SVE off.
      	* gcc.target/aarch64/sve/clrsb_1.c: New test.
      	* gcc.target/aarch64/sve/clrsb_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/clz_1.c: Likewise.
      	* gcc.target/aarch64/sve/clz_1_run.c: Likewise.
      
      From-SVN: r274437
      Richard Sandiford committed
    • [AArch64] Use SVE ADR to optimise shift-add sequences · a229966c
      This patch uses SVE ADR to optimise shift-and-add and uxtw-and-add
      sequences.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/predicates.md (const_1_to_3_operand): New predicate.
      	* config/aarch64/aarch64-sve.md (*aarch64_adr_uxtw)
      	(*aarch64_adr<mode>_shift, *aarch64_adr_shift_uxtw): New patterns.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/adr_1.c: New test.
      	* gcc.target/aarch64/sve/adr_1_run.c: Likewise.
      	* gcc.target/aarch64/sve/adr_2.c: Likewise.
      	* gcc.target/aarch64/sve/adr_2_run.c: Likewise.
      	* gcc.target/aarch64/sve/adr_3.c: Likewise.
      	* gcc.target/aarch64/sve/adr_3_run.c: Likewise.
      	* gcc.target/aarch64/sve/adr_4.c: Likewise.
      	* gcc.target/aarch64/sve/adr_4_run.c: Likewise.
      	* gcc.target/aarch64/sve/adr_5.c: Likewise.
      	* gcc.target/aarch64/sve/adr_5_run.c: Likewise.
      
      From-SVN: r274436
      Richard Sandiford committed
    • decl.c (grokdeclarator): Use id_loc and EXPR_LOCATION in a few error messages. · 917d611c
      /cp
      2019-08-08  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* decl.c (grokdeclarator): Use id_loc and EXPR_LOCATION in
      	a few error messages.
      
      /testsuite
      2019-08-08  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* g++.dg/cpp0x/enum20.C: Test location(s) too.
      	* g++.dg/other/friend3.C: Likewise.
      	* g++.dg/parse/dtor5.C: Likewise.
      	* g++.dg/parse/friend7.C: Likewise.
      	* g++.dg/template/error22.C: Likewise.
      	* g++.old-deja/g++.brendan/err-msg5.C: Likewise.
      
      From-SVN: r274435
      Paolo Carlini committed
    • [AArch64] Handle more SVE predicate constants · 2803bc3b
      This patch handles more predicate constants by using TRN1, TRN2
      and EOR.  For now, only one operation is allowed before we fall
      back to loading from memory or doing an integer move and a compare.
      The EOR support includes the important special case of an inverted
      predicate.
      
      The real motivating case for this is the ACLE svdupq function,
      which allows a repeating 16-bit predicate to be built from
      individual scalar booleans.  It's not easy to test properly
      before that support is merged.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64.c (aarch64_expand_sve_const_pred_eor)
      	(aarch64_expand_sve_const_pred_trn): New functions.
      	(aarch64_expand_sve_const_pred_1): Add a recurse_p parameter and
      	use the above functions when the parameter is true.
      	(aarch64_expand_sve_const_pred): Update call accordingly.
      	* config/aarch64/aarch64-sve.md (*aarch64_sve_<perm_insn><mode>):
      	Rename to...
      	(@aarch64_sve_<perm_insn><mode>): ...this.
      
      gcc/testsuite/
      	* gcc.target/aarch64/sve/peel_ind_1.c: Look for an inverted .B VL1.
      	* gcc.target/aarch64/sve/peel_ind_2.c: Likewise .S VL7.
      
      From-SVN: r274434
      Richard Sandiford committed
    • decl.c (grokdeclarator): Check here for typedef a function definition or a… · df4ac85f
      decl.c (grokdeclarator): Check here for typedef a function definition or a member function definition.
      
      /cp
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* decl.c (grokdeclarator): Check here for typedef a function
      	definition or a member function definition.
      	(start_function): Adjust.
      	(grokmethod): Likewise.
      
      /testsuite
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* g++.dg/parse/typedef9.C: Test locations too.
      
      From-SVN: r274433
      Paolo Carlini committed
    • decl.c (grokdeclarator): Check here for typedef a function definition or a… · f59d2b42
      decl.c (grokdeclarator): Check here for typedef a function definition or a member function definition.
      
      /cp
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* decl.c (grokdeclarator): Check here for typedef a function
      	definition or a member function definition.
      	(start_function): Adjust.
      	(grokmethod): Likewise.
      
      /testsuite
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* g++.dg/parse/typedef9.C: Test locations too.
      
      From-SVN: r274432
      Paolo Carlini committed
    • decl.c (grokdeclarator): Check here for typedef a function definition or a… · 777e4267
      decl.c (grokdeclarator): Check here for typedef a function definition or a member function definition.
      
      /cp
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* decl.c (grokdeclarator): Check here for typedef a function
      	definition or a member function definition.
      	(start_function): Adjust.
      	(grokmethod): Likewise.
      
      /testsuite
      2019-08-14  Paolo Carlini  <paolo.carlini@oracle.com>
      
      	* g++.dg/parse/typedef9.C: Test locations too.
      
      From-SVN: r274431
      Paolo Carlini committed
    • Refresh LOCAL_PATCHES · e2723123
      2019-08-14  Martin Liska  <mliska@suse.cz>
      
      	* LOCAL_PATCHES: Refresh based on what was committed.
      
      From-SVN: r274430
      Martin Liska committed
    • [AArch64] Rework SVE integer comparisons · 00fa90d9
      The remaining uses of UNSPEC_MERGE_PTRUE were in integer comparison
      patterns.  These aren't actually merging operations but zeroing ones,
      although there's no practical difference when the predicate is a PTRUE.
      
      All comparisons produced by expand are predicated on a PTRUE,
      although we try to pattern-match a compare-and-AND as a predicated
      comparison during combine.
      
      Like previous patches, this one rearranges things in a way that works
      better with the ACLE, where the initial predicate might or might not
      be a PTRUE.  The new patterns use UNSPEC_PRED_Z to represent zeroing
      predication, with a aarch64_sve_ptrue_flag to record whether the
      predicate is all-true (as for UNSPEC_PTEST).
      
      See the block comment in the patch for more details.
      
      2019-08-14  Richard Sandiford  <richard.sandiford@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-protos.h (aarch64_sve_same_pred_for_ptest_p):
      	Declare.
      	* config/aarch64/aarch64.c (aarch64_sve_same_pred_for_ptest_p)
      	(aarch64_sve_emit_int_cmp): New functions.
      	(aarch64_convert_sve_data_to_pred): Use aarch64_sve_emit_int_cmp.
      	(aarch64_sve_cmp_operand_p, aarch64_emit_sve_ptrue_op_cc): Delete.
      	(aarch64_expand_sve_vec_cmp_int): Use aarch64_sve_emit_int_cmp.
      	* config/aarch64/aarch64.md (UNSPEC_MERGE_PTRUE): Delete.
      	(UNSPEC_PRED_Z): New unspec.
      	(set_clobber_cc_nzc): Delete.
      	* config/aarch64/aarch64-sve.md: Add a block comment about
      	UNSPEC_PRED_Z.
      	(*cmp<SVE_INT_CMP:cmp_op><mode>): Rename to...
      	(@aarch64_pred_cmp<SVE_INT_CMP:cmp_op><mode>): ...this, replacing
      	the old pattern with that name.  Use UNSPEC_PRED_Z instead of
      	UNSPEC_MERGE_PTRUE.
      	(*cmp<SVE_INT_CMP:cmp_op><mode>_cc): Use UNSPEC_PRED_Z instead of
      	UNSPEC_MERGE_PTRUE.  Use aarch64_sve_same_pred_for_ptest_p to
      	check for compatible predicates.
      	(*cmp<cmp_op><SVE_INT_CMP:mode>_ptest): Likewise.
      	(*cmp<cmp_op><mode>_and): Match a known-ptrue UNSPEC_PRED_Z instead
      	of UNSPEC_MERGE_PTRUE.  Split into the new form of predicated
      	comparisons above.
      
      From-SVN: r274429
      Richard Sandiford committed
    • Fix a test-case scan pattern. · 052f7399
      2019-08-14  Martin Liska  <mliska@suse.cz>
      
      	* c-c++-common/asan/memcmp-1.c: There's a new function in the
      	stack-trace on the top.  So shift expected output in stack
      	trace.
      
      From-SVN: r274428
      Martin Liska committed
    • Reapply all revisions mentioned in LOCAL_PATCHES. · 47f0255f
      2019-08-14  Martin Liska  <mliska@suse.cz>
      
      	* asan/asan_globals.cpp (CheckODRViolationViaIndicator): Reapply
      	patch from trunk.
      	(CheckODRViolationViaPoisoning): Likewise.
      	(RegisterGlobal): Likewise.
      	* asan/asan_mapping.h: Likewise.
      	* sanitizer_common/sanitizer_linux_libcdep.cpp (defined): Likewise.
      	* sanitizer_common/sanitizer_mac.cpp (defined): Likewise.
      	* sanitizer_common/sanitizer_platform_limits_linux.cpp (defined): Likewise.
      	* sanitizer_common/sanitizer_platform_limits_posix.h (defined): Likewise.
      	* sanitizer_common/sanitizer_stacktrace.cpp (GetCanonicFrame): Likewise.
      	* ubsan/ubsan_handlers.cpp (__ubsan::__ubsan_handle_cfi_bad_icall): Likewise.
      	(__ubsan::__ubsan_handle_cfi_bad_icall_abort): Likewise.
      	* ubsan/ubsan_handlers.h (struct CFIBadIcallData): Likewise.
      	(struct CFICheckFailData): Likewise.
      	(RECOVERABLE): Likewise.
      	* ubsan/ubsan_platform.h: Likewise.
      
      From-SVN: r274427
      Martin Liska committed