aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
12 daysada: Nested use_type_clause with "all" cancels use_type_clause with wider scopeGary Dismukes1-1/+9
The compiler mishandles nested use_type_clauses in the case where the outer one is a normal use_type_clause and the inner one has "all". Upon leaving the scope of the inner use_type_clause, the outer one is effectively disabled, because it's not considered redundant (and in fact it's only partially redundant). This is fixed by testing for the presence of a use_type_clause for the same type that has a wider scope when ending the inner use_type_clause. gcc/ada/ChangeLog: * sem_ch8.adb (End_Use_Type): Add a test for there not being an earlier use_type_clause for the same type as an additional criterion for turning off In_Use and Current_Use_Clause.
12 daysada: Only fold array attributes in SPARK when prefix is safe to evaluatePiotr Trojanek1-0/+42
Fix missing checks for prefixes of array attributes in GNATprove mode. gcc/ada/ChangeLog: * sem_attr.adb (Eval_Attribute): Only fold array attributes when prefix is static or at least safe to evaluate
12 daysada: Fix minor issues in commentsRonan Desplanques2-6/+6
gcc/ada/ChangeLog: * einfo.ads (Is_Controlled_Active): Fix pasto in comment. * sem_util.ads (Propagate_Controlled_Flags): Update comment for Destructor aspect.
12 daysada: Add destructors extensionRonan Desplanques12-97/+478
This patch adds a GNAT-specific extension which enables "destructors". Destructors are an optional replacement for Ada.Finalization where some aspects of the interaction with type derivation are different. gcc/ada/ChangeLog: * doc/gnat_rm/gnat_language_extensions.rst: Document new extension. * snames.ads-tmpl: Add name for new aspect. * gen_il-fields.ads (Has_Destructor, Is_Destructor): Add new fields. * gen_il-gen-gen_entities.adb (E_Procedure, Type_Kind): Add new fields. * einfo.ads (Has_Destructor, Is_Destructor): Document new fields. * aspects.ads: Add new aspect. * sem_ch13.adb (Analyze_Aspect_Specifications, Check_Aspect_At_Freeze_Point, Check_Aspect_At_End_Of_Declarations): Add semantic analysis for new aspect. (Resolve_Finalization_Procedure): New function. (Resolve_Finalizable_Argument): Use new function above. * sem_util.adb (Propagate_Controlled_Flags): Extend for new field. * freeze.adb (Freeze_Entity): Add legality check for new aspect. * exp_ch3.adb (Expand_Freeze_Record_Type, Predefined_Primitive_Bodies): Use new field. * exp_ch7.adb (Build_Finalize_Statements): Add expansion for destructors. (Make_Final_Call, Build_Record_Deep_Procs): Adapt to new Has_Destructor field. (Build_Adjust_Statements): Tweak to handle cases of empty lists. * gnat_rm.texi: Regenerate.
12 daysada: Fix crash when creating extra formals for aliased typesDenis Mazzucato1-3/+4
This patch makes sure that we return the same decision for all aliased types when checking if the BIP task extra actuals are needed. gcc/ada/ChangeLog: * sem_ch6.adb (Might_Need_BIP_Task_Actuals): Before retrieving the original corresponding operation we retrieve first the root of the aliased chain.
12 daysada: Fix generation of Initialize and Adjust callsRonan Desplanques6-37/+36
Before this patch, Make_Init_Call and Make_Adjust_Call made the assumption that if the type they were called with was untagged and a derived type, it was the untagged private view of a tagged type. That assumption made it possible to inspect the root type's primitives to handle the case where the underlying type was implicitly generated by the compiler without all inherited primitives. The introduction of the Finalizable aspect broke that assumption, so this patch adds a new field to type entities that make the generated full view stand out, and updates Make_Init_Call and Make_Adjust_Call to only jump to the root type when they're passed one of those generated types. Make_Final_Call and Finalize_Address are two other subprograms that perform the same test on the types they're passed. They did not suffer from the same bug as Make_Init_Call and Make_Adjust_Call because of an earlier, more ad hoc fix, but this patch switches them over to the newly introduced mechanism for the sake of consistency. gcc/ada/ChangeLog: * gen_il-fields.ads (Is_Implicit_Full_View): New field. * gen_il-gen-gen_entities.adb (Type_Kind): Use new field. * einfo.ads (Is_Implicit_Full_View): Document new field. * exp_ch7.adb (Make_Adjust_Call, Make_Init_Call, Make_Final_Call): Use new field. * exp_util.adb (Finalize_Address): Likewise. * sem_ch3.adb (Copy_And_Build): Set new field.
12 daysada: Remove obsolete code from Safe_Unchecked_Type_ConversionEric Botcazou2-45/+0
That's a kludge added to work around the limitations of the stack checking mechanism used in the early days. gcc/ada/ChangeLog: * exp_util.ads (May_Generate_Large_Temp): Delete. * exp_util.adb (May_Generate_Large_Temp): Likewise. (Safe_Unchecked_Type_Conversion): Do not take stack checking into account to compute the result.
12 daysada: Wrong dispatch on result in presence of dependent expressionJavier Miranda8-43/+127
The compiler generates wrong code in a dispatching call on result when the call is performed under dependent conditional expressions or case-expressions. gcc/ada/ChangeLog: * sinfo.ads (Is_Expanded_Dispatching_Call): New flag. (Tag_Propagated): New flag. * exp_ch6.adb (Expand_Call_Helper): Propagate the tag when the dispatching call is placed in conditionl expressions or case-expressions. * sem_ch5.adb (Analyze_Assignment): For assignment of tag- indeterminate expression, do not propagate the tag if previously done. * sem_disp.adb (Is_Tag_Indeterminate): Add missing support for conditional expression and case expression. * exp_disp.ads (Is_Expanded_Dispatching_Call): Removed. Function replaced by a new flag in the nodes. * exp_disp.adb (Expand_Dispatching_Call): Set a flag in the call node to remember that the call has been expanded. (Is_Expanded_Dispatching_Call): Function removed. * gen_il-fields.ads (Tag_Propagated): New flag. (Is_Expanded_Dispatching_Call): New flag. * gen_il-gen-gen_nodes.adb (Tag_Propagated): New flag. (Is_Expanded_Dispatching_Call): New flag.
12 daysada: Additional condition for Capacity discriminant on bounded container ↵Gary Dismukes3-17/+29
aggregates This change test an additional condition as part of the criteria used for deciding whether to generate a call to a container type's Length function (for passing to the Empty function) when determining the size of the object to allocate for a bounded container aggregate with a "for of" iterator. An update is also made to function Empty in Ada.Containers.Bounded_Hash_Maps, adding a default to the formal Capacity, to make it consistent with other bounded containers (and to make it conformant with the Ada RM). gcc/ada/ChangeLog: * libgnat/a-cbhama.ads (Empty): Add missing default to Capacity formal. * libgnat/a-cbhama.adb (Empty): Add missing default to Capacity formal. * exp_aggr.adb (Build_Size_Expr): Test for presence of Capacity discriminant as additional criterion for generating the call to the Length function. Update comments.
12 daysada: Fix assertion failure on aggregate with controlled componentEric Botcazou1-9/+4
The assertion is: pragma Assert (Side_Effect_Free (L)); in Make_Tag_Ctrl_Assignment and demonstrates that the sequence: Remove_Side_Effects (L); pragma Assert (Side_Effect_Free (L)); does not hold in this case. What happens is that Remove_Side_Effects uses a renaming to remove the side effects of L but, at the end, the renamed object is substituted back for the renamed object in the node by Expand_Renaming, which is invoked because the Is_Renaming_Of_Object flag is set on the renaming after Evaluate_Name has been invoked on its Name. This is a general discrepancy between Evaluate_Name and Side_Effect_Free of Exp_Util, coming from the call to Safe_Unchecked_Type_Conversion present in Side_Effect_Free in this case. The long term goal is probably to remove the call but, in the meantime, this change is sufficient to fix the failure. gcc/ada/ChangeLog: * exp_util.adb (Safe_Unchecked_Type_Conversion): Always return True if the expression is the prefix of an N_Selected_Component.
12 daysada: Fix unnecessary extra RE_Activation_Chain_Access with No_Task_PartsDenis Mazzucato6-15/+45
This patch checks the presence of No_Task_Parts on any ancestor or inherited interface, not only its root type, since No_Task_Parts prohibits tasking for any of its descendant. In case the current subprogram is overridden/inherited, we need to return the same value we would return for the original corresponding operation. The aspect No_Task_Parts is nonoverridable and applies also when specified in a partial view. gcc/ada/ChangeLog: * sem_ch6.adb (Might_Need_BIP_Task_Actuals): Check whether No_Task_Parts is enabled in any of the derived types, or interfaces, from the user-defined primitive return type. * sem_ch13.adb (Analyze_Aspect_Specifications): Add No_Task_Parts and No_Controlled_Parts to the representation chain to be visible in the full view of private types. * aspects.ads (Nonoverridable_Aspect_Id): As per GNAT RM, No_Task_Parts is nonoverridable. * sem_util.adb (Check_Inherited_Nonoverridable_Aspects): Likewise. * sem_util.ads: Fix typo and style. * sem_disp.adb: Missing comment.
12 daysada: Adding support to defer the addition of extra formalsJavier Miranda20-563/+1621
Add support to create the extra formals when the underlying type of some formal type or return type of a subprogram, subprogram type or entry is not available when the entity is frozen. For example, when a function that returns a private type is frozen before the full-view of its private type is analyzed. gcc/ada/ChangeLog: * einfo.ads (Extra_Formals): Complete documentation. (Has_First_Controlling_Parameter_Aspect): Place it in alphabetical order. (Has_Frozen_Extra_Formals): New attribute. * gen_il-fields.ads (Has_Frozen_Extra_Formals): New entity field. * gen_il-gen-gen_entities.adb (Has_Frozen_Extra_Formals): Adding new entity flag to subprograms, subprogram types, and and entries. * gen_il-internals.adb (Image): Adding Has_Frozen_Extra_Formals. * exp_ch3.adb (Build_Array_Init_Proc): Freeze its extra formals. (Build_Init_Procedure): Freeze its extra formals. (Expand_Freeze_Record_Type): For tagged types with foreign convention create the extra formals of primitives with convention Ada. * exp_ch6.ads (Create_Extra_Actuals): New subprogram. * exp_ch6.adb (Check_BIP_Actuals): Adding assertions. (Create_Extra_Actuals): New subprogram that factorizes code from Expand_Call_Helper. (Expand_Call_Helper): Adding support to defer the addition of extra actuals. Move the code that adds the extra actuals to a new subprogram. (Is_Unchecked_Union_Equality): Renamed as Is_Unchecked_Union_Predefined_ Equality_Call. * exp_ch7.adb (Create_Finalizer): Freeze its extra formals. (Wrap_Transient_Expression): Link the temporary with its relocated expression to facilitate locating the expression in the expanded code. * exp_ch9.ads (Expand_N_Entry_Declaration): Adding one formal. * exp_ch9.adb (Expand_N_Entry_Declaration): Defer the expansion of the entry if the extra formals are not available; analyze the built declarations for the record type that holds all the parameters if the expansion of the entry declaration was deferred. * exp_disp.adb (Expand_Dispatching_Call): Handle deferred extra formals. (Set_CPP_Constructors): Freeze its extra formals. * freeze.adb (Freeze_Entity): Create the extra actuals of acccess to subprograms whose designated type is a subprogram type. (Freeze_Subprogram): Adjust assertion to support deferred extra formals, and freeze extra formals of non-dispatching subprograms with foreign convention. Added assertion to check matching of formals in thunks. * sem_aux.adb (Get_Called_Entity): Adding documentation. * sem_ch3.adb (Analyze_Full_Type_Declaration): Create the extra formals of deferred subprograms, subprogram types and entries; create also the extra actuals of deferred calls. * sem_ch6.ads (Freeze_Extra_Formals): New subprogram. (Deferred_Extra_Formals_Support): New package. * sem_ch6.adb (Analyze_Subprogram_Body_Helper): Create the extra formals of subprograms without separate spec. (Add_Extra_Formal): Add documentation. (Has_Extra_Formals): Removed. (Parent_Subprogram): Adding documentation. (Create_Extra_Formals): Defer adding extra formals if the underlying_type of some formal type or return type is not available. (Extra_Formals_Match_OK): Add missing check on the extra formals of unchecked unions. (Freeze_Extra_Formals): New subprogram. (Deferred_Extra_Formals_Support): New package. * sem_ch9.adb (Analyze_Entry_Declaration): Freeze its extra formals. * sem_ch13.adb (New_Put_Image_Subprogram): ditto. * sem_util.ads (Is_Unchecked_Union_Equality): New subprogram. * sem_util.adb (Is_Unchecked_Union_Equality): ditto.
12 daysada: Tune recent change for bit-packed arrays to help GNATprove backendPiotr Trojanek1-1/+1
When GNAT is operating in GNATprove_Mode the Expander_Active flag is disabled, but we still must do things that ordinary backends expect. gcc/ada/ChangeLog: * sem_util.adb (Get_Actual_Subtype): Do the same for GCC and GNATprove backends.
12 daysada: Expand continue procedure calls for GNATproveMartin Clochard1-0/+24
Continue being a non-reserved keyword, occurrences of continue may be resolved as procedure calls. Get that special case out of the way for GNATprove, in anticipation of support for continue keyword. gcc/ada/ChangeLog: * exp_spark.adb (Expand_SPARK): Add expansion of continue statements. (Expand_SPARK_N_Continue_Statement): Expand continue statements resolved as procedure calls into said procedure calls.
12 daysada: Tune check for restriction No_Relative_Delay and call to Set_HandlerPiotr Trojanek1-1/+3
When checking restriction No_Relative_Delay and detecting calls to Ada.Real_Time.Timing_Events.Set_Handler with a Time_Span parameter, we looked at the exact type of the actual parameter, while we should look at its base type. This patch looks at the type of actual parameter like it is done in Expand_N_Delay_Until_Statement. gcc/ada/ChangeLog: * sem_res.adb (Resolve_Call): Look at the base type of actual parameter when checking call to Set_Handler.
12 daysada: Fix wrong indirect access to bit-packed array in iterated loopEric Botcazou1-39/+21
This comes from a missing expansion of the bit-packed array reference in the loop, because the actual subtype created for the dereference lacks a Packed_Array_Impl_Type as it is ultimately created by the Preanalyze_Range call present in Analyze_Loop_Statement. gcc/ada/ChangeLog: * sem_util.adb (Get_Actual_Subtype): Only create a new subtype when the expander is active. Remove a useless test of type inequality, as well as a useless call to Set_Has_Delayed_Freeze on the subtype.
12 daysada: Replace "not Present" test with "No" testGary Dismukes1-2/+1
Minor change to satisfy GNAT SAS checker. gcc/ada/ChangeLog: * exp_aggr.adb (Build_Size_Expr): Change test of "not Present (...)" to "No (...)".
12 daysada: Capacity determination for container aggregate with container iteratorGary Dismukes1-5/+87
In the case of a container aggregate that has a container_element_association given by an iterator_specification that iterates over a container object (for example, "[for E of V => E]"), the compiler will now determine the number of elements in the object and can use that in determining the capacity value to be passed to the container type's Empty function when allocating space for the aggregate object. This implementation-dependent behavior is allowed by RM22 4.3.5(40/5). Prior to this enhancement, the compiler would generally use the Empty function's default value for the Capacity parameter (a value of just 10 in the current implementation of the predefined containers), which could easily lead to Capacity_Error being raised for the aggregate. Note that this is only done for aggregates of container types coming from instantiations of the predefined container generics, and not for user-defined container types (due to the special knowledge the compiler has of the availability of Length functions for the predefined types). Also, it currently only applies when the object V being iterated over is a simple object, and is not done for more complex cases, such as when V is a function call. gcc/ada/ChangeLog: * exp_aggr.adb (Build_Size_Expr): Determine the length of a container aggregate association in the case where it's an iteration over an object of a container type coming from an instantiation of a predefined container generic. Minor updates to existing comments.
12 daysada: exp_util.adb: prevent infinite loop in case of broken codeGhjuvan Lacambre1-2/+7
A recent commit modified exp_util.adb in order to fix the selection of Finalize subprograms in the case of untagged objects. This introduced regressions for GNATSAS in fixedbugs by causing GNAT2SCIL to loop over the same type over and over in case of broken code. We fix this by simply checking that the loop is making progress, and if it doesn't, assume that we're done. gcc/ada/ChangeLog: * exp_util.adb (Finalize_Address): Prevent infinite loop
12 daysada: Add Unique_Component_Name function for use by CCG.Steve Baird2-1/+89
Define a new function which, initially, is never called. It is intended to be called from CCG. If an Ada tagged record type has a component named Foo, then the generated corresponding C struct might have a component with the same name. This approach almost works, but breaks down in the (rare) case of an Ada record type where two or more components have the same name (this is normally illegal, but is possible in the case of an extension where some component of the parent type is not visible at the point of the extension). This new function is intended for use in coping with this case. gcc/ada/ChangeLog: * sem_aux.ads: Declare new function Unique_Component_Name. * sem_aux.adb: Implement new function Unique_Component_Name.
12 daysada: Ensure Expression_Copy has a parent before analysisViljar Indus1-7/+7
Some analysis requires going up the parent chain to get the relevant context. Ensure that is done for the Expression_Copy node which is not a syntactic node. gcc/ada/ChangeLog: * sem_ch13.adb (Check_Aspect_At_End_Of_Declarations): Ensure the Expression_Copy always has a parent before calling any analyze.
12 daysada: Improved support for mutably tagged typesSteve Baird7-305/+498
Fix bugs related to mutably tagged types in streaming operations, Put_Image attributes, aggregates, composite equality comparisons with mutably-tagged components, and other issues. gcc/ada/ChangeLog: * exp_aggr.adb (Build_Record_Aggr_Code.Gen_Assign): In the case of an aggregate component where the component type is mutably tagged and the component value is provided by a qualified aggregate (and qualified with a specific type), avoid incorrectly rejecting the inner aggregate for violating the rule that the type of an aggregate shall not be class-wide. * exp_attr.adb: For a predefined streaming operation (i.e., Read, Write, Input, or Output) of a class-wide type, the external name of the tag of the value is normally written out by Output and read in by Input. In the case of a mutably tagged type, this is instead done in Write and Read. * exp_ch4.adb (Expand_Composite_Equality): In the case of an equality comparison for a type having a mutably tagged component, we want the component comparison to compare two values of the mutably tagged type, not two values of the corresponding array-of-bytes-ish representation type. Even if there are no user-defined equality functions anywhere in sight, comparing the array values still doesn't work because undefined bits may end up participating in the comparison (resulting in an incorrect result of False). * exp_put_image.adb: In the case of a class-wide type, the predefined Image attribute includes the name of the specific type (and a "'" character, to follow qualified expression syntax) to indicate the tag of the value. With the introduction of mutably tagged types, this case can now arise in the case of a component (of either an enclosing array or an enclosing record), not just for a top-level object. So we factor the code to do this into a new procedure, Put_Specific_Type_Name_Qualifier, so that it can be called from more than one place. This reorganization also involves replacing the procedure Put_String_Exp with a new procedure, Put_String_Exp_To_Buffer, declared in a less nested scope. For mutably tagged components (at the source level) the component type (at the GNAT tree level) is an array of bytes (actually a two field record containing an array of bytes, but that's a detail). Appropriate conversions need to be generated so that we don't end up generating an image for an array of bytes; this is done at the same places where Put_Specific_Type_Name_Qualifier is called (for components) by calling Make_Mutably_Tagged_Conversion. * exp_strm.adb (Make_Field_Attribute): Add Make_Mutably_Tagged_Conversion call where we construct a Selected_Component node and the corresponding component type is the internal representation type for a mutably tagged type. (Stream_Base_Type): Return the mutably tagged type if given the corresponding internal representation type. * sem_ch3.adb (Array_Type_Declaration): In the case where the source-level component type of an array type is mutably tagged, set the Component_Type field of the base type of the declared array type (as opposed to that of the first subtype of the array type) to the corresponding internal representation type. * sem_ch4.adb (Analyze_Selected_Component): In the case of a selected component name which references a component whose type is the internal representation type of a mutably tagged type, generate a conversion to the mutably tagged type.
12 dayslibstdc++: Fix obvious mistake in inplace_vector::assign_range [PR119137]Tomasz Kamiński1-1/+1
In case of input iterators, the loop that assigns to existing elements should run up to number of elements in vector (_M_size) not capacity (_Nm). PR libstdc++/119137 libstdc++-v3/ChangeLog: * include/std/inplace_vector (inplace_vector::assign_range): Replace _Nm with _M_size in the assigment loop.
12 daysFix gcc.dg/vect/slp-28.cRichard Biener1-5/+4
gcc.dg/vect/slp-28.c is now vectorized as expected even on targets without vect32. * gcc.dg/vect/slp-28.c: Adjust.
13 daysDaily bump.GCC Administrator12-1/+504
13 days[RISC-V] Add missing insn types to xiangshan.md and mips-p8700.mdJeff Law2-2/+3
This is a trivial patch to add a few missing types to pipeline models that are mostly complete. In particular this adds the "ghost" to mips-p8700.md and the "sf_vc" and "sf_vc_se" types to xiangshan.md. There are definitely some bigger issues to solve in this space. But this is a trivial fix that stands on its own. I've tested this in my tester, just waiting for pre-commit CI to do its thing. gcc/ * config/riscv/mips-p8700.md: Add support for "ghost" insn types. * config/riscv/xiangshan.md: Add support for "sf_vc" and "sf_vc_se" insn types.
13 daysAda: Fix wrong tag in style check warningsEric Botcazou1-2/+4
This fixes an old issue whereby violations of the style check -gnatyc are sometimes reported as violations of -gnatyt instead. gcc/ada/ PR ada/121184 * styleg.adb (Check_Comment): Use consistent warning message.
13 dayscobol: Improved linemap and diagnostic handling; PIC validation. [PR120402]Robert Dubner18-233/+806
Implementation of PICTURE string validation for PR120402. Expanded some printf format attributes. Improved debugging and diagnostic messages. Improved linemap and line location tracking in support of diagnostic messages and location_t tagging of GENERIC nodes for improved GDB-COBOL performance. Assorted changes to eliminate cppcheck warnings. Co-Authored-By: James K. Lowden <jklowden@cobolworx.com> Co-Authored-By: Robert Dubner <rdubner@symas.com> gcc/cobol/ChangeLog: PR cobol/120402 * Make-lang.in: Elminate commented-out scripting. * cbldiag.h (_CBLDIAG_H): Change #if 0 to #if GCOBOL_GETENV (warn_msg): Add printf attributes. (location_dump): Add debugging message. * cdf.y: Improved linemap tracking. * genapi.cc (treeplet_fill_source): const attribute for formal parameter. (insert_nop): Created to consolidate var_decl_nop writes. (build_main_that_calls_something): Move generation to the end of executable. (level_88_helper): Formatting. (parser_call_targets_dump): Formatting. (function_pointer_from_name): const attribute for formal parameter. (parser_initialize_programs): const attribute for formal parameter. (parser_statement_begin): Improved linemap handling. (section_label): Improved linemap handling. (paragraph_label): Improved linemap handling. (pseudo_return_pop): Improved linemap handling. (leave_procedure): Formatting. (parser_enter_section): Improved linemap handling. (parser_enter_paragraph): Improved linemap handling. (parser_perform): Formatting. (parser_leave_file): Move creation of main() to this routine. (parser_enter_program): Move creation of main from here to leave_file. (parser_accept): Formatting. const attribute for formal parameter. (parser_accept_command_line): const attribute for formal parameter. (parser_accept_command_line_count): const attribute for formal parameter. (parser_accept_envar): Likewise. (parser_set_envar): Likewise. (parser_display): Likewise. (get_exhibit_name): Implement EXHIBIT verb. (parser_exhibit): Likewise. (parser_sleep): const attribute for formal parameter. (parser_division): Improved linemap handling. (parser_classify): const attribute for formal parameter. (create_iline_address_pairs): Improved linemap handling. (parser_perform_start): Likewise. (perform_inline_until): Likewise. (perform_inline_testbefore_varying): Likewise. (parser_perform_until): Likewise. (parser_perform_inline_times): Likewise. (parser_intrinsic_subst): const attribute for formal parameter. (parser_file_merge): Formatting. (create_and_call): Improved linemap handling. (mh_identical): const attribute for formal parameter. (mh_numeric_display): const attribute for formal parameter. (mh_little_endian): Likewise. (mh_source_is_group): Likewise. (psa_FldLiteralA): Formatting. * genapi.h (parser_accept): const attribute for formal parameter. (parser_accept_envar): Likewise. (parser_set_envar): Likewise. (parser_accept_command_line): Likewise. (parser_accept_command_line_count): Likewise. (parser_add): Likewise. (parser_classify): Likewise. (parser_sleep): Likewise. (parser_exhibit): Likewise. (parser_display): Likewise. (parser_initialize_programs): Likewise. (parser_intrinsic_subst): Likewise. * gengen.cc (gg_assign): Improved linemap handling. (gg_add_field_to_structure): Likewise. (gg_define_from_declaration): Likewise. (gg_build_relational_expression): Likewise. (gg_goto_label_decl): Likewise. (gg_goto): Likewise. (gg_printf): Likewise. (gg_fprintf): Likewise. (gg_memset): Likewise. (gg_memchr): Likewise. (gg_memcpy): Likewise. (gg_memmove): Likewise. (gg_strcpy): Likewise. (gg_strcmp): Likewise. (gg_strncmp): Likewise. (gg_return): Likewise. (chain_parameter_to_function): Likewise. (gg_define_function): Likewise. (gg_get_function_decl): Likewise. (gg_call_expr): Likewise. (gg_call): Likewise. (gg_call_expr_list): Likewise. (gg_exit): Likewise. (gg_abort): Likewise. (gg_strlen): Likewise. (gg_strdup): Likewise. (gg_malloc): Likewise. (gg_realloc): Likewise. (gg_free): Likewise. (gg_set_current_line_number): Likewise. (gg_get_current_line_number): Likewise. (gg_insert_into_assembler): Likewise. (token_location_override): Likewise. (gg_token_location): Likewise. * gengen.h (location_from_lineno): Likewise. (gg_set_current_line_number): Likewise. (gg_get_current_line_number): Likewise. (gg_token_location): Likewise. (current_token_location): Likewise. (current_location_minus_one): Likewise. (current_location_minus_one_clear): Likewise. (token_location_override): Likewise. * genmath.cc (fast_divide): const attribute for formal parameter. * genutil.cc (get_and_check_refstart_and_reflen): Likewise. (get_data_offset): Likewise. (refer_refmod_length): Likewise. (refer_offset): Likewise. (refer_size): Likewise. (refer_size_dest): Likewise. (refer_size_source): Likewise. (qualified_data_location): Likewise. * genutil.h (refer_offset): Likewise. (refer_size_source): Likewise. (refer_size_dest): Likewise. (qualified_data_location): Likewise. * parse.y: EVALUATE token; Implement EXHIBIT verb; Improved linemap handling. * parse_ante.h (input_file_status_notify): Improved linemap handling. (location_set): Likewise. * scan.l: PICTURE string validation. * scan_ante.h (class picture_t): PICTURE string validation. (validate_picture): Likewise. * symbols.cc (symbol_currency): Revised default currency handling. * symbols.h (symbol_currency): Likewise. * util.cc (location_from_lineno): Improved linemap handling. (current_token_location): Improved linemap handling. (current_location_minus_one): Improved linemap handling. (current_location_minus_one_clear): Improved linemap handling. (gcc_location_set_impl): Improved linemap handling. (warn_msg): Improved linemap handling. * util.h (cobol_lineno): Improved linemap handling.
13 daysmatch: Add `cmp - 1` simplification to `-icmp` [PR110949]Andrew Pinski3-1/+50
I have seen this a few places though the testcase from PR 95906 is an obvious place where this shows up for sure. This convert `cmp - 1` into `-icmp` as that form is more useful in many cases. Changes since v1: * v2: Add check for outer type's precision being greater than 1. Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/110949 PR tree-optimization/95906 gcc/ChangeLog: * match.pd (cmp - 1): New pattern. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/cmp-2.c: New test. * gcc.dg/tree-ssa/max-bitcmp-1.c: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
13 dayslibstdc++: Make the default ctor of mdspan conditionally noexcept.Luc Grosheintz2-7/+42
Previously, the default ctor of mdspan was never noexcept, even if all members of mdspan were nothrow default constructible. This commit makes mdspan conditionally nothrow default constructible. A similar strengthening happens in libc++. libstdc++-v3/ChangeLog: * include/std/mdspan (mdspan::mdspan): Make default ctor conditionally noexcept. * testsuite/23_containers/mdspan/mdspan.cc: Add tests. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
13 dayslibstdc++: Strengthen exception guarantee for mdspan methods.Luc Grosheintz3-71/+102
The mdspan::is_{,always}_{unique,strided,exhaustive} methods only call their counterparts in mdspan::mapping_type. The standard specifies that the methods of mdspan::mapping_type are noexcept, but doesn't specify if the methods of mdspan are noexcept. Libc++ strengthened the exception guarantee for these mdspan methods. This commit conditionally strengthens these methods for libstdc++. libstdc++-v3/ChangeLog: * include/std/mdspan (mdspan::is_always_unique): Make conditionally noexcept. (mdspan::is_always_exhaustive): Ditto. (mdspan::is_always_strided): Ditto. (mdspan::is_unique): Ditto. (mdspan::is_exhaustive): Ditto. (mdspan::is_strided): Ditto. * testsuite/23_containers/mdspan/layout_like.h: Make noexcept configurable. Add ThrowingLayout. * testsuite/23_containers/mdspan/mdspan.cc: Add tests for noexcept. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
13 days[RISC-V] Fix wrong CFA during stack probeAndreas Schwab1-1/+1
temp1 is used by the probe loop for the step size, but we need the final address of the stack after the loop which resides in temp2. PR target/121121 * config/riscv/riscv.cc (riscv_allocate_and_probe_stack_space): Use temp2 instead of temp1 for the CFA note.
13 daysRISC-V: Add test for vec_duplicate + vaaddu.vv combine for DImodePan Li7-0/+26
Add asm dump check and run test for vec_duplicate + vaaddu.vv combine to vaaddu.vx, with the GR2VR cost is 0, 1, 2 and 15 for the case 0 and case 1. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c: Add asm check. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vaadd-run-1-u64.c: New test. Signed-off-by: Pan Li <pan2.li@intel.com>
13 daysRISC-V: Allow VLS DImode for sat_op vx DImode patternPan Li1-15/+15
When try to introduce the vaaddu.vx combine for DImode, we will meet ICE like below: 0x4889763 internal_error(char const*, ...) .../riscv-gnu-toolchain/gcc/__build__/../gcc/diagnostic-global-context.cc:517 0x4842f98 fancy_abort(char const*, int, char const*) .../riscv-gnu-toolchain/gcc/__build__/../gcc/diagnostic.cc:1818 0x2953461 code_for_pred_scalar(int, machine_mode) ./insn-opinit.h:1911 0x295f300 riscv_vector::sat_op<110>::expand(riscv_vector::function_expander&) const .../riscv-gnu-toolchain/gcc/__build__/../gcc/config/riscv/riscv-vector-builtins-bases.cc:667 0x294bce1 riscv_vector::function_expander::expand() We will have code_for_nothing when emit the vaadd.vx insn for V2DI vls mode. So allow the VLS mode for the sat_op vx pattern to unblock it. gcc/ChangeLog: * config/riscv/vector.md: Allow VLS DImode for sat_op vx pattern. Signed-off-by: Pan Li <pan2.li@intel.com>
13 daysRISC-V: Add test for vec_duplicate + vaaddu.vv combine case 1 with GR2VR ↵Pan Li9-0/+18
cost 0, 1 and 2 for QI, HI and SI mode Add asm dump check test for vec_duplicate + vaaddu.vv combine to vaaddu.vx, with the GR2VR cost is 0, 1 and 2. Please note DImode is not included. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c: Add asm check. * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c: Ditto. Signed-off-by: Pan Li <pan2.li@intel.com>
13 daysRISC-V: Add test for vec_duplicate + vaaddu.vv combine case 0 with GR2VR ↵Pan Li14-15/+297
cost 0, 2 and 15 for QI, HI and SI mode Add asm dump check and run test for vec_duplicate + vaaddu.vv combine to vaaddu.vx, with the GR2VR cost is 0, 2 and 15. Please note DImode is not included here. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c: Add asm check. * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c: Ditto. * gcc.target/riscv/rvv/autovec/vx_vf/vx_binary.h: Add test helper macros. * gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h: Add test data for run test. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vaadd-run-1-u16.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vaadd-run-1-u32.c: New test. * gcc.target/riscv/rvv/autovec/vx_vf/vx_vaadd-run-1-u8.c: New test. Signed-off-by: Pan Li <pan2.li@intel.com>
13 daysRISC-V: Combine vec_duplicate + vaaddu.vv to vaaddu.vx on GR2VR cost for HI, ↵Pan Li2-2/+89
QI and SI mode This patch would like to combine the vec_duplicate + vaaddu.vv to the vaaddu.vx. From example as below code. The related pattern will depend on the cost of vec_duplicate from GR2VR. Then the late-combine will take action if the cost of GR2VR is zero, and reject the combination if the GR2VR cost is greater than zero. Assume we have example code like below, GR2VR cost is 0. #define DEF_AVG_FLOOR(NT, WT) \ NT \ test_##NT##_avg_floor(NT x, NT y) \ { \ return (NT)(((WT)x + (WT)y) >> 1); \ } #define AVG_FLOOR_FUNC(T) test_##T##_avg_floor DEF_AVG_FLOOR(uint32_t, uint64_t) DEF_VX_BINARY_CASE_2_WRAP(T, AVG_FLOOR_FUNC(T), sat_add) Before this patch: 11 │ beq a3,zero,.L8 12 │ vsetvli a5,zero,e32,m1,ta,ma 13 │ vmv.v.x v2,a2 14 │ slli a3,a3,32 15 │ srli a3,a3,32 16 │ .L3: 17 │ vsetvli a5,a3,e32,m1,ta,ma 18 │ vle32.v v1,0(a1) 19 │ slli a4,a5,2 20 │ sub a3,a3,a5 21 │ add a1,a1,a4 22 │ vaaddu.vv v1,v1,v2 23 │ vse32.v v1,0(a0) 24 │ add a0,a0,a4 25 │ bne a3,zero,.L3 After this patch: 11 │ beq a3,zero,.L8 12 │ slli a3,a3,32 13 │ srli a3,a3,32 14 │ .L3: 15 │ vsetvli a5,a3,e32,m1,ta,ma 16 │ vle32.v v1,0(a1) 17 │ slli a4,a5,2 18 │ sub a3,a3,a5 19 │ add a1,a1,a4 20 │ vaaddu.vx v1,v1,a2 21 │ vse32.v v1,0(a0) 22 │ add a0,a0,a4 23 │ bne a3,zero,.L3 gcc/ChangeLog: * config/riscv/autovec-opt.md (*uavg_floor_vx_<mode>): Add pattern for vaaddu.vx combine. * config/riscv/riscv.cc (get_vector_binary_rtx_cost): Add UNSPEC handling for UNSPEC_VAADDU. (riscv_rtx_costs): Ditto. Signed-off-by: Pan Li <pan2.li@intel.com>
13 daysaarch64: Avoid INS-(W|X)ZR instructions when optimising for speedKyrylo Tkachov4-2/+33
For inserting zero into a vector lane we usually use an instruction like: ins v0.h[2], wzr This, however, has not-so-great performance on some CPUs. On Grace, for example it has a latency of 5 and throughput 1. The alternative sequence: movi v31.8b, #0 ins v0.h[2], v31.h[0] is prefereble bcause the MOVI-0 is often a zero-latency operation that is eliminated by the CPU frontend and the lane-to-lane INS has a latency of 2 and throughput of 4. We can avoid the merging of the two instructions into the aarch64_simd_vec_set_zero<mode> by disabling that pattern when optimizing for speed. Thanks to wider benchmarking from Tamar, it makes sense to make this change for all tunings, so no RTX costs or tuning flags are introduced to control this in a more fine-grained manner. They can be easily added in the future if needed for a particular CPU. Bootstrapped and tested on aarch64-none-linux-gnu. Signed-off-by: Kyrylo Tkachov <ktkachov@nvidia.com> gcc/ * config/aarch64/aarch64-simd.md (aarch64_simd_vec_set_zero<mode>): Enable only when optimizing for size. gcc/testsuite/ * gcc.target/aarch64/simd/mf8_data_1.c (test_set_lane4, test_setq_lane4): Relax allowed assembly. * gcc.target/aarch64/vec-set-zero.c: Use -Os in flags. * gcc.target/aarch64/inszero_split_1.c: New test.
13 daysaarch64: NFC - Make vec_* rtx costing logic consistentKyrylo Tkachov3-58/+65
The rtx costs logic for CONST_VECTOR, VEC_DUPLICATE and VEC_SELECT sets the cost unconditionally to the movi, dup or extract fields of extra_cost, when the normal practice in that function is to use extra_cost only when speed is set. When speed is false the function should estimate the size cost only. This patch makes the logic consistent by using the extra_cost fields to increment the cost when speed is set. This requires reducing the extra_cost values of the movi, dup and extract fields by COSTS_N_INSNS (1), as every insn being costed has a cost of COSTS_N_INSNS (1) at the start of the function. The cost tables for the CPUs are updated in line with this. With these changes the testsuite is unaffected so no different costing decisions are made and this patch is just a cleanup. Bootstrapped and tested on aarch64-none-linux-gnu. Signed-off-by: Kyrylo Tkachov <ktkachov@nvidia.com> gcc/ * config/aarch64/aarch64.cc (aarch64_rtx_costs): Add extra_cost values only when speed is true for CONST_VECTOR, VEC_DUPLICATE, VEC_SELECT cases. * config/aarch64/aarch64-cost-tables.h (qdf24xx_extra_costs, thunderx_extra_costs, thunderx2t99_extra_costs, thunderx3t110_extra_costs, tsv110_extra_costs, a64fx_extra_costs, ampere1_extra_costs, ampere1a_extra_costs, ampere1b_extra_costs): Reduce cost of movi, dup, extract fields by COSTS_N_INSNS (1). * config/arm/aarch-cost-tables.h (generic_extra_costs, cortexa53_extra_costs, cortexa57_extra_costs, cortexa76_extra_costs, exynosm1_extra_costs, xgene1_extra_costs): Likewise.
13 daystree-optimization/121194 - check LC PHIs can be vectorizedRichard Biener2-0/+29
With bools we can have the usual mismatch between mask and data use. Catch that, like we do elsewhere. PR tree-optimization/121194 * tree-vect-loop.cc (vectorizable_lc_phi): Verify vector types are compatible. * gcc.dg/torture/pr121194.c: New testcase.
13 daysfortran: Fix indentationMikael Morin1-8/+8
gcc/fortran/ChangeLog: * trans-decl.cc (gfc_trans_deferred_vars): Fix indentation.
13 daysamdgcn: add DImode offsets for gather/scatterAndrew Stubbs2-12/+103
Add new variant of he gather_load and scatter_store instructions that take the offsets in DImode. This is not the natural width for offsets in the instruction set, but we can use them to compute a vector of absolute addresses, which does work. This enables the autovectorizer to use gather/scatter in a number of additional scenarios (one of which shows up in the SPEC HPC lbm benchmark). gcc/ChangeLog: * config/gcn/gcn-valu.md (gather_load<mode><vndi>): New. (scatter_store<mode><vndi>): New. (mask_gather_load<mode><vndi>): New. (mask_scatter_store<mode><vndi>): New. * config/gcn/gcn.cc (gcn_expand_scaled_offsets): Support DImode.
13 daysamdgcn: Add ashlvNm, mulvNm macrosAndrew Stubbs1-27/+41
I need some extra shift varieties in the mode-independent code, but the macros don't permit insns that don't have QI/HI variants. This fixes the problem, and adds the new functions for the follow-up patch to use. gcc/ChangeLog: * config/gcn/gcn.cc (GEN_VNM_NOEXEC): Use USE_QHF. (GEN_VNM): Likewise, and call for new ashl and mul variants.
13 daysamdgcn: add more insn patterns using vec_duplicateAndrew Stubbs2-6/+179
These new insns allow more efficient use of scalar inputs to 64-bit vector add and mul. Also, the patch adjusts the existing mul.._dup because it was actually a dup2 (the vec_duplicate is on the second input), and that was inconveniently inconsistent. The patterns are generally useful, but will be used directly by a follow-up patch. gcc/ChangeLog: * config/gcn/gcn-valu.md (add<mode>3_dup): New. (add<mode>3_dup_exec): New. (<su>mul<mode>3_highpart_dup<exec>): New. (mul<mode>3_dup): Move the vec_duplicate to operand 1. (mul<mode>3_dup_exec): New. (vec_series<mode>): Adjust call to gen_mul<mode>3_dup. * config/gcn/gcn.cc (gcn_expand_vector_init): Likewise.
13 daysgenoutput: Verify hard register constraintsStefan Schulze Frielinghaus3-0/+52
Since genoutput has no information about hard register names we cannot statically verify those names in constraints of the machine description. Therefore, we have to do it at runtime. Although verification shouldn't be too expensive, restrict it to checking builds. This should be sufficient since hard register constraints in machine descriptions probably change rarely, and each commit should be tested with checking anyway, or at the very least before a release is taken. gcc/ChangeLog: * genoutput.cc (main): Emit function verify_reg_names_in_constraints() for run-time validation. (mdep_constraint_len): Deal with hard register constraints. * output.h (verify_reg_names_in_constraints): New function declaration. * toplev.cc (backend_init): If checking is enabled, call into verify_reg_names_in_constraints().
13 daysError handling for hard register constraintsStefan Schulze Frielinghaus26-118/+843
This implements error handling for hard register constraints including potential conflicts with register asm operands. In contrast to register asm operands, hard register constraints allow more than just one register per operand. Even more than just one register per alternative. For example, a valid constraint for an operand is "{r0}{r1}m,{r2}". However, this also means that we have to make sure that each register is used at most once in each alternative over all outputs and likewise over all inputs. For asm statements this is done by this patch during gimplification. For hard register constraints used in machine description, error handling is still a todo and I haven't investigated this so far and consider this rather a low priority. gcc/ada/ChangeLog: * gcc-interface/trans.cc (gnat_to_gnu): Pass null pointer to parse_{input,output}_constraint(). gcc/analyzer/ChangeLog: * region-model-asm.cc (region_model::on_asm_stmt): Pass null pointer to parse_{input,output}_constraint(). gcc/c/ChangeLog: * c-typeck.cc (build_asm_expr): Pass null pointer to parse_{input,output}_constraint(). gcc/ChangeLog: * cfgexpand.cc (n_occurrences): Move this ... (check_operand_nalternatives): and this ... (expand_asm_stmt): and the call to gimplify.cc. * config/s390/s390.cc (s390_md_asm_adjust): Pass null pointer to parse_{input,output}_constraint(). * gimple-walk.cc (walk_gimple_asm): Pass null pointer to parse_{input,output}_constraint(). (walk_stmt_load_store_addr_ops): Ditto. * gimplify-me.cc (gimple_regimplify_operands): Ditto. * gimplify.cc (num_occurrences): Moved from cfgexpand.cc. (num_alternatives): Ditto. (gimplify_asm_expr): Deal with hard register constraints. * stmt.cc (eliminable_regno_p): New helper. (hardreg_ok_p): Perform a similar check as done in make_decl_rtl(). (parse_output_constraint): Add parameter for gimplify_reg_info and validate hard register constrained operands. (parse_input_constraint): Ditto. * stmt.h (class gimplify_reg_info): Forward declaration. (parse_output_constraint): Add parameter. (parse_input_constraint): Ditto. * tree-ssa-operands.cc (operands_scanner::get_asm_stmt_operands): Pass null pointer to parse_{input,output}_constraint(). * tree-ssa-structalias.cc (find_func_aliases): Pass null pointer to parse_{input,output}_constraint(). * varasm.cc (assemble_asm): Pass null pointer to parse_{input,output}_constraint(). * gimplify_reg_info.h: New file. gcc/cp/ChangeLog: * semantics.cc (finish_asm_stmt): Pass null pointer to parse_{input,output}_constraint(). gcc/d/ChangeLog: * toir.cc: Pass null pointer to parse_{input,output}_constraint(). gcc/testsuite/ChangeLog: * gcc.dg/pr87600-2.c: Split test into two files since errors for functions test{0,1} are thrown during expand, and for test{2,3} during gimplification. * lib/scanasm.exp: On s390, skip lines beginning with #. * gcc.dg/asm-hard-reg-error-1.c: New test. * gcc.dg/asm-hard-reg-error-2.c: New test. * gcc.dg/asm-hard-reg-error-3.c: New test. * gcc.dg/asm-hard-reg-error-4.c: New test. * gcc.dg/asm-hard-reg-error-5.c: New test. * gcc.dg/pr87600-3.c: New test. * gcc.target/aarch64/asm-hard-reg-2.c: New test. * gcc.target/s390/asm-hard-reg-7.c: New test.
13 daysHard register constraintsStefan Schulze Frielinghaus31-7/+1388
Implement hard register constraints of the form {regname} where regname must be a valid register name for the target. Such constraints may be used in asm statements as a replacement for register asm and in machine descriptions. A more verbose description is given in extend.texi. It is expected and desired that optimizations coalesce multiple pseudos into one whenever possible. However, in case of hard register constraints we may have to undo this and introduce copies since otherwise we would constraint a single pseudo to multiple hard registers. This is done prior RA during asmcons in match_asm_constraints_2(). While IRA tries to reduce live ranges, it also replaces some register-register moves. That in turn might undo those copies of a pseudo which we just introduced during asmcons. Thus, check in decrease_live_ranges_number() via valid_replacement_for_asm_input_p() whether it is valid to perform a replacement. The reminder of the patch mostly deals with parsing and decoding hard register constraints. The actual work is done by LRA in process_alt_operands() where a register filter, according to the constraint, is installed. For the sake of "reviewability" and in order to show the beauty of LRA, error handling (which gets pretty involved) is spread out into a subsequent patch. Limitation ---------- Currently, a fixed register cannot be used as hard register constraint. For example, loading the stack pointer on x86_64 via void * foo (void) { void *y; __asm__ ("" : "={rsp}" (y)); return y; } leads to an error. Asm Adjust Hook --------------- The following targets implement TARGET_MD_ASM_ADJUST: - aarch64 - arm - avr - cris - i386 - mn10300 - nds32 - pdp11 - rs6000 - s390 - vax Most of them only add the CC register to the list of clobbered register. However, cris, i386, and s390 need some minor adjustment. gcc/ChangeLog: * config/cris/cris.cc (cris_md_asm_adjust): Deal with hard register constraint. * config/i386/i386.cc (map_egpr_constraints): Ditto. * config/s390/s390.cc (f_constraint_p): Ditto. * doc/extend.texi: Document hard register constraints. * doc/md.texi: Ditto. * function.cc (match_asm_constraints_2): Have a unique pseudo for each operand with a hard register constraint. (pass_match_asm_constraints::execute): Calling into new helper match_asm_constraints_2(). * genoutput.cc (mdep_constraint_len): Return the length of a hard register constraint. * genpreds.cc (write_insn_constraint_len): Support hard register constraints for insn_constraint_len(). * ira.cc (valid_replacement_for_asm_input_p_1): New helper. (valid_replacement_for_asm_input_p): New helper. (decrease_live_ranges_number): Similar to match_asm_constraints_2() ensure that each operand has a unique pseudo if constrained by a hard register. * lra-constraints.cc (process_alt_operands): Install hard register filter according to constraint. * recog.cc (asm_operand_ok): Accept register type for hard register constrained asm operands. (constrain_operands): Validate hard register constraints. * stmt.cc (decode_hard_reg_constraint): Parse a hard register constraint into the corresponding register number or bail out. (parse_output_constraint): Parse hard register constraint and set *ALLOWS_REG. (parse_input_constraint): Ditto. * stmt.h (decode_hard_reg_constraint): Declaration of new function. gcc/testsuite/ChangeLog: * gcc.dg/asm-hard-reg-1.c: New test. * gcc.dg/asm-hard-reg-2.c: New test. * gcc.dg/asm-hard-reg-3.c: New test. * gcc.dg/asm-hard-reg-4.c: New test. * gcc.dg/asm-hard-reg-5.c: New test. * gcc.dg/asm-hard-reg-6.c: New test. * gcc.dg/asm-hard-reg-7.c: New test. * gcc.dg/asm-hard-reg-8.c: New test. * gcc.target/aarch64/asm-hard-reg-1.c: New test. * gcc.target/i386/asm-hard-reg-1.c: New test. * gcc.target/i386/asm-hard-reg-2.c: New test. * gcc.target/s390/asm-hard-reg-1.c: New test. * gcc.target/s390/asm-hard-reg-2.c: New test. * gcc.target/s390/asm-hard-reg-3.c: New test. * gcc.target/s390/asm-hard-reg-4.c: New test. * gcc.target/s390/asm-hard-reg-5.c: New test. * gcc.target/s390/asm-hard-reg-6.c: New test. * gcc.target/s390/asm-hard-reg-longdouble.h: New test.
13 daysRemove bougs minimum VF computeRichard Biener5-15/+19
The following removes the minimum VF compute from dataref analysis which does not take into account SLP at all, leaving the testcase vectorized with V2SImode instead of V4SImode on x86. With SLP the only minimum VF we can compute this early is 1. * tree-vectorizer.h (vect_analyze_data_refs): Remove min_vf output. * tree-vect-data-refs.cc (vect_analyze_data_refs): Likewise. * tree-vect-loop.cc (vect_analyze_loop_2): Remove early out based on bogus min_vf. * tree-vect-slp.cc (vect_slp_analyze_bb_1): Adjust. * gcc.dg/vect/vect-127.c: New testcase.
13 daysFortran: Allow for iterator substitution in array constructors [PR119106]Andre Vehreschild2-2/+20
PR fortran/119106 gcc/fortran/ChangeLog: * expr.cc (simplify_constructor): Do not simplify constants. (gfc_simplify_expr): Continue to simplify expression when an iterator is present. gcc/testsuite/ChangeLog: * gfortran.dg/array_constructor_58.f90: New test.
13 daysfortran: Factor array descriptor referencesMikael Morin1-1/+143
Save subexpressions of array descriptor references to variables, so that all the expressions using the descriptor as base object benefit from a simplified reference using the variables. This limits the size of the expressions generated in the original tree dump, easing analysis of the code involving those expressions. This is especially helpful with chains of array references where each array in the chain uses a descriptor. After optimizations, the effect of the change shouldn't be visible in the vast majority of cases. In rare cases it seems to permit a couple more jump threadings. gcc/fortran/ChangeLog: * trans-array.cc (gfc_conv_ss_descriptor): Move the descriptor expression initialisation... (set_factored_descriptor_value): ... to this new function. Before initialisation, walk the reference expression passed as argument and save some of its subexpressions to a variable. (substitute_t): New struct. (maybe_substitute_expr): New function. (substitute_subexpr_in_expr): New function.