aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2020-11-13In 'gcc/omp-oacc-kernels-decompose.cc', use langhook instead of accessing ↵Kwok Cheung Yeung1-3/+8
language-specific decl information gcc/ * omp-oacc-kernels-decompose.cc (maybe_build_inner_data_region): Use langhook instead of accessing language-specific decl information.
2020-11-13Decompose OpenACC 'kernels' constructs into parts, a sequence of compute ↵Gergö Barany21-13/+2289
constructs Not yet enabled by default: for now, the current mode of OpenACC 'kernels' constructs handling still remains '-fopenacc-kernels=parloops', but that is to change later. gcc/ * omp-oacc-kernels-decompose.cc: New. * Makefile.in (OBJS): Add it. * passes.def: Instantiate it. * tree-pass.h (make_pass_omp_oacc_kernels_decompose): Declare. * flag-types.h (enum openacc_kernels): Add. * doc/invoke.texi (-fopenacc-kernels): Document. * gimple.h (enum gf_mask): Add 'GF_OMP_TARGET_KIND_OACC_PARALLEL_KERNELS_PARALLELIZED', 'GF_OMP_TARGET_KIND_OACC_PARALLEL_KERNELS_GANG_SINGLE', 'GF_OMP_TARGET_KIND_OACC_DATA_KERNELS'. (is_gimple_omp_oacc, is_gimple_omp_offloaded): Handle these. * gimple-pretty-print.c (dump_gimple_omp_target): Likewise. * omp-expand.c (expand_omp_target, build_omp_regions_1) (omp_make_gimple_edges): Likewise. * omp-low.c (scan_sharing_clauses, scan_omp_for) (check_omp_nesting_restrictions, lower_oacc_reductions) (lower_oacc_head_mark, lower_omp_target): Likewise. * omp-offload.c (execute_oacc_device_lower): Likewise. gcc/c-family/ * c.opt (fopenacc-kernels): Add. gcc/fortran/ * lang.opt (fopenacc-kernels): Add. gcc/testsuite/ * c-c++-common/goacc/kernels-decompose-1.c: New. * c-c++-common/goacc/kernels-decompose-2.c: New. * c-c++-common/goacc/kernels-decompose-ice-1.c: New. * c-c++-common/goacc/kernels-decompose-ice-2.c: New. * gfortran.dg/goacc/kernels-decompose-1.f95: New. * gfortran.dg/goacc/kernels-decompose-2.f95: New. * c-c++-common/goacc/if-clause-2.c: Adjust. * gfortran.dg/goacc/kernels-tree.f95: Likewise. libgomp/ * testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose-ice-1.c: New. * testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/kernels-decompose-1.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/declare-vla.c: Adjust. * testsuite/libgomp.oacc-fortran/pr94358-1.f90: Likewise. Co-authored-by: Thomas Schwinge <thomas@codesourcery.com>
2020-11-13More explicit checking of which OMP constructs we're expectingThomas Schwinge1-14/+45
In particular, more precisely highlight what applies generally vs. the special handling for the current 'parloops'-based OpenACC 'kernels' implementation. gcc/ * omp-low.c (scan_sharing_clauses, scan_omp_for) (lower_oacc_reductions, lower_omp_target): More explicit checking of which OMP constructs we're expecting.
2020-11-13Attach an attribute to all outlined OpenACC compute regionsThomas Schwinge6-27/+114
This allows for making some things more explicit, later on. gcc/ * omp-expand.c (expand_omp_target): Attach an attribute to all outlined OpenACC compute regions. * omp-offload.c (execute_oacc_device_lower): Adjust. gcc/testsuite/ * c-c++-common/goacc/classify-parallel.c: Adjust. * gfortran.dg/goacc/classify-parallel.f95: Likewise. * c-c++-common/goacc/classify-serial.c: New. * gfortran.dg/goacc/classify-serial.f95: Likewise.
2020-11-13c++: Add feature test macro for C++20 using enum.Jason Merrill2-0/+7
Missing piece from the 'using enum' implementation patch. gcc/c-family/ChangeLog: * c-cppbuiltin.c (c_cpp_builtins): Define __cpp_using_enum. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/feat-cxx2a.C: Check it.
2020-11-13Fix modref insertion hook.Jan Hubicka1-1/+3
* ipa-modref.c (modref_summaries::insert, modref_summaries_lto::insert): Remove summary if ipa-modref is disabled.
2020-11-13Copied arguments are readonlyJan Hubicka1-1/+1
* attr-fnspec.h (attr_fnspec::arg_readonly_p): Accept '1'...'9'.
2020-11-13Clarify the documentation for the ms_abi fucntion attributePeter Jones1-3/+4
gcc/ * doc/extend.texi: Clarify the documentation for the ms_abi function attribute.
2020-11-13Re: Fix gimple_expr_code?Andrew MacLeod2-26/+28
have gimple_expr_code return the correct code for GIMPLE_ASSIGN. use gassign and gcond in gimple_range_handler. * gimple-range.h (gimple_range_handler): Cast to gimple stmt kinds before asking for code and type. * gimple.h (gimple_expr_code): Call gassign and gcond routines to get their expr_code.
2020-11-13c++: Implement C++20 'using enum'. [PR91367]Jason Merrill20-135/+648
This feature allows the programmer to import enumerator names into the current scope so later mentions don't need to use the fully-qualified name. These usings are not subject to the usual restrictions on using-decls: in particular, they can move between class and non-class scopes, and between classes that are not related by inheritance. This last caused difficulty for our normal approach to using-decls within a class hierarchy, as we assume that the class where we looked up a used declaration is derived from the class where it was first declared. So to simplify things, in that case we make a clone of the CONST_DECL in the using class. Thanks to Nathan for the start of this work: in particular, the lookup_using_decl rewrite. The changes to dwarf2out revealed an existing issue with the D front-end: we were doing the wrong thing for importing a D CONST_DECL, because dwarf2out_imported_module_or_decl_1 was looking through it to its type, expecting it to be an enumerator, but in one case in thread.d, the constant had type int. Adding the ability to import a C++ enumerator also fixed that, but that led to a crash in force_decl_die, which didn't know what to do with a CONST_DECL. So now it does. Co-authored-by: Nathan Sidwell <nathan@acm.org> gcc/cp/ChangeLog: * cp-tree.h (USING_DECL_UNRELATED_P): New. (CONST_DECL_USING_P): New. * class.c (handle_using_decl): If USING_DECL_UNRELATED_P, clone the CONST_DECL. * name-lookup.c (supplement_binding_1): A clone hides its using-declaration. (lookup_using_decl): Rewrite to separate lookup and validation. (do_class_using_decl): Adjust. (finish_nonmember_using_decl): Adjust. * parser.c (make_location): Add cp_token overload. (finish_using_decl): Split out from... (cp_parser_using_declaration): ...here. Don't look through enums. (cp_parser_using_enum): New. (cp_parser_block_declaration): Call it. (cp_parser_member_declaration): Call it. * semantics.c (finish_id_expression_1): Handle enumerator used from class scope. gcc/ChangeLog: * dwarf2out.c (gen_enumeration_type_die): Call equate_decl_number_to_die for enumerators. (gen_member_die): Don't move enumerators to their enclosing class. (dwarf2out_imported_module_or_decl_1): Allow importing individual enumerators. (force_decl_die): Handle CONST_DECL. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/inh-ctor28.C: Adjust expected diagnostic. * g++.dg/cpp0x/inh-ctor33.C: Likewise. * g++.dg/cpp0x/using-enum-1.C: Add comment. * g++.dg/cpp0x/using-enum-2.C: Allowed in C++20. * g++.dg/cpp0x/using-enum-3.C: Likewise. * g++.dg/cpp1z/class-deduction69.C: Adjust diagnostic. * g++.dg/inherit/using5.C: Likewise. * g++.dg/cpp2a/using-enum-1.C: New test. * g++.dg/cpp2a/using-enum-2.C: New test. * g++.dg/cpp2a/using-enum-3.C: New test. * g++.dg/cpp2a/using-enum-4.C: New test. * g++.dg/cpp2a/using-enum-5.C: New test. * g++.dg/cpp2a/using-enum-6.C: New test. * g++.dg/debug/dwarf2/using-enum.C: New test.
2020-11-13[PATCH] Implementation of asm goto outputsVladimir N. Makarov20-59/+455
gcc/ * cfgexpand.c (expand_asm_stmt): Output asm goto with outputs too. Place insns after asm goto on edges. * doc/extend.texi: Reflect the changes in asm goto documentation. * gimple.c (gimple_build_asm_1): Remove an assert checking output absence for asm goto. * gimple.h (gimple_asm_label_op, gimple_asm_set_label_op): Take possible asm goto outputs into account. * ira.c (ira): Remove critical edges for potential asm goto output reloads. (ira_nullify_asm_goto): New function. * ira.h (ira_nullify_asm_goto): New prototype. * lra-assigns.c (lra_split_hard_reg_for): Use ira_nullify_asm_goto. Check that splitting is done inside a basic block. * lra-constraints.c (curr_insn_transform): Permit output reloads for any jump insn. * lra-spills.c (lra_final_code_change): Remove USEs added in ira for asm gotos. * lra.c (lra_process_new_insns): Place output reload insns after jumps in the beginning of destination BBs. * reload.c (find_reloads): Report error for asm gotos with outputs. Modify them to keep CFG consistency to avoid crashes. * tree-into-ssa.c (rewrite_stmt): Don't put debug stmt after asm goto. gcc/c/ * c-parser.c (c_parser_asm_statement): Parse outputs for asm goto too. * c-typeck.c (build_asm_expr): Remove an assert checking output absence for asm goto. gcc/cp * parser.c (cp_parser_asm_definition): Parse outputs for asm goto too. gcc/testsuite/ * c-c++-common/asmgoto-2.c: Permit output in asm goto. * gcc.c-torture/compile/asmgoto-2.c: New. * gcc.c-torture/compile/asmgoto-3.c: New. * gcc.c-torture/compile/asmgoto-4.c: New. * gcc.c-torture/compile/asmgoto-5.c: New.
2020-11-13openmp: Support allocate for C/C++ array section reductionsJakub Jelinek2-20/+55
This adds allocate clause support for array section reductions. Furthermore, it fixes one bug that would cause inscan reductions with allocate to be rejected by C, and for now just ignores allocate for inscan/task reductions, that will need slightly more work. 2020-11-13 Jakub Jelinek <jakub@redhat.com> gcc/ * omp-low.c (scan_sharing_clauses): For now remove for reduction clauses with inscan or task modifiers decl from allocate_map. (lower_private_allocate): Handle TYPE_P (new_var). (lower_rec_input_clauses): Handle allocate clause for C/C++ array reductions. gcc/c/ * c-typeck.c (c_finish_omp_clauses): Don't clear OMP_CLAUSE_REDUCTION_INSCAN unless reduction_seen == -2. libgomp/ * testsuite/libgomp.c-c++-common/allocate-1.c (foo): Add tests for array reductions. (main): Adjust foo callers.
2020-11-13ipa-cp: One more safe_add (PR 97816)Martin Jambor1-1/+2
The new behavior of safe_add triggered an ICE because of one use where it had not been used instead of a simple addition. I'll fix it with the following obvious patch so that periodic benchmarkers can continue working because a proper fix (see below) will need a review. The testcase showed me, however, that we can propagate time and cost from one lattice to another more than once even when that was not the intent. I'll address that as a follow-up after I verify it does not affect the IPA-CP heuristics too much or change the corresponding params accordingly. Bootstrapped and tested on x86_64-linux. gcc/ChangeLog: 2020-11-13 Martin Jambor <mjambor@suse.cz> PR ipa/97816 * ipa-cp.c (value_topo_info<valtype>::propagate_effects): Use safe_add instead of a simple addition.
2020-11-13Do not warn about unused macros while processing #pragma GCC optimizePiotr H. Dabrowski1-7/+7
libcpp PR c++/91318 * include/cpplib.h: Added cpp_define_unused(), cpp_define_formatted_unused() * directives.c: Likewise. gcc/c-family PR c++/91318 * c-cppbuiltin.c: c_cpp_builtins_optimize_pragma(): use cpp_define_unused()
2020-11-13Add 3 new EVRP testcases.Andrew MacLeod3-0/+90
test new evrp functionality. gcc/testsuite/ * gcc.dg/tree-ssa/evrp20.c * gcc.dg/tree-ssa/evrp21.c * gcc.dg/tree-ssa/evrp22.c
2020-11-13testsuite: move expected error locationMartin Liska1-2/+2
gcc/testsuite/ChangeLog: PR testsuite/97788 * g++.dg/ubsan/pr61272.C: Move expected error location.
2020-11-13MSP430: Skip index-1.c testJozef Lawrynowicz1-0/+2
To access the "n - 100000"th element of "a" in this test, GCC will generate the following code for msp430-elf with -mcpu=msp430x: RLAM.W #1, R12 MOV.W a-3392(R12), R12 Since there aren't actually 100,000 elements in a, this means that "a-3392" offset calculated by the linker can overflow, as the address of "a" can validly be less than 3392. The relocations used for -mcpu=msp430 and -mlarge are not as strict and the calculated value is allowed to wrap around the address space, avoiding relocation overflows. gcc/testsuite/ChangeLog: * gcc.c-torture/execute/index-1.c: Skip for the default MSP430 430X ISA.
2020-11-13MSP430: Implement TARGET_INSN_COSTJozef Lawrynowicz6-5/+189
The length of an insn can be used to calculate its cost, when optimizing for size. When optimizing for speed, this is a good estimate, since the cycle cost of an MSP430 instruction increases with its length. gcc/ChangeLog: * config/msp430/msp430.c (TARGET_INSN_COST): Define. (msp430_insn_cost): New function. * config/msp430/msp430.h (BRANCH_COST): Define. (LOGICAL_OP_NON_SHORT_CIRCUIT): Define. gcc/testsuite/ChangeLog: * gcc.target/msp430/rtx-cost-O3-default.c: New test. * gcc.target/msp430/rtx-cost-O3-f5series.c: New test. * gcc.target/msp430/rtx-cost-Os-default.c: New test. * gcc.target/msp430/rtx-cost-Os-f5series.c: New test.
2020-11-13MSP430: Add defaulting to the insn length attributeJozef Lawrynowicz5-121/+506
The length of MSP430 instructions is mostly just a function of the type and number of operands. Setting the "type" attribute on all insns describes the number of operands, and the position of the source and destination operands. In most cases, defaulting in the "length" and "extension" attribute definitions can then be used to calculate the total length of the instruction by using the value of the "type" attribute to examine the operands. gcc/ChangeLog: * config/msp430/msp430-protos.h (msp430x_extendhisi): Return int instead of char *. (msp430_output_asm_shift_insns): Likewise. Add new return_length argument. (msp430x_insn_required): Add prototype. * config/msp430/msp430.c (msp430_output_asm_shift_insns): Return the total length, in bytes, of the emitted instructions. (msp430x_insn_required): New function. (msp430x_extendhisi): Return the total length, in bytes, of the emitted instructions. * config/msp430/msp430.h (ADJUST_INSN_LENGTH): Define. * config/msp430/msp430.md: New define_attr "type". New define_attr "extension". New define_attr "length_multiplier". New define_attr "extra_length". Rewrite define_attr "length". Set type, extension, length, length_multiplier or extra_length insn attributes on all insns, as appropriate. (andneghi3): Rewrite using constraints instead of C code to decide output insns. * config/msp430/predicates.md (msp430_cheap_operand): New predicate. (msp430_high_memory_operand): New predicate.
2020-11-13MSP430: Implement TARGET_RTX_COSTSJozef Lawrynowicz1-17/+485
Costs of MSP430 instructions are mostly just a function of the type and number of operands; knowledge of the specific instruction often isn't required to calculate the cost. In these cases, TARGET_RTX_COSTS just needs to examine the operands to calculate the cost of the expression. For more complicated operations where library helper functions are required, if the cost cannot be accurately calculated, it is estimated and disparaged relative to the cost of a single instruction. gcc/ChangeLog: * config/msp430/msp430.c (use_helper_for_const_shift): Add forward declaration. Remove unused argument. (struct msp430_multlib_costs): New struct. (msp430_is_mem_indirect): New function. (msp430_costs): Likewise. (msp430_shift_costs): Likewise. (msp430_muldiv_costs): Likewise. (msp430_get_inner_dest_code): Likewise. (msp430_single_op_cost): Likewise. (msp430_rtx_costs): Rewrite from scratch. (msp430_expand_shift): Adjust use_helper_for_const_shift call.
2020-11-13MSP430: Implement TARGET_MEMORY_MOVE_COSTJozef Lawrynowicz1-0/+129
The cycle and size cost of a MOV instruction in different addressing modes can be used to calculate the TARGET_MEMORY_MOVE_COST relative to TARGET_REGISTER_MOVE_COST. gcc/ChangeLog: * config/msp430/msp430.c (struct single_op_cost): New struct. (struct double_op_cost): Likewise. (TARGET_REGISTER_MOVE_COST): Don't define but add comment. (TARGET_MEMORY_MOVE_COST): Define to... (msp430_memory_move_cost): New function. (BRANCH_COST): Don't define but add comment.
2020-11-13Improve handling of memory operands in ipa-icf 2/4Jan Hubicka9-24/+499
this patch iplements new class ao_compare that is derived from operand_compare and adds a method to compare and hash ao_refs. This is used by ICF to enable more merging. Comparsion is done as follows 1) Verify that the memory access will happen at the same address and will have same size. For constant addresses this is done by comparing ao_ref_base and offset/size For varable accesses it uses operand_equal_p but with OEP_ADDRESS (that does not match TBAA metadata) and then operand_equal_p on type size. 2) Compare alignments. I use get_object_alignment_1 like ipa-icf did before revamp to operand_equal_p in gcc 9. I noticed that return value is bitodd so added a comment 3) Match MR_DEPENDENCE_CLIQUE At this point the memory refrences are same except for TBAA information. We continue by checking 4) ref and base alias sets. Now if lto streaming is going to happen instead of comparing alias sets themselves we compare alias_ptr_types (the patch depends on the ao_ref_alias_ptr_tyep and ao_ref_base_alias_ptr_type acessors I sent yesterday) 5) See if accesses are view converted. If they are we are done since access path is not present 6) Compare the part of access path relevant for TBAA. I recall FRE relies on the fact that if base and ref types are same the access path is, but I do not thing this is 100% reliable especially with LTO alias sets. The access path comparsion logic is also useful for modref (for next stage1). Tracking the access paths improves quite noticeably disambiguation in C++ code by being able to distinquish different fields of same type within a struct. I had the comparsion logic in my tree for some time and it seems to work quite well. During cc1plus build we have some cases where we find mismatch after matching the base/ref alias sets. These are due to failed type merging: access path oracle in LTO uses TYPE_MAIN_VARIANTs. I implemented relatively basic hashing using base and offset. gcc/ChangeLog: * ipa-icf-gimple.c: Include tree-ssa-alias-compare.h. (find_checker::func_checker): Initialize m_tbaa. (func_checker::hash_operand): Use hash_ao_ref for memory accesses. (func_checker::compare_operand): Use compare_ao_refs for memory accesses. (func_checker::cmopare_gimple_assign): Do not check LHS types of memory stores. * ipa-icf-gimple.h (func_checker): Derive from ao_compare; add m_tbaa. * ipa-icf.c: Include tree-ssa-alias-compare.h. (sem_function::equals_private): Update call of func_checker::func_checker. * ipa-utils.h (lto_streaming_expected_p): New inline predicate. * tree-ssa-alias-compare.h: New file. * tree-ssa-alias.c: Include tree-ssa-alias-compare.h and bultins.h (view_converted_memref_p): New function. (types_equal_for_same_type_for_tbaa_p): New function. (ao_ref_alias_ptr_type, ao_ref_base_alias_ptr_type): New functions. (ao_compare::compare_ao_refs): New member function. (ao_compare::hash_ao_ref): New function * tree-ssa-alias.h (ao_ref_base_alias_ptr_type, ao_ref_alias_ptr_type): Declare. gcc/testsuite/ChangeLog: * c-c++-common/Wstringop-overflow-2.c: Disable ICF. * g++.dg/warn/Warray-bounds-8.C: Disable ICF.
2020-11-13Determine access types in ipa-icf-gimple.cJan Hubicka3-43/+123
This patch adds logic to determine access type (normal or memory) for every operand. This makes it possible to compare memory accesses more carefully which will be implemented in a followup patch. * ipa-icf-gimple.c: Include gimple-walk.h. (func_checker::compare_ssa_name): Update call of compare_operand. (func_checker::hash_operand): Fix comment and add variant taking operand_access_type parameter. (func_checker::compare_operand): Add operand_access_type parameter. (func_checker::compare_asm_inputs_outputs): Add operand_access_type_map parameter; update use of func_checker::compare_operand. (func_checker::compare_gimple_call): Update use of func_checker::compare_operand. (func_checker::compare_gimple_assign): Likewise. (func_checker::compare_gimple_cond): Likewise. (func_checker::compare_gimple_switch): Likewise. (func_checker::compare_gimple_return): Likewise. (func_checker::compare_gimple_goto): Likewise. (func_checker::compare_gimple_asm): Likewise. (visit_load_store): New static functio. (func_checker::classify_operands): New member function. (func_checker::get_operand_access_type): New member function. * ipa-icf-gimple.h (func_checker::operand_access_type): New enum (func_checker::operand_access_type_map): New typedef. (func_checker::compare_operand): Update prototype. (func_checker::compare_asm_inputs_outputs): Likewise. (func_checker::cleassify_operands): Declare. (func_checker::get_operand_access_type): Declare. (func_checker::hash_operand): New variant with operand_access_type. * ipa-icf.c (sem_function::hash_stmt): Update uses of hash_operand. (sem_function::compare_phi_node): Update use of compare_operand.
2020-11-13arm: Make use of RTL predicatesAndrea Corallo2-46/+46
2020-11-13 Andrea Corallo <andrea.corallo@arm.com> * config/arm/aarch-common.c (aarch_accumulator_forwarding): Use RTL predicates where possible. * config/arm/arm.c (legitimate_pic_operand_p) (legitimize_pic_address, arm_is_segment_info_known) (can_avoid_literal_pool_for_label_p) (thumb1_legitimate_address_p, arm_legitimize_address) (arm_tls_referenced_p, thumb_legitimate_constant_p) (REG_OR_SUBREG_REG, thumb1_rtx_costs, thumb1_size_rtx_costs) (arm_adjust_cost, arm_coproc_mem_operand_wb) (neon_vector_mem_operand, neon_struct_mem_operand) (symbol_mentioned_p, label_mentioned_p, ) (load_multiple_sequence, store_multiple_sequence) (arm_select_cc_mode, arm_reload_in_hi, arm_reload_out_hi) (mem_ok_for_ldrd_strd, arm_emit_call_insn, output_move_neon) (arm_attr_length_move_neon, arm_assemble_integer) (arm_emit_coreregs_64bit_shift, arm_valid_symbolic_address_p) (extract_base_offset_in_addr, fusion_load_store): Likewise.
2020-11-13Cleanup range of address calculations.Andrew MacLeod4-32/+107
Align EVRP and ranger for how ranges of ADDR_EXPR are calculated. gcc/ * gimple-range.cc: (gimple_ranger::range_of_range_op): Check for ADDR_EXPR and call range_of_address. (gimple_ranger::range_of_address): Rename from range_of_non_trivial_assignment and match vrp_stmt_computes_nonzero. * gimple-range.h: (range_of_address): Renamed. * range-op.cc: (pointer_table): Add INTEGER_CST handler. gcc/testsuite/ * gcc.dg/tree-ssa/pr78655.c: New.
2020-11-13loops: Invoke lim after successful loop interchangeMartin Jambor3-8/+15
This patch makes the entry point to loop invariant motion public, so that it can be called after loop interchange when that pass has swapped loops. This avoids the non-LTO -Ofast run-time regressions of 410.bwaves and 503.bwaves_r (which are 19% and 15% faster than current master on an AMD zen2 machine) while not introducing a full LIM pass into the pass pipeline. The patch also adds a parameter which allows not to perform any store motion so that it is not done after an interchange. gcc/ChangeLog: 2020-11-12 Martin Jambor <mjambor@suse.cz> PR tree-optimization/94406 * tree-ssa-loop-im.c (tree_ssa_lim): Renamed to loop_invariant_motion_in_fun, added a parameter to control store motion. (pass_lim::execute): Adjust call to tree_ssa_lim, now loop_invariant_motion_in_fun. * tree-ssa-loop-manip.h (loop_invariant_motion_in_fun): Declare. * gimple-loop-interchange.cc (pass_linterchange::execute): Call loop_invariant_motion_in_fun if any interchange has been done.
2020-11-13improve VN PHI hashingRichard Biener1-6/+21
This reduces the number of collisions for PHIs in the VN hashtable by always hashing the number of predecessors and separately hashing the block number when we never merge PHIs from different blocks. This improves collisions seen for the PR69609 testcase dramatically. 2020-11-13 Richard Biener <rguenther@suse.de> * tree-ssa-sccvn.c (vn_phi_compute_hash): Always hash the number of predecessors. Hash the block number also for loop header PHIs. (expressions_equal_p): Short-cut SSA name compares, remove test for NULL operands. (vn_phi_eq): Cache number of predecessors, change inlined test from expressions_equal_p.
2020-11-13d: Explicitly determine which built-in copysign function to call.Iain Buclaw1-4/+7
For some targets, mathfn_built_in returns NULL as copysign is not implicitly available, causing an ICE. Now copysign is explicitly requested when expanding the intrinsic. gcc/d/ChangeLog: * intrinsics.cc (expand_intrinsic_copysign): Explicitly determine which built-in copysign function to call.
2020-11-13d: Fix ICE in finish_thunk (PR97644)Iain Buclaw7-36/+58
Because this what the upstream reference compiler did, thunks for the D front-end were associated with the class definition, so were forced code-gen even if the target function was extern. This has now been changed so there are now only generated if there is a function definition, fixing the ICE that occurred in PR 97644, which was caused by calling expand_thunk() early. gcc/d/ChangeLog: PR d/97644 * dmd/MERGE: Merge upstream dmd 95044d8e4. * d-target.cc (TargetCPP::thunkMangle): New function. * decl.cc (finish_thunk): Don't force expand thunks for external functions. (make_thunk): Emit thunks only if the function has a definition. Generate correct mangling for thunks to C++ classes. gcc/testsuite/ChangeLog: * gdc.dg/pr92216.d: Update scan-assember.
2020-11-13clang: fix -Wmisleading-indentation warning.Martin Liska1-1/+1
gcc/c-family/c-attribs.c:4698:5: warning: misleading indentation; statement is not part of the previous 'if' [-Wmisleading-indentation] gcc/c-family/ChangeLog: * c-attribs.c (build_attr_access_from_parms): Format properly.
2020-11-13doc : Fix build error from r11-4972.Iain Sandoe1-2/+1
Some tex tools don't allow the @r{} command to be split across lines. Fixed by making the change occupy a long line. gcc/ChangeLog: * doc/extend.texi: Don't try to line-wrap an @r command.
2020-11-13tree-optimization/97812 - fix range query in VRP assert discoveryRichard Biener2-2/+23
This makes sure to properly extend the input range before seeing whether it fits the target. 2020-11-13 Richard Biener <rguenther@suse.de> PR tree-optimization/97812 * tree-vrp.c (register_edge_assert_for_2): Extend the range according to its sign before seeing whether it fits. * gcc.dg/torture/pr97812.c: New testcase.
2020-11-13aarch64: Make use of RTL predicatesAndrea Corallo1-40/+40
2020-11-10 Andrea Corallo <andrea.corallo@arm.com> * config/aarch64/aarch64.c (tls_symbolic_operand_type) (aarch64_load_symref_appropriately, aarch64_mov128_immediate) (aarch64_expand_mov_immediate) (aarch64_maybe_expand_sve_subreg_move) (aarch64_tls_referenced_p, aarch64_cannot_force_const_mem) (aarch64_base_register_rtx_p, aarch64_classify_index) (aarch64_classify_address, aarch64_symbolic_address_p) (aarch64_reinterpret_float_as_int, aarch64_float_const_rtx_p) (aarch64_can_const_movi_rtx_p, aarch64_select_cc_mode) (aarch64_print_operand, aarch64_label_mentioned_p) (aarch64_secondary_reload, aarch64_preferred_reload_class) (aarch64_address_cost, aarch64_tls_symbol_p) (aarch64_classify_symbol, aarch64_legitimate_pic_operand_p) (aarch64_legitimate_constant_p) (aarch64_sve_float_arith_immediate_p) (aarch64_sve_float_mul_immediate_p, aarch64_mov_operand_p) (fusion_load_store): Use RTL operands where possible.
2020-11-13aarch64: Add backend support for expanding __builtin_memsetSudakshina Das8-11/+334
This patch implements aarch64 backend expansion for __builtin_memset. Most of the implementation is based on the expansion of __builtin_memcpy. We change the values of SET_RATIO and MOVE_RATIO for cases where we do not have to strictly align and where we can benefit from NEON instructions in the backend. gcc/ChangeLog: * config/aarch64/aarch64-protos.h (aarch64_expand_setmem): New declaration. * config/aarch64/aarch64.c (aarch64_gen_store_pair): Add case for E_V16QImode. (aarch64_set_one_block_and_progress_pointer): New helper for aarch64_expand_setmem. (aarch64_expand_setmem): Define the expansion for memset. * config/aarch64/aarch64.h (CLEAR_RATIO): Tweak to favor aarch64_expand_setmem when allowed and profitable. (SET_RATIO): Likewise. * config/aarch64/aarch64.md: Define pattern for setmemdi. gcc/testsuite/ChangeLog: * g++.dg/tree-ssa/pr90883.C: Remove xfail for aarch64. * gcc.dg/tree-prof/stringop-2.c: Add xfail for aarch64. * gcc.target/aarch64/memset-corner-cases.c: New test. * gcc.target/aarch64/memset-q-reg.c: New test.
2020-11-13C-Family, Objective-C : Implement Objective-C nullability Part 1[PR90707].Iain Sandoe13-3/+272
This part of the implementation covers property nullability attributes and includes the changes to common code. Follow-on changes will be needed to cover Objective-C method definitions, but those are expected to be local to the Objective-C front end. The basis of the implementation is to translate the Objective-C-specific keywords into an attribute (objc_nullability) which has the required states to carry the attribute markup. We introduce the keywords, and these are parsed and validated in the same manner as other property attributes. The resulting value is attached to the property as an objc_nullability attribute. gcc/c-family/ChangeLog: PR objc/90707 * c-common.c (c_common_reswords): null_unspecified, nullable, nonnull, null_resettable: New keywords. * c-common.h (enum rid): RID_NULL_UNSPECIFIED, RID_NULLABLE, RID_NONNULL, RID_NULL_RESETTABLE: New. (OBJC_IS_PATTR_KEYWORD): Include nullability keywords in the ranges accepted for property attributes. * c-attribs.c (handle_objc_nullability_attribute): New. * c-objc.h (enum objc_property_attribute_group): Add OBJC_PROPATTR_GROUP_NULLABLE. (enum objc_property_attribute_kind):Add OBJC_PROPERTY_ATTR_NULL_UNSPECIFIED, OBJC_PROPERTY_ATTR_NULLABLE, OBJC_PROPERTY_ATTR_NONNULL, OBJC_PROPERTY_ATTR_NULL_RESETTABLE. gcc/objc/ChangeLog: PR objc/90707 * objc-act.c (objc_prop_attr_kind_for_rid): Handle nullability. (objc_add_property_declaration): Handle nullability attributes. Check that these are applicable to the property type. * objc-act.h (enum objc_property_nullability): New. gcc/testsuite/ChangeLog: PR objc/90707 * obj-c++.dg/property/at-property-4.mm: Add basic nullability tests. * objc.dg/property/at-property-4.m: Likewise. * obj-c++.dg/attributes/nullability-00.mm: New test. * obj-c++.dg/property/nullability-00.mm: New test. * objc.dg/attributes/nullability-00.m: New test. * objc.dg/property/nullability-00.m: New test. gcc/ChangeLog: PR objc/90707 * doc/extend.texi: Document the objc_nullability attribute.
2020-11-13Objective-C [3/3] : Implement Wobjc-root-class [PR77404].Iain Sandoe106-19/+117
Add Wno-objc-root-class where needed to the objective-c++ tests. gcc/testsuite/ChangeLog: PR objc/77404 * obj-c++.dg/attributes/class-attribute-1.mm: Add Wno-objc-root-class. * obj-c++.dg/attributes/class-attribute-2.mm: Likewise. * obj-c++.dg/attributes/class-attribute-3.mm: Likewise. * obj-c++.dg/attributes/method-deprecated-1.mm: Likewise. * obj-c++.dg/attributes/method-deprecated-2.mm: Likewise. * obj-c++.dg/attributes/method-deprecated-3.mm: Likewise. * obj-c++.dg/attributes/method-format-1.mm: Likewise. * obj-c++.dg/attributes/method-nonnull-1.mm: Likewise. * obj-c++.dg/attributes/method-noreturn-1.mm: Likewise. * obj-c++.dg/attributes/method-sentinel-1.mm: Likewise. * obj-c++.dg/attributes/nsobject-01.mm: Likewise. * obj-c++.dg/attributes/parameter-attribute-1.mm: Likewise. * obj-c++.dg/attributes/parameter-attribute-2.mm: Likewise. * obj-c++.dg/attributes/proto-attribute-1.mm: Likewise. * obj-c++.dg/attributes/proto-attribute-3.mm: Likewise. * obj-c++.dg/attributes/proto-attribute-4.mm: Likewise. * obj-c++.dg/attributes/unused-parameter-1.mm: Likewise. * obj-c++.dg/bad-receiver-type.mm: Likewise. * obj-c++.dg/bitfield-3.mm: Likewise. * obj-c++.dg/bitfield-5.mm: Likewise. * obj-c++.dg/class-extension-1.mm: Likewise. * obj-c++.dg/class-extension-2.mm: Likewise. * obj-c++.dg/class-extension-3.mm: Likewise. * obj-c++.dg/class-extension-4.mm: Likewise. * obj-c++.dg/class-protocol-1.mm: Likewise. * obj-c++.dg/comp-types-1.mm: Likewise. * obj-c++.dg/comp-types-10.mm: Likewise. * obj-c++.dg/comp-types-2.mm: Likewise. * obj-c++.dg/comp-types-3.mm: Likewise. * obj-c++.dg/comp-types-5.mm: Likewise. * obj-c++.dg/comp-types-6.mm: Likewise. * obj-c++.dg/comp-types-7.mm: Likewise. * obj-c++.dg/comp-types-8.mm: Likewise. * obj-c++.dg/demangle-2.mm: Likewise. * obj-c++.dg/demangle-3.mm: Likewise. * obj-c++.dg/duplicate-class-1.mm: Likewise. * obj-c++.dg/encode-1-next.mm: Likewise. * obj-c++.dg/encode-1.mm: Likewise. * obj-c++.dg/enhanced-proto-2.mm: Likewise. * obj-c++.dg/exceptions-1.mm: Likewise. * obj-c++.dg/exceptions-3.mm: Likewise. * obj-c++.dg/exceptions-4.mm: Likewise. * obj-c++.dg/exceptions-5.mm: Likewise. * obj-c++.dg/extern-c-1.mm: Likewise. * obj-c++.dg/fobjc-std-1.mm: Likewise. * obj-c++.dg/gnu-api-2-class-meta.mm: Likewise. * obj-c++.dg/gnu-api-2-class.mm: Likewise. * obj-c++.dg/gnu-api-2-ivar.mm: Likewise. * obj-c++.dg/gnu-api-2-method.mm: Likewise. * obj-c++.dg/gnu-api-2-objc.mm: Likewise. * obj-c++.dg/gnu-api-2-objc_msg_lookup.mm: Likewise. * obj-c++.dg/gnu-api-2-object.mm: Likewise. * obj-c++.dg/gnu-api-2-property.mm: Likewise. * obj-c++.dg/gnu-api-2-protocol.mm: Likewise. * obj-c++.dg/gnu-api-2-resolve-method.mm: Likewise. * obj-c++.dg/gnu-api-2-sel.mm: Likewise. * obj-c++.dg/invalid-method-2.mm: Likewise. * obj-c++.dg/ivar-invalid-type-1.mm: Likewise. * obj-c++.dg/ivar-problem-1.mm: Likewise. * obj-c++.dg/lto/lto.exp: Likewise. * obj-c++.dg/lto/trivial-1_0.mm: Likewise. * obj-c++.dg/method-1.mm: Likewise. * obj-c++.dg/method-12.mm: Likewise. * obj-c++.dg/method-18.mm: Likewise. * obj-c++.dg/method-19.mm: Likewise. * obj-c++.dg/method-20.mm: Likewise. * obj-c++.dg/method-3.mm: Likewise. * obj-c++.dg/method-4.mm: Likewise. * obj-c++.dg/method-5.mm: Likewise. * obj-c++.dg/method-8.mm: Likewise. * obj-c++.dg/method-9.mm: Likewise. * obj-c++.dg/method-namespace-1.mm: Likewise. * obj-c++.dg/plugin/diagnostic-test-expressions-1.mm: Likewise. * obj-c++.dg/pr23709.mm: Likewise. * obj-c++.dg/pragma-2.mm: Likewise. * obj-c++.dg/private-1.mm: Likewise. * obj-c++.dg/private-2.mm: Likewise. * obj-c++.dg/property/property.exp: Likewise. * obj-c++.dg/proto-lossage-1.mm: Likewise. * obj-c++.dg/proto-lossage-5.mm: Likewise. * obj-c++.dg/proto-qual-1.mm: Likewise. * obj-c++.dg/protocol-inheritance-1.mm: Likewise. * obj-c++.dg/protocol-inheritance-2.mm: Likewise. * obj-c++.dg/protocol-optional-1.mm: Likewise. * obj-c++.dg/selector-1.mm: Likewise. * obj-c++.dg/selector-2.mm: Likewise. * obj-c++.dg/selector-3.mm: Likewise. * obj-c++.dg/selector-4.mm: Likewise. * obj-c++.dg/strings/strings.exp: Likewise. * obj-c++.dg/stubify-1.mm: Likewise. * obj-c++.dg/stubify-2.mm: Likewise. * obj-c++.dg/super-dealloc-1.mm: Likewise. * obj-c++.dg/super-dealloc-2.mm: Likewise. * obj-c++.dg/sync-3.mm: Likewise. * obj-c++.dg/syntax-error-2.mm: Likewise. * obj-c++.dg/syntax-error-4.mm: Likewise. * obj-c++.dg/syntax-error-7.mm: Likewise. * obj-c++.dg/syntax-error-9.mm: Likewise. * obj-c++.dg/template-4.mm: Likewise. * obj-c++.dg/template-7.mm: Likewise. * obj-c++.dg/template-8.mm: Likewise. * obj-c++.dg/threedotthree-abi-1.mm: Likewise. * obj-c++.dg/torture/dg-torture.exp: Likewise. * obj-c++.dg/torture/strings/strings.exp: Likewise. * obj-c++.dg/try-catch-12.mm: Likewise. * obj-c++.dg/try-catch-13.mm: Likewise.
2020-11-13Objective-C [2/3] : Implement Wobjc-root-class [PR77404].Iain Sandoe124-32/+171
Add "Wno-objc-root-class" to tests in the Objective-C suite where needed. gcc/testsuite/ChangeLog: PR objc/77404 * objc.dg/anon-1.m: Add Wno-objc-root-class. * objc.dg/attributes/class-attribute-1.m: Likewise. * objc.dg/attributes/class-attribute-2.m: Likewise. * objc.dg/attributes/class-attribute-3.m: Likewise. * objc.dg/attributes/method-deprecated-1.m: Likewise. * objc.dg/attributes/method-deprecated-2.m: Likewise. * objc.dg/attributes/method-deprecated-3.m: Likewise. * objc.dg/attributes/method-format-1.m: Likewise. * objc.dg/attributes/method-nonnull-1.m: Likewise. * objc.dg/attributes/method-noreturn-1.m: Likewise. * objc.dg/attributes/method-sentinel-1.m: Likewise. * objc.dg/attributes/nsobject-01.m: Likewise. * objc.dg/attributes/objc-exception-1.m: Likewise. * objc.dg/attributes/parameter-attribute-1.m: Likewise. * objc.dg/attributes/parameter-attribute-2.m: Likewise. * objc.dg/attributes/proto-attribute-1.m: Likewise. * objc.dg/attributes/proto-attribute-2.m: Likewise. * objc.dg/attributes/proto-attribute-3.m: Likewise. * objc.dg/attributes/proto-attribute-4.m: Likewise. * objc.dg/bitfield-2.m: Likewise. * objc.dg/break-in-ifstmt.m: Likewise. * objc.dg/class-1.m: Likewise. * objc.dg/class-extension-1.m: Likewise. * objc.dg/class-extension-2.m: Likewise. * objc.dg/class-extension-3.m: Likewise. * objc.dg/class-extension-4.m: Likewise. * objc.dg/class-protocol-1.m: Likewise. * objc.dg/comp-types-7.m: Likewise. * objc.dg/demangle-1.m: Likewise. * objc.dg/duplicate-class-1.m: Likewise. * objc.dg/encode-6-next.m: Likewise. * objc.dg/encode-6.m: Likewise. * objc.dg/enhanced-proto-2.m: Likewise. * objc.dg/exceptions-1.m: Likewise. * objc.dg/exceptions-3.m: Likewise. * objc.dg/exceptions-4.m: Likewise. * objc.dg/exceptions-5.m: Likewise. * objc.dg/fobjc-std-1.m: Likewise. * objc.dg/foreach-2.m: Likewise. * objc.dg/foreach-4.m: Likewise. * objc.dg/foreach-5.m: Likewise. * objc.dg/fsyntax-only.m: Likewise. * objc.dg/gnu-api-2-class-meta.m: Likewise. * objc.dg/gnu-api-2-class.m: Likewise. * objc.dg/gnu-api-2-ivar.m: Likewise. * objc.dg/gnu-api-2-method.m: Likewise. * objc.dg/gnu-api-2-objc.m: Likewise. * objc.dg/gnu-api-2-objc_msg_lookup.m: Likewise. * objc.dg/gnu-api-2-object.m: Likewise. * objc.dg/gnu-api-2-property.m: Likewise. * objc.dg/gnu-api-2-protocol.m: Likewise. * objc.dg/gnu-api-2-resolve-method.m: Likewise. * objc.dg/gnu-api-2-sel.m: Likewise. * objc.dg/incomplete-type-1.m: Likewise. * objc.dg/instancetype-0.m: Likewise. * objc.dg/invalid-method-2.m: Likewise. * objc.dg/ivar-invalid-type-1.m: Likewise. * objc.dg/ivar-problem-1.m: Likewise. * objc.dg/ivar-scope-1.m: Likewise. * objc.dg/ivar-scope-2.m: Likewise. * objc.dg/ivar-scope-4.m: Likewise. * objc.dg/ivar-visibility-1.m: Likewise. * objc.dg/ivar-visibility-2.m: Likewise. * objc.dg/ivar-visibility-3.m: Likewise. * objc.dg/ivar-visibility-4.m: Likewise. * objc.dg/local-decl-1.m: Likewise. * objc.dg/lto/lto.exp: Likewise. * objc.dg/lto/trivial-1_0.m: Likewise. * objc.dg/method-1.m: Likewise. * objc.dg/method-12.m: Likewise. * objc.dg/method-13.m: Likewise. * objc.dg/method-14.m: Likewise. * objc.dg/missing-proto-3.m: Likewise. * objc.dg/next-runtime-1.m: Likewise. * objc.dg/objc-foreach-1.m: Likewise. * objc.dg/objc-foreach-2.m: Likewise. * objc.dg/objc-foreach-3.m: Likewise. * objc.dg/objc-nofilename-1.m: Likewise. * objc.dg/param-1.m: Likewise. * objc.dg/pch/pch.exp: Likewise. * objc.dg/plugin/diagnostic-test-expressions-1.m: Likewise. * objc.dg/pr23709.m: Likewise. * objc.dg/private-1.m: Likewise. * objc.dg/private-2.m: Likewise. * objc.dg/property/property.exp: Likewise. * objc.dg/proto-hier-1.m: Likewise. * objc.dg/proto-hier-2.m: Likewise. * objc.dg/proto-lossage-1.m: Likewise. * objc.dg/proto-lossage-5.m: Likewise. * objc.dg/proto-qual-1.m: Likewise. * objc.dg/protocol-inheritance-1.m: Likewise. * objc.dg/protocol-inheritance-2.m: Likewise. * objc.dg/protocol-optional-1.m: Likewise. * objc.dg/selector-1.m: Likewise. * objc.dg/selector-2.m: Likewise. * objc.dg/selector-3.m: Likewise. * objc.dg/selector-4.m: Likewise. * objc.dg/shadow-1.m: Likewise. * objc.dg/shadow-2.m: Likewise. * objc.dg/special/load-category-1.m: Likewise. * objc.dg/special/load-category-2.m: Likewise. * objc.dg/special/load-category-3.m: Likewise. * objc.dg/special/special.exp: Likewise. * objc.dg/special/unclaimed-category-1.h: Likewise. * objc.dg/special/unclaimed-category-1.m: Likewise. * objc.dg/stabs-1.m: Likewise. * objc.dg/strings/strings.exp: Likewise. * objc.dg/stubify-1.m: Likewise. * objc.dg/stubify-2.m: Likewise. * objc.dg/super-class-2.m: Likewise. * objc.dg/super-dealloc-1.m: Likewise. * objc.dg/super-dealloc-2.m: Likewise. * objc.dg/sync-3.m: Likewise. * objc.dg/threedotthree-abi-1.m: Likewise. * objc.dg/torture/dg-torture.exp: Likewise. * objc.dg/torture/strings/strings.exp: Likewise. * objc.dg/try-catch-11.m: Likewise. * objc.dg/try-catch-12.m: Likewise. * objc.dg/type-size-2.m: Likewise. * objc.dg/type-size-3.m: Likewise. * objc.dg/type-size-4.m: Likewise. * objc.dg/type-size-5.m: Likewise. * objc.dg/undeclared-selector.m: Likewise. * objc.dg/volatile-1.m: Likewise.
2020-11-13C-family, Objective-C [1/3] : Implement Wobjc-root-class [PR77404].Iain Sandoe13-6/+96
This warning catches the case that the user has left the superclass specification from a class interface. Root classes are, of course, permitted and an attribute is added to mark these so that the diagnostic is suppressed. The warning and attribute spellings have been kept in sync with the language reference implementation (clang). The diagnostic location information present in the objective-c interface and class definitions is relatively poor. This patch adds a location for the class name to the interface and makes use of it in existing warnings. Part 1 is the changes to code and added tests. Many entries in the testsuite make use of root classes so there are a large number of mechanical changes there adding "-Wno-objc-root-class" to the options. The test changes are parts 2 (objective-c) and 3 (objective-c++) in the patch series. gcc/c-family/ChangeLog: PR objc/77404 * c-attribs.c (handle_objc_root_class_attribute): New * c-objc.h (objc_start_class_interface): Add a location value for the position of the class name. * c.opt: Add Wobjc-root-class. * stub-objc.c (objc_start_class_interface): Add a location value for the position of the class name. gcc/c/ChangeLog: PR objc/77404 * c-parser.c (c_parser_objc_class_definition): Pass the location of the class name to the interface declaration. gcc/cp/ChangeLog: PR objc/77404 * parser.c (cp_parser_objc_class_interface): Pass the location of the class name to the interface declaration. gcc/objc/ChangeLog: PR objc/77404 * objc-act.c (objc_start_class_interface): Accept the location of the class name, use it in existing diagnostic. (start_class): Accept obj_root_class type attributes. Warn when the interface for an implementation does not contain a super class (unless the diagnostic is suppressed by the the command line flag or the objc_root_class type attribute). gcc/testsuite/ChangeLog: PR objc/77404 * objc.dg/attributes/root-class-01.m: New test. * objc.dg/root-class-00.m: New test. * obj-c++.dg/attributes/root-class-01.mm: New test. * obj-c++.dg/root-class-00.mm: New test. gcc/ChangeLog: PR objc/77404 * doc/extend.texi: Document the objc_root_class attribute. * doc/invoke.texi: Document -Wobjc-root-class.
2020-11-13remove almost all users of gimple_expr_codeRichard Biener5-23/+12
This replaces the old-school gimple_expr_code with more selective functions throughout the compiler, in all cases making the code shorter or more clear. 2020-11-13 Richard Biener <rguenther@suse.de> * cfgexpand.c (gimple_assign_rhs_to_tree): Use gimple_assign_rhs_class. (expand_gimple_stmt_1): Likewise. * gimplify-me.c (gimple_regimplify_operands): Use gimple_assign_single_p. * ipa-icf-gimple.c (func_checker::compare_gimple_assign): Remove redundant compare. (func_checker::compare_gimple_cond): Use gimple_cond_code. * tree-ssa-tail-merge.c (gimple_equal_p): Likewise. * predict.c (predict_loops): Use gimple_assign_rhs_code.
2020-11-13Inline delegators in vrp_folder.Aldy Hernandez1-20/+13
gcc/ChangeLog: * tree-vrp.c (class vrp_folder): Make visit_stmt, visit_phi, and m_vr_values private. (vrp_folder::vrp_evaluate_conditional): Remove. (vrp_folder::vrp_simplify_stmt_using_ranges): Remove. (vrp_folder::fold_predicate_in): Inline vrp_evaluate_conditional and vrp_simplify_stmt_using_ranges. (vrp_folder::fold_stmt): Same.
2020-11-13Move vr_values out of vrp_prop into execute_vrp so it can be shared.Aldy Hernandez1-24/+29
vr_values is being shared among the propagator and the folder and passed around. I've pulled it out from the propagator so it can be passed around to each, instead of being publicly accessible from the propagator. gcc/ChangeLog: * tree-vrp.c (class vrp_prop): Rename vr_values to m_vr_values. (vrp_prop::vrp_prop): New. (vrp_prop::initialize): Rename vr_values to m_vr_values. (vrp_prop::visit_stmt): Same. (vrp_prop::visit_phi): Same. (vrp_prop::finalize): Same. (execute_vrp): Instantiate vrp_vr_values and pass it to folder and propagator.
2020-11-13Move vrp_prop before vrp_folder.Aldy Hernandez1-100/+100
gcc/ChangeLog: * tree-vrp.c (class vrp_prop): Move entire class... (class vrp_folder): ...before here.
2020-11-13Refactor VRP threading code into vrp_jump_threader class.Aldy Hernandez1-72/+72
gcc/ChangeLog: * tree-vrp.c (identify_jump_threads): Refactor to.. (vrp_jump_threader::vrp_jump_threader): ...here (vrp_jump_threader::~vrp_jump_threader): ...and here. (vrp_jump_threader::after_dom_children): Rename vr_values to m_vr_values. (execute_vrp): Use vrp_jump_threader.
2020-11-13Group tree-vrp.c by functionality.Aldy Hernandez1-914/+901
Earlier in this cycle there was some work by Giuliano Belinassi and myself to refactor tree-vrp.c. A lot of functions and globals were moved into independent classes, but the haphazard layout remained. Assertion methods were indispersed with the propagation code, and with the jump threading code, etc etc. This series of patches moves things around so that common functionality is geographically close. There is no change in behavior. I know this is all slated to go in the next release, but finding things in the current code base, even if just to compare with the ranger, is difficult. Since I keep getting bit by aarch64 regressions, I've tested the whole set of patches on aarch64, as well as individually on x86-64 Linux. gcc/ChangeLog: * tree-vrp.c (struct assert_locus): Move. (class vrp_insert): Rename to vrp_asserts. (vrp_insert::build_assert_expr_for): Move to vrp_asserts. (fp_predicate): Same. (vrp_insert::dump): Same. (vrp_insert::register_new_assert_for): Same. (extract_code_and_val_from_cond_with_ops): Move. (vrp_insert::finish_register_edge_assert_for): Move to vrp_asserts. (maybe_set_nonzero_bits): Move. (vrp_insert::find_conditional_asserts): Move to vrp_asserts. (stmt_interesting_for_vrp): Move. (struct case_info): Move. (compare_case_labels): Move. (lhs_of_dominating_assert): Move. (find_case_label_index): Move. (find_case_label_range): Move. (class vrp_asserts): New. (vrp_asserts::build_assert_expr_for): Rename from vrp_insert. (vrp_asserts::dump): Same. (vrp_asserts::register_new_assert_for): Same. (vrp_asserts::finish_register_edge_assert_for): Same. (vrp_asserts::find_conditional_asserts): Same. (vrp_asserts::compare_case_labels): Same. (vrp_asserts::find_switch_asserts): Same. (vrp_asserts::find_assert_locations_in_bb): Same. (vrp_asserts::find_assert_locations): Same. (vrp_asserts::process_assert_insertions_for): Same. (vrp_asserts::compare_assert_loc): Same. (vrp_asserts::process_assert_insertions): Same. (vrp_asserts::insert_range_assertions): Same. (vrp_asserts::all_imm_uses_in_stmt_or_feed_cond): Same. (vrp_asserts::remove_range_assertions): Same. (class vrp_prop): Move. (all_imm_uses_in_stmt_or_feed_cond): Move. (vrp_prop::vrp_initialize): Move. (class vrp_folder): Move. (vrp_folder::fold_predicate_in): Move. (vrp_folder::fold_stmt): Move. (vrp_prop::initialize): Move. (vrp_prop::visit_stmt): Move. (enum ssa_prop_result): Move. (vrp_prop::visit_phi): Move. (vrp_prop::finalize): Move. (class vrp_dom_walker): Rename to... (class vrp_jump_threader): ...this. (vrp_jump_threader::before_dom_children): Rename from vrp_dom_walker. (simplify_stmt_for_jump_threading): Rename to... (vrp_jump_threader::simplify_stmt): ...here. (vrp_jump_threader::after_dom_children): Same. (identify_jump_threads): Move. (vrp_prop::vrp_finalize): Move array bounds setup code to... (execute_vrp): ...here.
2020-11-12Change range_handler, was Re: Fix gimple_expr_code?Andrew MacLeod2-4/+10
Adjust the range_handler to not use gimple_expr_code/type. * gimple-range.h (gimple_range_handler): Use gimple_assign and gimple_cond routines to get type and code. * range-op.cc (range_op_handler): Check for integral types.
2020-11-13Daily bump.GCC Administrator8-1/+442
2020-11-12c++: Don't form a templated TARGET_EXPR in finish_compound_literalPatrick Palka2-6/+16
The atom_cache in normalize_atom relies on the assumption that two equivalent (templated) trees (in the sense of cp_tree_equal) must use the same template parameters (according to find_template_parameters). This assumption unfortunately doesn't always hold for TARGET_EXPRs, because cp_tree_equal ignores an artificial target of a TARGET_EXPR, but find_template_parameters walks this target (and its DECL_CONTEXT). Hence two TARGET_EXPRs built by force_target_expr with the same initializer and under different settings of current_function_decl will compare equal according to cp_tree_equal, but find_template_parameters may return a different set of template parameters for them. This breaks the below testcase because during normalization we build two such TARGET_EXPRs (one under current_function_decl=f and another under =g), and then share the same ATOMIC_CONSTR for the two corresponding atoms, leading to a crash during satisfaction of g's associated constraints. This patch works around this issue by removing the source of these templated TARGET_EXPRs. The relevant call to get_target_expr_sfinae was added in r9-6043, and it seems it's no longer necessary (according to https://gcc.gnu.org/pipermail/gcc-patches/2019-February/517323.html, the call was added in order to avoid regressing on initlist109.C at the time). gcc/cp/ChangeLog: * semantics.c (finish_compound_literal): Don't wrap the original compound literal in a TARGET_EXPR when inside a template. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-decltype3.C: New test.
2020-11-12jit: add support for inline asm [PR87291]David Malcolm21-505/+4318
This patch adds various entrypoints to libgccjit for directly embedding asm statements into a compile, analogous to inline asm in the C frontend: gcc_jit_block_add_extended_asm gcc_jit_block_end_with_extended_asm_goto gcc_jit_extended_asm_as_object gcc_jit_extended_asm_set_volatile_flag gcc_jit_extended_asm_set_inline_flag gcc_jit_extended_asm_add_output_operand gcc_jit_extended_asm_add_input_operand gcc_jit_extended_asm_add_clobber gcc_jit_context_add_top_level_asm gcc/jit/ChangeLog: PR jit/87291 * docs/cp/topics/asm.rst: New file. * docs/cp/topics/index.rst (Topic Reference): Add it. * docs/topics/asm.rst: New file. * docs/topics/compatibility.rst (LIBGCCJIT_ABI_15): New. * docs/topics/functions.rst (Statements): Add link to extended asm. * docs/topics/index.rst (Topic Reference): Add asm.rst. * docs/topics/objects.rst: Add gcc_jit_extended_asm to ASCII art. * docs/_build/texinfo/Makefile: Regenerate. * docs/_build/texinfo/libgccjit.texi: Regenerate. * jit-common.h (gcc::jit::recording::extended_asm): New forward decl. (gcc::jit::recording::top_level_asm): Likewise. * jit-playback.c: Include "stmt.h". (build_string): New. (gcc::jit::playback::context::new_string_literal): Disambiguate build_string call. (gcc::jit::playback::context::add_top_level_asm): New. (build_operand_chain): New. (build_clobbers): New. (build_goto_operands): New. (gcc::jit::playback::block::add_extended_asm): New. * jit-playback.h (gcc::jit::playback::context::add_top_level_asm): New decl. (struct gcc::jit::playback::asm_operand): New struct. (gcc::jit::playback::block::add_extended_asm): New decl. * jit-recording.c (gcc::jit::recording::context::dump_to_file): Dump top-level asms. (gcc::jit::recording::context::add_top_level_asm): New. (gcc::jit::recording::block::add_extended_asm): New. (gcc::jit::recording::block::end_with_extended_asm_goto): New. (gcc::jit::recording::asm_operand::asm_operand): New. (gcc::jit::recording::asm_operand::print): New. (gcc::jit::recording::asm_operand::make_debug_string): New. (gcc::jit::recording::output_asm_operand::write_reproducer): New. (gcc::jit::recording::output_asm_operand::print): New. (gcc::jit::recording::input_asm_operand::write_reproducer): New. (gcc::jit::recording::input_asm_operand::print): New. (gcc::jit::recording::extended_asm::add_output_operand): New. (gcc::jit::recording::extended_asm::add_input_operand): New. (gcc::jit::recording::extended_asm::add_clobber): New. (gcc::jit::recording::extended_asm::replay_into): New. (gcc::jit::recording::extended_asm::make_debug_string): New. (gcc::jit::recording::extended_asm::write_flags): New. (gcc::jit::recording::extended_asm::write_clobbers): New. (gcc::jit::recording::extended_asm_simple::write_reproducer): New. (gcc::jit::recording::extended_asm::maybe_populate_playback_blocks): New. (gcc::jit::recording::extended_asm_goto::extended_asm_goto): New. (gcc::jit::recording::extended_asm_goto::replay_into): New. (gcc::jit::recording::extended_asm_goto::write_reproducer): New. (gcc::jit::recording::extended_asm_goto::get_successor_blocks): New. (gcc::jit::recording::extended_asm_goto::maybe_print_gotos): New. (gcc::jit::recording::extended_asm_goto::maybe_populate_playback_blocks): New. (gcc::jit::recording::top_level_asm::top_level_asm): New. (gcc::jit::recording::top_level_asm::replay_into): New. (gcc::jit::recording::top_level_asm::make_debug_string): New. (gcc::jit::recording::top_level_asm::write_to_dump): New. (gcc::jit::recording::top_level_asm::write_reproducer): New. * jit-recording.h (gcc::jit::recording::context::add_top_level_asm): New decl. (gcc::jit::recording::context::m_top_level_asms): New field. (gcc::jit::recording::block::add_extended_asm): New decl. (gcc::jit::recording::block::end_with_extended_asm_goto): New decl. (gcc::jit::recording::asm_operand): New class. (gcc::jit::recording::output_asm_operand): New class. (gcc::jit::recording::input_asm_operand): New class. (gcc::jit::recording::extended_asm): New class. (gcc::jit::recording::extended_asm_simple): New class. (gcc::jit::recording::extended_asm_goto): New class. (gcc::jit::recording::top_level_asm): New class. * libgccjit++.h (gccjit::extended_asm): New forward decl. (gccjit::context::add_top_level_asm): New. (gccjit::block::add_extended_asm): New. (gccjit::block::end_with_extended_asm_goto): New. (gccjit::extended_asm): New class. (gccjit::extended_asm::extended_asm): New ctors. (gccjit::extended_asm::set_volatile_flag): New. (gccjit::extended_asm::set_inline_flag): New. (gccjit::extended_asm::add_output_operand): New. (gccjit::extended_asm::add_input_operand): New. (gccjit::extended_asm::add_clobber): New. (gccjit::extended_asm::get_inner_extended_asm): New. * libgccjit.c (struct gcc_jit_extended_asm): New. (jit_error): Make "loc" param take a gcc::jit::recording::location * rather than a gcc_jit_location *. (gcc_jit_block_add_extended_asm): New entrypoint. (gcc_jit_block_end_with_extended_asm_goto): New entrypoint. (gcc_jit_extended_asm_as_object): New entrypoint. (gcc_jit_extended_asm_set_volatile_flag): New entrypoint. (gcc_jit_extended_asm_set_inline_flag): New entrypoint. (gcc_jit_extended_asm_add_output_operand): New entrypoint. (gcc_jit_extended_asm_add_clobber): New entrypoint. (gcc_jit_context_add_top_level_asm): New entrypoint. * libgccjit.h: Add gcc_jit_extended_asm to ASCII art. (gcc_jit_extended_asm): New typedef. (LIBGCCJIT_HAVE_ASM_STATEMENTS): New define. (gcc_jit_block_add_extended_asm): New entrypoint. (gcc_jit_block_end_with_extended_asm_goto): New entrypoint. (gcc_jit_extended_asm_as_object): New entrypoint. (gcc_jit_extended_asm_set_volatile_flag): New entrypoint. (gcc_jit_extended_asm_set_inline_flag): New entrypoint. (gcc_jit_extended_asm_add_output_operand): New entrypoint. (gcc_jit_extended_asm_add_input_operand): New entrypoint. (gcc_jit_extended_asm_add_clobber): New entrypoint. (gcc_jit_context_add_top_level_asm): New entrypoint. * libgccjit.map (LIBGCCJIT_ABI_15): New. gcc/testsuite/ChangeLog: PR jit/87291 * jit.dg/jit.exp: Load target-supports-dg.exp. Set dg-do-what-default. (jit-dg-test): Set dg-do-what and call dg-get-options, skipping the test if it's not supported on the given target. * jit.dg/test-asm.c: New test. * jit.dg/test-asm.cc: New test.
2020-11-12jit: fix string escapingDavid Malcolm3-13/+55
This patch fixes a bug in recording::string::make_debug_string in which '\t' and '\n' were "escaped" by simply prepending a '\', thus emitting '\' then '\n', rather than '\' then 'n'. It also removes a hack that determined if a string is to be escaped by checking for a leading '"', by instead adding a flag. gcc/jit/ChangeLog: * jit-recording.c (recording::context::new_string): Add "escaped" param and use it when creating the new recording::string instance. (recording::string::string): Add "escaped" param and use it to initialize m_escaped. (recording::string::make_debug_string): Replace check that first char is double-quote with use of m_escaped. Fix escaping of '\t' and '\n'. Set "escaped" on the result. * jit-recording.h (recording::context::new_string): Add "escaped" param. (recording::string::string): Add "escaped" param. (recording::string::m_escaped): New field. gcc/testsuite/ChangeLog: * jit.dg/test-debug-strings.c (create_code): Add tests of string literal escaping.
2020-11-12libgccjit.h: fix typo in commentDavid Malcolm1-1/+1
gcc/jit/ChangeLog: * libgccjit.h: Fix typo in comment.