1. 01 Jan, 2019 1 commit
  2. 21 Nov, 2018 1 commit
    • [PATCH][PR84877]Dynamically align the address for local parameter copy on the… · 0358d788
      [PATCH][PR84877]Dynamically align the address for local parameter copy on the stack when required alignment is larger than MAX_SUPPORTED_STACK_ALIGNMENT
      
      
      As described in PR84877. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84877
      The local copy of parameter on stack is not aligned.
      
      For BLKmode paramters, a local copy on the stack will be saved.
      There are three cases:
      1) arguments passed partially on the stack, partially via registers.
      2) arguments passed fully on the stack.
      3) arguments passed via registers.
      
      After the change here, in all three cases, the stack slot for the local
      parameter copy is aligned by the data type.
      The stack slot is the DECL_RTL of the parameter. All the references thereafter
      in the function will refer to this RTL.
      
      To populate the local copy on the stack,
      For case 1) and 2), there are operations to move data from the caller's stack
      (from incoming rtl) into callee's stack.
      For case 3), the registers are directly saved into the stack slot.
      
      In all cases, the destination address is properly aligned.
      But for case 1) and case 2), the source address is not aligned by the type.
      It is defined by the PCS how the arguments are prepared.
      The block move operation is fulfilled by emit_block_move (). As far as I can see,
      it will use the smaller alignment of source and destination.
      This looks fine as long as we don't use instructions which requires a strict
      larger alignment than the address actually has.
      
      Here, it only changes receiving parameters.
      The function assign_stack_local_1 will be called in various places.
      Usually, the caller will constraint the ALIGN parameter.
      For example via STACK_SLOT_ALIGNMENT macro.
      assign_parm_setup_block will call assign_stack_local () with alignment from the
      parameter type which in this case could be
      larger than MAX_SUPPORTED_STACK_ALIGNMENT.
      
      The alignment operation for parameter copy on the stack is similar to stack vars.
      First, enough space is reserved on the stack. The size is fixed at compile time.
      Instructions are emitted to dynamically get an aligned address at runtime
      within this piece of memory.
      
      This will unavoidably increase the usage of stack. However, it really depends on
      how many over-aligned parameters are passed by value.
      
      
      gcc/
      
      2018-11-21  Renlin Li  <renlin.li@arm.com>
      
      	PR middle-end/84877
      	* explow.h (get_dynamic_stack_size): Declare it as external.
      	* explow.c (record_new_stack_level): Remove function static attribute.
      	* function.c (assign_stack_local_1): Dynamically align the stack slot
      	addr for parameter copy on the stack.
      
      gcc/testsuite/
      
      2018-11-21  Renlin Li  <renlin.li@arm.com>
      
      	PR middle-end/84877
      	* gcc.dg/pr84877.c: New.
      
      From-SVN: r266345
      Renlin Li committed
  3. 01 Oct, 2018 1 commit
    • Add a hook to support telling the mid-end when to probe the stack. · 2c25083e
      This patch adds a hook to tell the mid-end about the probing requirements of the
      target.  On AArch64 we allow a specific range for which no probing needs to
      be done.  This same range is also the amount that will have to be probed up when
      a probe is needed after dropping the stack.
      
      Defining this probe comes with the extra requirement that the outgoing arguments
      size of any function that uses alloca and stack clash be at the very least 8
      bytes.  With this invariant we can skip doing the zero checks for alloca and
      save some code.
      
      A simplified version of the AArch64 stack frame is:
      
         +-----------------------+                                              
         |                       |                                                 
         |                       |                                              
         |                       |                                              
         +-----------------------+                                              
         |LR                     |                                              
         +-----------------------+                                              
         |FP                     |                                              
         +-----------------------+                                              
         |dynamic allocations    | -\      probe range hook effects these       
         +-----------------------+   --\   and ensures that outgoing stack      
         |padding                |      -- args is always > 8 when alloca.      
         +-----------------------+  ---/   Which means it's always safe to probe
         |outgoing stack args    |-/       at SP                                
         +-----------------------+                                              
                                                                                                                 
      
      This allows us to generate better code than without the hook without affecting
      other targets.
      
      With this patch I am also removing the stack_clash_protection_final_dynamic_probe
      hook which was added specifically for AArch64 but that is no longer needed.
      
      gcc/
      
      	PR target/86486
      	* explow.c (anti_adjust_stack_and_probe_stack_clash): Support custom
      	probe ranges.
      	* target.def (stack_clash_protection_alloca_probe_range): New.
      	(stack_clash_protection_final_dynamic_probe): Remove.
      	* targhooks.h (default_stack_clash_protection_alloca_probe_range) New.
      	(default_stack_clash_protection_final_dynamic_probe): Remove.
      	* targhooks.c: Likewise.
      	* doc/tm.texi.in (TARGET_STACK_CLASH_PROTECTION_ALLOCA_PROBE_RANGE): New.
      	(TARGET_STACK_CLASH_PROTECTION_FINAL_DYNAMIC_PROBE): Remove.
      	* doc/tm.texi: Regenerate.
      
      From-SVN: r264750
      Tamar Christina committed
  4. 24 Aug, 2018 1 commit
    • emit-rtl.c (init_emit_once): Do not emit MODE_POINTER_BOUNDS RTXes. · eafa30ef
      	* emit-rtl.c (init_emit_once): Do not emit MODE_POINTER_BOUNDS RTXes.
      	* emit-rtl.h (rtl_data): Remove return_bnd.
      	* explow.c (trunc_int_for_mode): Do not handle POINTER_BOUNDS_MODE_P.
      	* function.c (diddle_return_value): Do not handle crtl->return_bnd.
      	* genmodes.c (complete_mode): Do not handle MODE_POINTER_BOUNDS.
      	(POINTER_BOUNDS_MODE): Remove definition.
      	(make_pointer_bounds_mode): Remove.
      	(get_mode_class): Do not handle MODE_POINTER_BOUNDS.
      	* machmode.h (POINTER_BOUNDS_MODE_P): Remove definition.
      	(scalare_mode::includes_p): Do not handle MODE_POINTER_BOUNDS.
      	* mode-classes.def: Do not define MODE_POINTER_BOUNDS.
      	* stor-layout.c (int_mode_for_mode): Do not handle MODE_POINTER_BOUNDS.
      	* tree-core.h (enum tree_index): Remove TI_POINTER_BOUNDS_TYPE.
      	* varasm.c (output_constant_pool_2): Do not handle MODE_POINTER_BOUNDS.
      
      	* config/i386/i386-modes.def (BND32, BND64): Remove.
      	* config/i386/i386.c (dbx_register_map): Remove bound registers.
      	(dbx64_register_map): Ditto.
      	(svr4_dbx_register_map): Ditto.
      	(indirect_thunk_bnd_needed): Remove.
      	(indirect_thunks_bnd_used): Ditto.
      	(indirect_return_bnd_needed): Ditto.
      	(indirect_return_via_cx_bnd): Ditto.
      	(enum indirect_thunk_prefix): Remove indirect_thunk_prefix_bnd.
      	(indirect_thunk_name): Remove handling of indirect_thunk_prefix_bnd.
      	(output_indirect_thunk): Ditto.  Remove need_prefix argument.
      	(output_indirect_thunk_function): Remove handling of
      	indirect_return_bnd_needed, indirect_return_via_cx_bnd,
      	indirect_thunk_bnd_needed and indirect_thunks_bnd_used variables.
      	(ix86_save_reg): Remove handling of crtl->return_bnd.
      	(ix86_legitimate_constant_p): Remove handling of POINTER_BOUNDS_MODE_P.
      	(ix86_print_operand_address_as): Remove handling of UNSPEC_BNDMK_ADDR
      	and UNSPEC_BNDLX_ADDR.
      	(ix86_output_indirect_branch_via_reg): Remove handling of
      	indirect_thunk_prefix_bnd.
      	(ix86_output_indirect_branch_via_push): Ditto.
      	(ix86_output_function_return): Ditto.
      	(ix86_output_indirect_function_return): Ditto.
      	(avoid_func_arg_motion): Do not handle UNSPEC_BNDSTX.
      	* config/i386/i386.h (FIXED_REGISTERS): Remove bound registers.
      	(CALL_USED_REGISTERS): Ditto.
      	(REG_ALLOC_ORDER): Update for removal of bound registers.
      	(HI_REGISTER_NAMES): Ditto.
      	* config/i386/i386.md (UNSPEC_BNDMK, UNSPEC_BNDMK_ADDR, UNSPEC_BNDSTX)
      	(UNSPEC_BNDLDX, UNSPEC_BNDLDX_ADDR, UNSPEC_BNDCL, UNSPEC_BNDCU)
      	(UNSPEC_BNDCN, UNSPEC_MPX_FENCE): Remove.
      	(BND0_REG, BND1_REG, BND2_REG, BND3_REG): Remove
      	(FIRST_PSEUDO_REG): Update.
      	(BND): Remove mode iterator.
      	* config/i386/predicates.md (bnd_mem_operator): Remove.
      
      From-SVN: r263835
      Uros Bizjak committed
  5. 12 Jun, 2018 1 commit
    • Use poly_int rtx accessors instead of hwi accessors · 5284e559
      This patch generalises various places that used hwi rtx accessors so
      that they can handle poly_ints instead.  In many cases these changes
      are by inspection rather than because something had shown them to be
      necessary.
      
      2018-06-12  Richard Sandiford  <richard.sandiford@linaro.org>
      
      gcc/
      	* poly-int.h (can_div_trunc_p): Add new overload in which all values
      	are poly_ints.
      	* alias.c (get_addr): Extend CONST_INT handling to poly_int_rtx_p.
      	(memrefs_conflict_p): Likewise.
      	(init_alias_analysis): Likewise.
      	* cfgexpand.c (expand_debug_expr): Likewise.
      	* combine.c (combine_simplify_rtx, force_int_to_mode): Likewise.
      	* cse.c (fold_rtx): Likewise.
      	* explow.c (adjust_stack, anti_adjust_stack): Likewise.
      	* expr.c (emit_block_move_hints): Likewise.
      	(clear_storage_hints, push_block, emit_push_insn): Likewise.
      	(store_expr_with_bounds, reduce_to_bit_field_precision): Likewise.
      	(emit_group_load_1): Use rtx_to_poly_int64 for group offsets.
      	(emit_group_store): Likewise.
      	(find_args_size_adjust): Use strip_offset.  Use rtx_to_poly_int64
      	to read the PRE/POST_MODIFY increment.
      	* calls.c (store_one_arg): Use strip_offset.
      	* rtlanal.c (rtx_addr_can_trap_p_1): Extend CONST_INT handling to
      	poly_int_rtx_p.
      	(set_noop_p): Use rtx_to_poly_int64 for the elements selected
      	by a VEC_SELECT.
      	* simplify-rtx.c (avoid_constant_pool_reference): Use strip_offset.
      	(simplify_binary_operation_1): Extend CONST_INT handling to
      	poly_int_rtx_p.
      	* var-tracking.c (compute_cfa_pointer): Take a poly_int64 rather
      	than a HOST_WIDE_INT.
      	(hard_frame_pointer_adjustment): Change from HOST_WIDE_INT to
      	poly_int64.
      	(adjust_mems, add_stores): Update accodingly.
      	(vt_canonicalize_addr): Track polynomial offsets.
      	(emit_note_insn_var_location): Likewise.
      	(vt_add_function_parameter): Likewise.
      	(vt_initialize): Likewise.
      
      From-SVN: r261530
      Richard Sandiford committed
  6. 10 Apr, 2018 1 commit
    • [explow] PR target/85173: validize memory before passing it on to target probe_stack · 5c35bc3e
      In this PR the expansion code emits an invalid memory address for the stack probe, which the backend fails to recognise.
      The address is created explicitly in anti_adjust_stack_and_probe_stack_clash in explow.c and passed down to gen_probe_stack
      without any validation in emit_stack_probe.
      
      This patch fixes the ICE by calling validize_mem on the memory location before passing it down to the target.
      Jakub pointed out that we also want to create valid addresses for the probe_stack_address case, so this patch
      creates an expand operand and legitimizes it before passing it down to the probe_stack_address expander.
      
      This patch passes bootstrap and testing on arm-none-linux-gnueabihf and aarch64-none-linux-gnu
      and ppc64le-redhat-linux on gcc112 in the compile farm.
      
      	PR target/85173
      	* explow.c (emit_stack_probe): Call validize_mem on memory location
      	before passing it to gen_probe_stack.  Create address operand and
      	legitimize it for the probe_stack_address case.
      
      	* gcc.target/arm/pr85173.c: New test.
      
      From-SVN: r259266
      Kyrylo Tkachov committed
  7. 03 Jan, 2018 2 commits
  8. 21 Dec, 2017 3 commits
    • poly_int: argument sizes · a20c5714
      This patch changes various bits of state related to argument sizes so
      that they have type poly_int64 rather than HOST_WIDE_INT.  This includes:
      
      - incoming_args::pops_args and incoming_args::size
      - rtl_data::outgoing_args_size
      - pending_stack_adjust
      - stack_pointer_delta
      - stack_usage::pushed_stack_size
      - args_size::constant
      
      It also changes TARGET_RETURN_POPS_ARGS so that the size of the
      arguments passed in and the size returned by the hook are both
      poly_int64s.
      
      2017-12-21  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* target.def (return_pops_args): Treat both the input and output
      	sizes as poly_int64s rather than HOST_WIDE_INTS.
      	* targhooks.h (default_return_pops_args): Update accordingly.
      	* targhooks.c (default_return_pops_args): Likewise.
      	* doc/tm.texi: Regenerate.
      	* emit-rtl.h (incoming_args): Change pops_args, size and
      	outgoing_args_size from int to poly_int64_pod.
      	* function.h (expr_status): Change x_pending_stack_adjust and
      	x_stack_pointer_delta from int to poly_int64.
      	(args_size::constant): Change from HOST_WIDE_INT to poly_int64.
      	(ARGS_SIZE_RTX): Update accordingly.
      	* calls.c (highest_outgoing_arg_in_use): Change from int to
      	unsigned int.
      	(stack_usage_watermark, stored_args_watermark): New variables.
      	(stack_region_maybe_used_p, mark_stack_region_used): New functions.
      	(emit_call_1): Change the stack_size and rounded_stack_size
      	parameters from HOST_WIDE_INT to poly_int64.  Track n_popped
      	as a poly_int64.
      	(save_fixed_argument_area): Check stack_usage_watermark.
      	(initialize_argument_information): Change old_pending_adj from
      	a HOST_WIDE_INT * to a poly_int64_pod *.
      	(compute_argument_block_size): Return the size as a poly_int64
      	rather than an int.
      	(finalize_must_preallocate): Track polynomial argument sizes.
      	(compute_argument_addresses): Likewise.
      	(internal_arg_pointer_based_exp): Track polynomial offsets.
      	(mem_overlaps_already_clobbered_arg_p): Rename to...
      	(mem_might_overlap_already_clobbered_arg_p): ...this and take the
      	size as a poly_uint64 rather than an unsigned HOST_WIDE_INT.
      	Check stored_args_used_watermark.
      	(load_register_parameters): Update accordingly.
      	(check_sibcall_argument_overlap_1): Likewise.
      	(combine_pending_stack_adjustment_and_call): Take the unadjusted
      	args size as a poly_int64 rather than an int.  Return a bool
      	indicating whether the optimization was possible and return
      	the new adjustment by reference.
      	(check_sibcall_argument_overlap): Track polynomail argument sizes.
      	Update stored_args_watermark.
      	(can_implement_as_sibling_call_p): Handle polynomial argument sizes.
      	(expand_call): Likewise.  Maintain stack_usage_watermark and
      	stored_args_watermark.  Update calls to
      	combine_pending_stack_adjustment_and_call.
      	(emit_library_call_value_1): Handle polynomial argument sizes.
      	Call stack_region_maybe_used_p and mark_stack_region_used.
      	Maintain stack_usage_watermark.
      	(store_one_arg): Likewise.  Update call to
      	mem_overlaps_already_clobbered_arg_p.
      	* config/arm/arm.c (arm_output_function_prologue): Add a cast to
      	HOST_WIDE_INT.
      	* config/avr/avr.c (avr_outgoing_args_size): Likewise.
      	* config/microblaze/microblaze.c (microblaze_function_prologue):
      	Likewise.
      	* config/cr16/cr16.c (cr16_return_pops_args): Update for new
      	TARGET_RETURN_POPS_ARGS interface.
      	(cr16_compute_frame, cr16_initial_elimination_offset): Add casts
      	to HOST_WIDE_INT.
      	* config/ft32/ft32.c (ft32_compute_frame): Likewise.
      	* config/i386/i386.c (ix86_return_pops_args): Update for new
      	TARGET_RETURN_POPS_ARGS interface.
      	(ix86_expand_split_stack_prologue): Add a cast to HOST_WIDE_INT.
      	* config/moxie/moxie.c (moxie_compute_frame): Likewise.
      	* config/m68k/m68k.c (m68k_return_pops_args): Update for new
      	TARGET_RETURN_POPS_ARGS interface.
      	* config/vax/vax.c (vax_return_pops_args): Likewise.
      	* config/pa/pa.h (STACK_POINTER_OFFSET): Add a cast to poly_int64.
      	(EXIT_IGNORE_STACK): Update reference to crtl->outgoing_args_size.
      	* config/arm/arm.h (CALLER_INTERWORKING_SLOT_SIZE): Likewise.
      	* config/powerpcspe/aix.h (STACK_DYNAMIC_OFFSET): Likewise.
      	* config/powerpcspe/darwin.h (STACK_DYNAMIC_OFFSET): Likewise.
      	* config/powerpcspe/powerpcspe.h (STACK_DYNAMIC_OFFSET): Likewise.
      	* config/rs6000/aix.h (STACK_DYNAMIC_OFFSET): Likewise.
      	* config/rs6000/darwin.h (STACK_DYNAMIC_OFFSET): Likewise.
      	* config/rs6000/rs6000.h (STACK_DYNAMIC_OFFSET): Likewise.
      	* dojump.h (saved_pending_stack_adjust): Change x_pending_stack_adjust
      	and x_stack_pointer_delta from int to poly_int64.
      	* dojump.c (do_pending_stack_adjust): Update accordingly.
      	* explow.c (allocate_dynamic_stack_space): Handle polynomial
      	stack_pointer_deltas.
      	* function.c (STACK_DYNAMIC_OFFSET): Add a cast to poly_int64.
      	(pad_to_arg_alignment): Track polynomial offsets.
      	(assign_parm_find_stack_rtl): Likewise.
      	(assign_parms, locate_and_pad_parm): Handle polynomial argument sizes.
      	* toplev.c (output_stack_usage): Update reference to
      	current_function_pushed_stack_size.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r255921
      Richard Sandiford committed
    • poly_int: REG_ARGS_SIZE · 68184180
      This patch adds new utility functions for manipulating REG_ARGS_SIZE
      notes and allows the notes to carry polynomial as well as constant sizes.
      
      The code was inconsistent about whether INT_MIN or HOST_WIDE_INT_MIN
      should be used to represent an unknown size.  The patch uses
      HOST_WIDE_INT_MIN throughout.
      
      2017-12-21  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* rtl.h (get_args_size, add_args_size_note): New functions.
      	(find_args_size_adjust): Return a poly_int64 rather than a
      	HOST_WIDE_INT.
      	(fixup_args_size_notes): Likewise.  Make the same change to the
      	end_args_size parameter.
      	* rtlanal.c (get_args_size, add_args_size_note): New functions.
      	* builtins.c (expand_builtin_trap): Use add_args_size_note.
      	* calls.c (emit_call_1): Likewise.
      	* explow.c (adjust_stack_1): Likewise.
      	* cfgcleanup.c (old_insns_match_p): Update use of
      	find_args_size_adjust.
      	* combine.c (distribute_notes): Track polynomial arg sizes.
      	* dwarf2cfi.c (dw_trace_info): Change beg_true_args_size,
      	end_true_args_size, beg_delay_args_size and end_delay_args_size
      	from HOST_WIDE_INT to poly_int64.
      	(add_cfi_args_size): Take the args_size as a poly_int64 rather
      	than a HOST_WIDE_INT.
      	(notice_args_size, notice_eh_throw, maybe_record_trace_start)
      	(maybe_record_trace_start_abnormal, scan_trace, connect_traces): Track
      	polynomial arg sizes.
      	* emit-rtl.c (try_split): Use get_args_size.
      	* recog.c (peep2_attempt): Likewise.
      	* reload1.c (reload_as_needed): Likewise.
      	* expr.c (find_args_size_adjust): Return the adjustment as a
      	poly_int64 rather than a HOST_WIDE_INT.
      	(fixup_args_size_notes): Change end_args_size from a HOST_WIDE_INT
      	to a poly_int64 and change the return type in the same way.
      	(emit_single_push_insn): Track polynomial arg sizes.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r255919
      Richard Sandiford committed
    • poly_int: frame allocations · f075bd95
      This patch converts the frame allocation code (mostly in function.c)
      to use poly_int64 rather than HOST_WIDE_INT for frame offsets and
      sizes.
      
      2017-12-21  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* function.h (frame_space): Change start and length from HOST_WIDE_INT
      	to poly_int64.
      	(get_frame_size): Return the size as a poly_int64 rather than a
      	HOST_WIDE_INT.
      	(frame_offset_overflow): Take the offset as a poly_int64 rather
      	than a HOST_WIDE_INT.
      	(assign_stack_local_1, assign_stack_local, assign_stack_temp_for_type)
      	(assign_stack_temp): Likewise for the size.
      	* function.c (get_frame_size): Return a poly_int64 rather than
      	a HOST_WIDE_INT.
      	(frame_offset_overflow): Take the offset as a poly_int64 rather
      	than a HOST_WIDE_INT.
      	(try_fit_stack_local): Take the start, length and size as poly_int64s
      	rather than HOST_WIDE_INTs.  Return the offset as a poly_int64_pod
      	rather than a HOST_WIDE_INT.
      	(add_frame_space): Take the start and end as poly_int64s rather than
      	HOST_WIDE_INTs.
      	(assign_stack_local_1, assign_stack_local, assign_stack_temp_for_type)
      	(assign_stack_temp): Likewise for the size.
      	(temp_slot): Change size, base_offset and full_size from HOST_WIDE_INT
      	to poly_int64.
      	(find_temp_slot_from_address): Handle polynomial offsets.
      	(combine_temp_slots): Likewise.
      	* emit-rtl.h (rtl_data::x_frame_offset): Change from HOST_WIDE_INT
      	to poly_int64.
      	* cfgexpand.c (alloc_stack_frame_space): Return the offset as a
      	poly_int64 rather than a HOST_WIDE_INT.
      	(expand_one_stack_var_at): Take the offset as a poly_int64 rather
      	than a HOST_WIDE_INT.
      	(expand_stack_vars, expand_one_stack_var_1, expand_used_vars): Handle
      	polynomial frame offsets.
      	* config/m32r/m32r-protos.h (m32r_compute_frame_size): Take the size
      	as a poly_int64 rather than an int.
      	* config/m32r/m32r.c (m32r_compute_frame_size): Likewise.
      	* config/v850/v850-protos.h (compute_frame_size): Likewise.
      	* config/v850/v850.c (compute_frame_size): Likewise.
      	* config/xtensa/xtensa-protos.h (compute_frame_size): Likewise.
      	* config/xtensa/xtensa.c (compute_frame_size): Likewise.
      	* config/pa/pa-protos.h (pa_compute_frame_size): Likewise.
      	* config/pa/pa.c (pa_compute_frame_size): Likewise.
      	* explow.h (get_dynamic_stack_base): Take the offset as a poly_int64
      	rather than a HOST_WIDE_INT.
      	* explow.c (get_dynamic_stack_base): Likewise.
      	* final.c (final_start_function): Use the constant lower bound
      	of the frame size for -Wframe-larger-than.
      	* ira.c (do_reload): Adjust for new get_frame_size return type.
      	* lra.c (lra): Likewise.
      	* reload1.c (reload): Likewise.
      	* config/avr/avr.c (avr_asm_function_end_prologue): Likewise.
      	* config/pa/pa.h (EXIT_IGNORE_STACK): Likewise.
      	* rtlanal.c (get_initial_register_offset): Return the offset as
      	a poly_int64 rather than a HOST_WIDE_INT.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r255917
      Richard Sandiford committed
  9. 20 Dec, 2017 1 commit
    • poly_int: rtx constants · 0c12fc9b
      This patch adds an rtl representation of poly_int values.
      There were three possible ways of doing this:
      
      (1) Add a new rtl code for the poly_ints themselves and store the
          coefficients as trailing wide_ints.  This would give constants like:
      
            (const_poly_int [c0 c1 ... cn])
      
          The runtime value would be:
      
            c0 + c1 * x1 + ... + cn * xn
      
      (2) Like (1), but use rtxes for the coefficients.  This would give
          constants like:
      
            (const_poly_int [(const_int c0)
                             (const_int c1)
                             ...
                             (const_int cn)])
      
          although the coefficients could be const_wide_ints instead
          of const_ints where appropriate.
      
      (3) Add a new rtl code for the polynomial indeterminates,
          then use them in const wrappers.  A constant like c0 + c1 * x1
          would then look like:
      
            (const:M (plus:M (mult:M (const_param:M x1)
                                     (const_int c1))
                             (const_int c0)))
      
      There didn't seem to be that much to choose between them.  The main
      advantage of (1) is that it's a more efficient representation and
      that we can refer to the cofficients directly as wide_int_storage.
      
      2017-12-20  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* doc/rtl.texi (const_poly_int): Document.  Also document the
      	rtl sharing behavior.
      	* gengenrtl.c (excluded_rtx): Return true for CONST_POLY_INT.
      	* rtl.h (const_poly_int_def): New struct.
      	(rtx_def::u): Add a cpi field.
      	(CASE_CONST_UNIQUE, CASE_CONST_ANY): Add CONST_POLY_INT.
      	(CONST_POLY_INT_P, CONST_POLY_INT_COEFFS): New macros.
      	(wi::rtx_to_poly_wide_ref): New typedef
      	(const_poly_int_value, wi::to_poly_wide, rtx_to_poly_int64)
      	(poly_int_rtx_p): New functions.
      	(trunc_int_for_mode): Declare a poly_int64 version.
      	(plus_constant): Take a poly_int64 instead of a HOST_WIDE_INT.
      	(immed_wide_int_const): Take a poly_wide_int_ref rather than
      	a wide_int_ref.
      	(strip_offset): Declare.
      	(strip_offset_and_add): New function.
      	* rtl.def (CONST_POLY_INT): New rtx code.
      	* rtl.c (rtx_size): Handle CONST_POLY_INT.
      	(shared_const_p): Use poly_int_rtx_p.
      	* emit-rtl.h (gen_int_mode): Take a poly_int64 instead of a
      	HOST_WIDE_INT.
      	(gen_int_shift_amount): Likewise.
      	* emit-rtl.c (const_poly_int_hasher): New class.
      	(const_poly_int_htab): New variable.
      	(init_emit_once): Initialize it when NUM_POLY_INT_COEFFS > 1.
      	(const_poly_int_hasher::hash): New function.
      	(const_poly_int_hasher::equal): Likewise.
      	(gen_int_mode): Take a poly_int64 instead of a HOST_WIDE_INT.
      	(immed_wide_int_const): Rename to...
      	(immed_wide_int_const_1): ...this and make static.
      	(immed_wide_int_const): New function, taking a poly_wide_int_ref
      	instead of a wide_int_ref.
      	(gen_int_shift_amount): Take a poly_int64 instead of a HOST_WIDE_INT.
      	(gen_lowpart_common): Handle CONST_POLY_INT.
      	* cse.c (hash_rtx_cb, equiv_constant): Likewise.
      	* cselib.c (cselib_hash_rtx): Likewise.
      	* dwarf2out.c (const_ok_for_output_1): Likewise.
      	* expr.c (convert_modes): Likewise.
      	* print-rtl.c (rtx_writer::print_rtx, print_value): Likewise.
      	* rtlhash.c (add_rtx): Likewise.
      	* explow.c (trunc_int_for_mode): Add a poly_int64 version.
      	(plus_constant): Take a poly_int64 instead of a HOST_WIDE_INT.
      	Handle existing CONST_POLY_INT rtxes.
      	* expmed.h (expand_shift): Take a poly_int64 instead of a
      	HOST_WIDE_INT.
      	* expmed.c (expand_shift): Likewise.
      	* rtlanal.c (strip_offset): New function.
      	(commutative_operand_precedence): Give CONST_POLY_INT the same
      	precedence as CONST_DOUBLE and put CONST_WIDE_INT between that
      	and CONST_INT.
      	* rtl-tests.c (const_poly_int_tests): New struct.
      	(rtl_tests_c_tests): Use it.
      	* simplify-rtx.c (simplify_const_unary_operation): Handle
      	CONST_POLY_INT.
      	(simplify_const_binary_operation): Likewise.
      	(simplify_binary_operation_1): Fold additions of symbolic constants
      	and CONST_POLY_INTs.
      	(simplify_subreg): Handle extensions and truncations of
      	CONST_POLY_INTs.
      	(simplify_const_poly_int_tests): New struct.
      	(simplify_rtx_c_tests): Use it.
      	* wide-int.h (storage_ref): Add default constructor.
      	(wide_int_ref_storage): Likewise.
      	(trailing_wide_ints): Use GTY((user)).
      	(trailing_wide_ints::operator[]): Add a const version.
      	(trailing_wide_ints::get_precision): New function.
      	(trailing_wide_ints::extra_size): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r255862
      Richard Sandiford committed
  10. 19 Dec, 2017 1 commit
    • read-rtl.c (parse_reg_note_name): Replace Yoda conditions with typical order conditions. · 01512446
      	* read-rtl.c (parse_reg_note_name): Replace Yoda conditions with
      	typical order conditions.
      	* sel-sched.c (extract_new_fences_from): Likewise.
      	* config/visium/constraints.md (J, K, L): Likewise.
      	* config/visium/predicates.md (const_shift_operand): Likewise.
      	* config/visium/visium.c (visium_legitimize_address,
      	visium_legitimize_reload_address): Likewise.
      	* config/m68k/m68k.c (output_reg_adjust, emit_reg_adjust): Likewise.
      	* config/arm/arm.c (arm_block_move_unaligned_straight): Likewise.
      	* config/avr/constraints.md (Y01, Ym1, Y02, Ym2): Likewise.
      	* config/avr/avr-log.c (avr_vdump, avr_log_set_avr_log,
      	SET_DUMP_DETAIL): Likewise.
      	* config/avr/predicates.md (const_8_16_24_operand): Likewise.
      	* config/avr/avr.c (STR_PREFIX_P, avr_popcount_each_byte,
      	avr_is_casesi_sequence, avr_casei_sequence_check_operands,
      	avr_set_core_architecture, avr_set_current_function,
      	avr_legitimize_reload_address, avr_asm_len, avr_print_operand,
      	output_movqi, output_movsisf, avr_out_plus, avr_out_bitop,
      	avr_out_fract, avr_adjust_insn_length, avr_encode_section_info,
      	avr_2word_insn_p, output_reload_in_const, avr_has_nibble_0xf,
      	avr_map_decompose, avr_fold_builtin): Likewise.
      	* config/avr/driver-avr.c (avr_devicespecs_file): Likewise.
      	* config/avr/gen-avr-mmcu-specs.c (str_prefix_p, print_mcu): Likewise.
      	* config/i386/i386.c (ix86_parse_stringop_strategy_string): Likewise.
      	* config/m32c/m32c-pragma.c (m32c_pragma_memregs): Likewise.
      	* config/m32c/m32c.c (m32c_conditional_register_usage,
      	m32c_address_cost): Likewise.
      	* config/m32c/predicates.md (shiftcount_operand,
      	longshiftcount_operand): Likewise.
      	* config/iq2000/iq2000.c (iq2000_expand_prologue): Likewise.
      	* config/nios2/nios2.c (nios2_handle_custom_fpu_insn_option,
      	can_use_cdx_ldstw): Likewise.
      	* config/nios2/nios2.h (CDX_REG_P): Likewise.
      	* config/cr16/cr16.h (RETURN_ADDR_RTX, REGNO_MODE_OK_FOR_BASE_P):
      	Likewise.
      	* config/cr16/cr16.md (*mov<mode>_double): Likewise.
      	* config/cr16/cr16.c (cr16_create_dwarf_for_multi_push): Likewise.
      	* config/h8300/h8300.c (h8300_rtx_costs, get_shift_alg): Likewise.
      	* config/vax/constraints.md (U06, U08, U16, CN6, S08, S16): Likewise.
      	* config/vax/vax.c (adjacent_operands_p): Likewise.
      	* config/ft32/constraints.md (L, b, KA): Likewise.
      	* config/ft32/ft32.c (ft32_load_immediate, ft32_expand_prologue):
      	Likewise.
      	* cfgexpand.c (expand_stack_alignment): Likewise.
      	* gcse.c (insert_expr_in_table): Likewise.
      	* print-rtl.c (rtx_writer::print_rtx_operand_codes_E_and_V): Likewise.
      	* cgraphunit.c (cgraph_node::expand): Likewise.
      	* ira-build.c (setup_min_max_allocno_live_range_point): Likewise.
      	* emit-rtl.c (add_insn): Likewise.
      	* input.c (dump_location_info): Likewise.
      	* passes.c (NEXT_PASS): Likewise.
      	* read-rtl-function.c (parse_note_insn_name,
      	function_reader::read_rtx_operand_r, function_reader::parse_mem_expr):
      	Likewise.
      	* sched-rgn.c (sched_rgn_init): Likewise.
      	* diagnostic-show-locus.c (layout::show_ruler): Likewise.
      	* combine.c (find_split_point, simplify_if_then_else, force_to_mode,
      	if_then_else_cond, simplify_shift_const_1, simplify_comparison): Likewise.
      	* explow.c (eliminate_constant_term): Likewise.
      	* final.c (leaf_renumber_regs_insn): Likewise.
      	* cfgrtl.c (print_rtl_with_bb): Likewise.
      	* genhooks.c (emit_init_macros): Likewise.
      	* poly-int.h (maybe_ne, maybe_le, maybe_lt): Likewise.
      	* tree-data-ref.c (conflict_fn): Likewise.
      	* selftest.c (assert_streq): Likewise.
      	* expr.c (store_constructor_field, expand_expr_real_1): Likewise.
      	* fold-const.c (fold_range_test, extract_muldiv_1, fold_truth_andor,
      	fold_binary_loc, multiple_of_p): Likewise.
      	* reload.c (push_reload, find_equiv_reg): Likewise.
      	* et-forest.c (et_nca, et_below): Likewise.
      	* dbxout.c (dbxout_symbol_location): Likewise.
      	* reorg.c (relax_delay_slots): Likewise.
      	* dojump.c (do_compare_rtx_and_jump): Likewise.
      	* gengtype-parse.c (type): Likewise.
      	* simplify-rtx.c (simplify_gen_ternary, simplify_gen_relational,
      	simplify_const_relational_operation): Likewise.
      	* reload1.c (do_output_reload): Likewise.
      	* dumpfile.c (get_dump_file_info_by_switch): Likewise.
      	* gengtype.c (type_for_name): Likewise.
      	* gimple-ssa-sprintf.c (format_directive): Likewise.
      ada/
      	* gcc-interface/trans.c (Loop_Statement_to_gnu): Replace Yoda
      	conditions with typical order conditions.
      	* gcc-interface/misc.c (gnat_get_array_descr_info,
      	default_pass_by_ref): Likewise.
      	* gcc-interface/decl.c (gnat_to_gnu_entity): Likewise.
      	* adaint.c (__gnat_tmp_name): Likewise.
      c-family/
      	* known-headers.cc (get_stdlib_header_for_name): Replace Yoda
      	conditions with typical order conditions.
      c/
      	* c-typeck.c (comptypes_internal, function_types_compatible_p,
      	perform_integral_promotions, digest_init): Replace Yoda conditions
      	with typical order conditions.
      	* c-decl.c (check_bitfield_type_and_width): Likewise.
      cp/
      	* name-lookup.c (get_std_name_hint): Replace Yoda conditions with
      	typical order conditions.
      	* class.c (check_bitfield_decl): Likewise.
      	* pt.c (convert_template_argument): Likewise.
      	* decl.c (duplicate_decls): Likewise.
      	* typeck.c (commonparms): Likewise.
      fortran/
      	* scanner.c (preprocessor_line): Replace Yoda conditions with typical
      	order conditions.
      	* dependency.c (check_section_vs_section): Likewise.
      	* trans-array.c (gfc_conv_expr_descriptor): Likewise.
      jit/
      	* jit-playback.c (get_type, playback::compile_to_file::copy_file,
      	playback::context::acquire_mutex): Replace Yoda conditions with
      	typical order conditions.
      	* libgccjit.c (gcc_jit_context_new_struct_type,
      	gcc_jit_struct_set_fields, gcc_jit_context_new_union_type,
      	gcc_jit_context_new_function, gcc_jit_timer_pop): Likewise.
      	* jit-builtins.c (matches_builtin): Likewise.
      	* jit-recording.c (recording::compound_type::set_fields,
      	recording::fields::write_reproducer, recording::rvalue::set_scope,
      	recording::function::validate): Likewise.
      	* jit-logging.c (logger::decref): Likewise.
      
      From-SVN: r255831
      Jakub Jelinek committed
  11. 13 Dec, 2017 1 commit
    • re PR middle-end/78468 (libgomp.c/reduction-10.c and many more FAIL) · b9f92c0b
      	PR middle-end/78468
      	* emit-rtl.c (init_emit): Remove ??? comment.
      	* explow.c (get_dynamic_stack_size): Take known alignment of stack
      	pointer + STACK_DYNAMIC_OFFSET into account in lieu of STACK_BOUNDARY.
      	* config/sparc/sparc.h (INIT_EXPANDERS): In 32-bit mode, lower the
      	alignment of 3 virtual registers to BITS_PER_WORD.
      
      	* config/sparc/sparc.c (sparc_compute_frame_size): Simplify.
      
      Co-Authored-By: Dominik Vogt <vogt@linux.vnet.ibm.com>
      
      From-SVN: r255616
      Eric Botcazou committed
  12. 22 Nov, 2017 1 commit
    • re PR c++/60336 (empty struct value is passed differently in C and C++) · 974aedcc
      	PR c++/60336
      	PR middle-end/67239
      	PR target/68355
      	* c-decl.c (grokdeclarator): Set DECL_PADDING_P on unnamed bit-fields.
      
      	* class.c (layout_class_type): Set DECL_PADDING_P on padding.
      	* decl.c (cxx_init_decl_processing): Set TRANSLATION_UNIT_WARN_EMPTY_P.
      	(grokdeclarator): Set DECL_PADDING_P on unnamed bit-fields.
      
      	* lto.c (compare_tree_sccs_1): Compare TYPE_EMPTY_P and DECL_PADDING_P.
      
      	* calls.c (initialize_argument_information): Call
      	warn_parameter_passing_abi target hook.
      	(store_one_arg): Use 0 for empty record size.  Don't push 0 size
      	argument onto stack.
      	(must_pass_in_stack_var_size_or_pad): Return false for empty types.
      	* common.opt: Update -fabi-version description.
      	* config/i386/i386.c (init_cumulative_args): Set cum->warn_empty.
      	(ix86_gimplify_va_arg): Call arg_int_size_in_bytes instead of
      	int_size_in_bytes.
      	(ix86_is_empty_record): New function.
      	(ix86_warn_parameter_passing_abi): New function.
      	(TARGET_EMPTY_RECORD_P): Redefine.
      	(TARGET_WARN_PARAMETER_PASSING_ABI): Redefine.
      	* config/i386/i386.h (CUMULATIVE_ARGS): Add warn_empty.
      	* doc/tm.texi: Regenerated.
      	* doc/tm.texi.in (TARGET_EMPTY_RECORD_P,
      	TARGET_WARN_PARAMETER_PASSING_ABI): Add.
      	* dwarf2out.c (get_ultimate_context): Move to tree.c.
      	* explow.c (hard_function_value): Call arg_int_size_in_bytes
      	instead of int_size_in_bytes.
      	* expr.c (copy_blkmode_to_reg): Likewise.
      	* function.c (aggregate_value_p): Return 0 for empty types.
      	(assign_parm_find_entry_rtl): Call warn_parameter_passing_abi target hook.
      	(locate_and_pad_parm): Call arg size_in_bytes instead
      	size_in_bytes.
      	* lto-streamer-out.c (hash_tree): Hash TYPE_EMPTY_P and DECL_PADDING_P.
      	* stor-layout.c (finalize_type_size): Set TYPE_EMPTY_P.
      	* target.def (empty_record_p, warn_parameter_passing_abi): New target
      	hooks.
      	* targhooks.c (hook_void_CUMULATIVE_ARGS_tree): New hook.
      	(std_gimplify_va_arg_expr): Skip empty records.  Call
      	arg_size_in_bytes instead size_in_bytes.
      	* targhooks.h (hook_void_CUMULATIVE_ARGS_tree): Declare.
      	* tree-core.h (tree_type_common): Add empty_flag.
      	(tree_decl_common): Update comments.
      	* tree-streamer-in.c (unpack_ts_decl_common_value_fields): Stream
      	DECL_PADDING_P.
      	(unpack_ts_type_common_value_fields): Stream TYPE_EMPTY_P.
      	* tree-streamer-out.c (pack_ts_decl_common_value_fields): Stream
      	DECL_PADDING_P.
      	(pack_ts_type_common_value_fields): Stream TYPE_EMPTY_P.
      	* tree.c (default_is_empty_type): New function.
      	(default_is_empty_record): New function.
      	(arg_int_size_in_bytes): New function.
      	(arg_size_in_bytes): New function.
      	(get_ultimate_context): New function.
      	* tree.h: Define TYPE_EMPTY_P, DECL_PADDING_P and
      	TRANSLATION_UNIT_WARN_EMPTY_P.
      	(default_is_empty_record, arg_int_size_in_bytes,
      	arg_size_in_bytes, get_ultimate_context): Declare.
      
      	* g++.dg/abi/empty12.C: New test.
      	* g++.dg/abi/empty12.h: New test.
      	* g++.dg/abi/empty12a.c: New test.
      	* g++.dg/abi/empty13.C: New test.
      	* g++.dg/abi/empty13.h: New test.
      	* g++.dg/abi/empty13a.c: New test.
      	* g++.dg/abi/empty14.C: New test.
      	* g++.dg/abi/empty14.h: New test.
      	* g++.dg/abi/empty14a.c: New test.
      	* g++.dg/abi/empty15.C: New test.
      	* g++.dg/abi/empty15.h: New test.
      	* g++.dg/abi/empty15a.c: New test.
      	* g++.dg/abi/empty16.C: New test.
      	* g++.dg/abi/empty16.h: New test.
      	* g++.dg/abi/empty16a.c: New test.
      	* g++.dg/abi/empty17.C: New test.
      	* g++.dg/abi/empty17.h: New test.
      	* g++.dg/abi/empty17a.c: New test.
      	* g++.dg/abi/empty18.C: New test.
      	* g++.dg/abi/empty18.h: New test.
      	* g++.dg/abi/empty18a.c: New test.
      	* g++.dg/abi/empty19.C: New test.
      	* g++.dg/abi/empty19.h: New test.
      	* g++.dg/abi/empty19a.c: New test.
      	* g++.dg/abi/empty20.C: New test.
      	* g++.dg/abi/empty21.C: New test.
      	* g++.dg/abi/empty22.C: New test.
      	* g++.dg/abi/empty22.h: New test.
      	* g++.dg/abi/empty22a.c: New test.
      	* g++.dg/abi/empty23.C: New test.
      	* g++.dg/abi/empty24.C: New test.
      	* g++.dg/abi/empty25.C: New test.
      	* g++.dg/abi/empty25.h: New test.
      	* g++.dg/abi/empty25a.c: New test.
      	* g++.dg/abi/empty26.C: New test.
      	* g++.dg/abi/empty26.h: New test.
      	* g++.dg/abi/empty26a.c: New test.
      	* g++.dg/abi/empty27.C: New test.
      	* g++.dg/abi/empty28.C: New test.
      	* g++.dg/abi/pr60336-1.C: New test.
      	* g++.dg/abi/pr60336-10.C: New test.
      	* g++.dg/abi/pr60336-11.C: New test.
      	* g++.dg/abi/pr60336-12.C: New test.
      	* g++.dg/abi/pr60336-2.C: New test.
      	* g++.dg/abi/pr60336-3.C: New test.
      	* g++.dg/abi/pr60336-4.C: New test.
      	* g++.dg/abi/pr60336-5.C: New test.
      	* g++.dg/abi/pr60336-6.C: New test.
      	* g++.dg/abi/pr60336-7.C: New test.
      	* g++.dg/abi/pr60336-8.C: New test.
      	* g++.dg/abi/pr60336-9.C: New test.
      	* g++.dg/abi/pr68355.C: New test.
      	* g++.dg/lto/pr60336_0.C: New test.
      
      Co-Authored-By: H.J. Lu <hongjiu.lu@intel.com>
      Co-Authored-By: Jason Merrill <jason@redhat.com>
      
      From-SVN: r255066
      Marek Polacek committed
  13. 15 Nov, 2017 1 commit
  14. 19 Oct, 2017 1 commit
    • asan.c (handle_builtin_alloca): Deal with all alloca variants. · 9e878cf1
      	* asan.c (handle_builtin_alloca): Deal with all alloca variants.
      	(get_mem_refs_of_builtin_call): Likewise.
      	* builtins.c (expand_builtin_apply): Adjust call to
      	allocate_dynamic_stack_space.
      	(expand_builtin_alloca): For __builtin_alloca_with_align_and_max, pass
      	the third argument to allocate_dynamic_stack_space, otherwise -1.
      	(expand_builtin): Deal with all alloca variants.
      	(is_inexpensive_builtin): Likewise.
      	* builtins.def (BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX): New.
      	* calls.c (special_function_p): Deal with all alloca variants.
      	(initialize_argument_information): Adjust call to
      	allocate_dynamic_stack_space.
      	(expand_call): Likewise.
      	* cfgexpand.c (expand_call_stmt): Deal with all alloca variants.
      	* doc/extend.texi (Built-ins): Add __builtin_alloca_with_align_and_max
      	* explow.c (allocate_dynamic_stack_space): Add MAX_SIZE parameter and
      	use it for the stack usage computation.
      	* explow.h (allocate_dynamic_stack_space): Adjust prototype.
      	* function.c (gimplify_parameters): Turn BUILT_IN_ALLOCA_WITH_ALIGN
      	into BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX and pass maximum size.
      	* gimple-ssa-warn-alloca.c (alloca_call_type): Simplify control flow.
      	Take into account 3rd argument of __builtin_alloca_with_align_and_max.
      	(in_loop_p): Remove first argument and useless check.
      	(pass_walloca::execute): Remove useless test and adjust call to above.
      	* gimple.c (gimple_build_call_from_tree): Deal with all alloc variants
      	* gimplify.c (gimplify_vla_decl): Turn BUILT_IN_ALLOCA_WITH_ALIGN into
      	BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX and pass maximum size.
      	(gimplify_call_expr): Deal with all alloca variants.
      	* hsa-gen.c (gen_hsa_alloca): Likewise.
      	(gen_hsa_insns_for_call): Likewise.
      	* ipa-pure-const.c (special_builtin_state): Likewise.
      	* tree-chkp.c (chkp_build_returned_bound): Likewise.
      	* tree-object-size.c (alloc_object_size): Likewise.
      	* tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Likewise.
      	(call_may_clobber_ref_p_1): Likewise.
      	* tree-ssa-ccp.c (evaluate_stmt): Likewise.
      	(ccp_fold_stmt): Likewise.
      	(optimize_stack_restore): Likewise.
      	* tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Likewise.
      	(mark_all_reaching_defs_necessary_1): Likewise.
      	(propagate_necessity): Likewise.
      	(eliminate_unnecessary_stmts): Likewise.
      	* tree.c (build_common_builtin_nodes): Build
      	BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX.
      	* tree.h (ALLOCA_FUNCTION_CODE_P): New macro.
      	(CASE_BUILT_IN_ALLOCA): Likewise.
      	* varasm.c (incorporeal_function_p): Deal with all alloca variants.
      c-family/
      	* c-common.c (check_builtin_function_arguments): Also check arguments
      	of __builtin_alloca_with_align_and_max.
      
      From-SVN: r253901
      Eric Botcazou committed
  15. 20 Sep, 2017 2 commits
    • explow.c (compute_stack_clash_protection_loop_data): Use CONST_INT_P instead of explicit test. · 94c23e39
      	* explow.c (compute_stack_clash_protection_loop_data): Use
      	CONST_INT_P instead of explicit test.  Verify object is a
      	CONST_INT_P before looking at INTVAL.
      	(anti_adjust_stack_and_probe_stack_clash): Use CONST_INT_P
      	instead of explicit test.
      
      	* gcc.target/i386/stack-check-11.c: Update test and regexp
      	so that it works for both i?86 and x86_64.
      
      From-SVN: r253034
      Jeff Law committed
    • explow.c: Include "params.h". · 8c1dd970
      2017-09-18  Jeff Law  <law@redhat.com>
      
      	* explow.c: Include "params.h".
      	(anti_adjust_stack_and_probe_stack_clash): New function.
      	(get_stack_check_protect): Likewise.
      	(compute_stack_clash_protection_loop_data): Likewise.
      	(emit_stack_clash_protection_loop_start): Likewise.
      	(emit_stack_clash_protection_loop_end): Likewise.
      	(allocate_dynamic_stack_space): Use get_stack_check_protect.
      	Use anti_adjust_stack_and_probe_stack_clash.
      	* explow.h (compute_stack_clash_protection_loop_data): Prototype.
      	(emit_stack_clash_protection_loop_start): Likewise.
      	(emit_stack_clash_protection_loop_end): Likewise.
      	* rtl.h (get_stack_check_protect): Prototype.
      	* target.def (stack_clash_protection_final_dynamic_probe): New hook.
      	* targhooks.c (default_stack_clash_protection_final_dynamic_probe): New.
      	* targhooks.h (default_stack_clash_protection_final_dynamic_probe):
      	Prototype.
      	* doc/tm.texi.in (TARGET_STACK_CLASH_PROTECTION_FINAL_DYNAMIC_PROBE):
      	Add @hook.
      	* doc/tm.texi: Rebuilt.
      	* config/aarch64/aarch64.c (aarch64_expand_prologue): Use
      	get_stack_check_protect.
      	* config/alpha/alpha.c (alpha_expand_prologue): Likewise.
      	* config/arm/arm.c (arm_expand_prologue): Likewise.
      	(arm_frame_pointer_required): Likewise.
      	* config/i386/i386.c (ix86_expand_prologue): Likewise.
      	* config/ia64/ia64.c (ia64_expand_prologue): Likewise.
      	* config/mips/mips.c (mips_expand_prologue): Likewise.
      	* config/powerpcspe/powerpcspe.c (rs6000_emit_prologue): Likewise.
      	* config/rs6000/rs6000.c (rs6000_emit_prologue): Likewise.
      	* config/sparc/sparc.c (sparc_expand_prologue): Likewise.
      	(sparc_flat_expand_prologue): Likewise.
      
      	* gcc.dg/stack-check-3.c: New test.
      
      From-SVN: r252995
      Jeff Law committed
  16. 05 Sep, 2017 1 commit
    • Improve alloca alignment · ae85ad3a
      This patch improves alloca alignment.  Currently alloca reserves
      too much space as it aligns twice, and generates unnecessary stack
      alignment code.
      
      When the requested alignment is lower than the stack alignment, no
      extra alignment is needed.  If the requested alignment is higher,
      we need to increase the size by the difference of the requested 
      alignment and the stack alignment.  As a result, the alloca alignment
      is exactly as expected:
      
      alloca (16):
      	sub	sp, sp, #16
      	mov	x1, sp
      
      alloca (x):
      	add	x0, x0, 15
      	and	x0, x0, -16
      	sub	sp, sp, x0
      	mov	x0, sp
      
      __builtin_alloca_with_align (x, 512):
      	add	x0, x0, 63
      	and	x0, x0, -16
      	sub	sp, sp, x0
      	add	x0, sp, 63
      	and	x0, x0, -64
      
          gcc/
      	* explow.c (get_dynamic_stack_size): Improve dynamic alignment.
      
      From-SVN: r251713
      Wilco Dijkstra committed
  17. 04 Sep, 2017 1 commit
    • PR82045: Avoid passing machine modes through "..." · db69559b
      PR82045 is about a bootstrap failure on sparc-sun-solaris2.11.
      The problem was that we were passing the new machine_mode wrapper
      classes through "..."  to emit_library_call(_value), which then
      read them back as ints instead.
      
      The simplest fix seemed to be replace "..." with an array of
      rtx_mode_ts, then provide wrappers for the common cases.  This
      bulks out rtl.h a bit, but it does make things a bit more typesafe.
      
      2017-09-04  Richard Sandiford  <richard.sandiford@linaro.org>
      
      gcc/
      	PR bootstrap/82045
      	* rtl.h (emit_library_call_value_1): Declare.
      	(emit_library_call): Replace declaration with a series of overloads.
      	Remove the parameter count argument.
      	(emit_library_call_value): Likewise.
      	* calls.c (emit_library_call_value_1): Make global.  Replace varargs
      	with an "rtx_mode_t *".
      	(emit_library_call_value): Delete.
      	(emit_library_call): Likewise.
      	* asan.c (asan_emit_stack_protection): Update calls accordingly.
      	(asan_emit_allocas_unpoison): Likewise.
      	* builtins.c (expand_builtin_powi): Likewise.
      	(expand_asan_emit_allocas_unpoison): Likewise.
      	* cfgexpand.c (expand_main_function): Likewise.
      	* config/aarch64/aarch64.c (aarch64_trampoline_init): Likewise.
      	* config/aarch64/aarch64.h (PROFILE_HOOK): Likewise.
      	* config/alpha/alpha.c (alpha_trampoline_init): Likewise.
      	* config/arm/arm.c (arm_trampoline_init): Likewise.
      	(arm_call_tls_get_addr): Likewise.
      	(arm_expand_divmod_libfunc): Likewise.
      	* config/bfin/bfin.md (umulsi3_highpart): Likewise.
      	(smulsi3_highpart): Likewise.
      	* config/c6x/c6x.c (c6x_initialize_trampoline): Likewise.
      	(c6x_expand_compare): Likewise.
      	(c6x_expand_movmem): Likewise.
      	* config/frv/frv.c (frv_trampoline_init): Likewise.
      	* config/i386/i386.c (ix86_trampoline_init): Likewise.
      	(ix86_expand_divmod_libfunc): Likewise.
      	* config/ia64/ia64.c (ia64_expand_tls_address): Likewise.
      	(ia64_expand_compare): Likewise.
      	(ia64_profile_hook): Likewise.
      	* config/ia64/ia64.md (save_stack_nonlocal): Likewise.
      	(nonlocal_goto): Likewise.
      	(restore_stack_nonlocal): Likewise.
      	* config/m32r/m32r.c (block_move_call): Likewise.
      	(m32r_trampoline_init): Likewise.
      	* config/m68k/linux.h (FINALIZE_TRAMPOLINE): Likewise.
      	* config/m68k/m68k.c (m68k_call_tls_get_addr): Likewise.
      	(m68k_call_m68k_read_tp): Likewise.
      	* config/microblaze/microblaze.c (microblaze_call_tls_get_addr)
      	(microblaze_expand_divide): Likewise.
      	* config/mips/mips.h (mips_args): Likewise.
      	* config/mips/sdemtk.h (mips_sync_icache): Likewise.
      	(MIPS_ICACHE_SYNC): Likewise.
      	* config/nios2/nios2.c (nios2_emit_expensive_div): Likewise.
      	(nios2_trampoline_init): Likewise.
      	* config/pa/pa.c (hppa_tls_call): Likewise.
      	(pa_trampoline_init): Likewise.
      	* config/pa/pa.md (canonicalize_funcptr_for_compare): Likewise.
      	* config/powerpcspe/powerpcspe.c (rs6000_legitimize_tls_address)
      	(expand_strn_compare): Likewise.
      	(rs6000_generate_compare): Likewise.
      	(rs6000_expand_float128_convert): Likewise.
      	(output_profile_hook): Likewise.
      	(rs6000_trampoline_init): Likewise.
      	* config/powerpcspe/powerpcspe.md (neg<mode>2): Likewise.
      	* config/riscv/riscv.h (PROFILE_HOOK): Likewise.
      	* config/rs6000/rs6000-string.c (expand_strn_compare): Likewise.
      	* config/rs6000/rs6000.c (rs6000_legitimize_tls_address): Likewise.
      	(rs6000_generate_compare): Likewise.
      	(rs6000_expand_float128_convert): Likewise.
      	(output_profile_hook): Likewise.
      	(rs6000_trampoline_init): Likewise.
      	* config/rs6000/rs6000.md (neg<mode>2): Likewise.
      	* config/sh/sh.c (sh_trampoline_init): Likewise.
      	* config/sparc/sparc.c (emit_soft_tfmode_libcall): Likewise.
      	(sparc_emit_float_lib_cmp): Likewise.
      	(sparc32_initialize_trampoline): Likewise.
      	(sparc64_initialize_trampoline): Likewise.
      	(sparc_profile_hook): Likewise.
      	* config/spu/spu.c (ea_load_store): Likewise.
      	* config/spu/spu.md (floatunssidf2): Likewise.
      	* config/tilegx/tilegx.c (tilegx_trampoline_init): Likewise.
      	* config/tilepro/tilepro.c (tilepro_trampoline_init): Likewise.
      	* config/visium/visium.c (expand_block_move_4): Likewise.
      	(expand_block_move_2): Likewise.
      	(expand_block_move_1): Likewise.
      	(expand_block_set_4): Likewise.
      	(expand_block_set_2): Likewise.
      	(expand_block_set_1): Likewise.
      	(visium_trampoline_init): Likewise.
      	(visium_profile_hook): Likewise.
      	* config/xtensa/xtensa.c (xtensa_expand_nonlocal_goto): Likewise.
      	(xtensa_setup_frame_addresses): Likewise.
      	(xtensa_trampoline_init): Likewise.
      	* except.c (sjlj_emit_function_enter): Likewise.
      	(sjlj_emit_function_exit): Likewise.
      	* explow.c (allocate_dynamic_stack_space): Likewise.
      	(probe_stack_range): Likewise.
      	* expr.c (convert_mode_scalar): Likewise.
      	* optabs.c (expand_binop): Likewise.
      	(expand_twoval_binop_libfunc): Likewise.
      	(expand_unop): Likewise.
      	(prepare_cmp_insn): Likewise.
      	(prepare_float_lib_cmp): Likewise.
      	(expand_float): Likewise.
      	(expand_fix): Likewise.
      	(expand_fixed_convert): Likewise.
      	(maybe_emit_sync_lock_test_and_set): Likewise.
      	(expand_atomic_compare_and_swap): Likewise.
      	(expand_mem_thread_fence): Likewise.
      	(expand_atomic_fetch_op): Likewise.
      
      From-SVN: r251637
      Richard Sandiford committed
  18. 30 Aug, 2017 5 commits
    • [74/77] Various small scalar_mode changes · 79d22165
      This patch uses scalar_mode in a few miscellaneous places:
      
      - Previous patches mean mode_to_vector can take a scalar_mode without
        further changes.
      
      - Implicit promotion is limited to scalar types (affects promote_mode
        and sdbout_parms)
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* machmode.h (mode_for_vector): Take a scalar_mode instead
      	of a machine_mode.
      	* stor-layout.c (mode_for_vector): Likewise.
      	* explow.c (promote_mode): Use as_a <scalar_mode>.
      	* sdbout.c (sdbout_parms): Use is_a <scalar_mode>.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251525
      Richard Sandiford committed
    • [66/77] Use scalar_mode for constant integers · db61b7f9
      This patch treats the mode associated with an integer constant as a
      scalar_mode.  We can't use the more natural-sounding scalar_int_mode
      because we also use (const_int 0) for bounds-checking modes.  (It might
      be worth adding a bounds-specific code instead, but that's for another
      day.)
      
      This exposes a latent bug in simplify_immed_subreg, which for
      vectors of CONST_WIDE_INTs would pass the vector mode rather than
      the element mode to rtx_mode_t.
      
      I think the:
      
      		  /* We can get a 0 for an error mark.  */
      		  || GET_MODE_CLASS (mode) == MODE_VECTOR_INT
      		  || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
      
      in immed_double_const is dead.  trunc_int_mode (via gen_int_mode)
      would go on to ICE if the mode fitted in a HWI, and surely plenty
      of other code would be confused to see a const_int be interpreted
      as a vector.  We should instead be using CONST0_RTX (mode) if we
      need a safe constant for a particular mode.
      
      We didn't try to make these functions take scalar_mode arguments
      because in many cases that would be too invasive at this stage.
      Maybe it would become feasible in future.  Also, the long-term
      direction should probably be to add modes to constant integers
      rather than have then as VOIDmode odd-ones-out.  That would remove
      the need for rtx_mode_t and thus remove the question whether they
      should use scalar_int_mode, scalar_mode or machine_mode.
      
      The patch also uses scalar_mode for the CONST_DOUBLE handling
      in loc_descriptor.  In that case the mode can legitimately be
      either floating-point or integral.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* emit-rtl.c (immed_double_const): Use is_a <scalar_mode> instead
      	of separate mode class checks.  Do not allow vector modes here.
      	(immed_wide_int_const): Use as_a <scalar_mode>.
      	* explow.c (trunc_int_for_mode): Likewise.
      	* rtl.h (wi::int_traits<rtx_mode_t>::get_precision): Likewise.
      	(wi::shwi): Likewise.
      	(wi::min_value): Likewise.
      	(wi::max_value): Likewise.
      	* dwarf2out.c (loc_descriptor): Likewise.
      	* simplify-rtx.c (simplify_immed_subreg): Fix rtx_mode_t argument
      	for CONST_WIDE_INT.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251517
      Richard Sandiford committed
    • [62/77] Big machine_mode to scalar_int_mode replacement · 095a2d76
      This patch changes the types of various things from machine_mode
      to scalar_int_mode, in cases where (after previous patches)
      simply changing the type is enough on its own.  The patch does
      nothing other than that.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* builtins.h (builtin_strncpy_read_str): Take a scalar_int_mode
      	instead of a machine_mode.
      	(builtin_memset_read_str): Likewise.
      	* builtins.c (c_readstr): Likewise.
      	(builtin_memcpy_read_str): Likewise.
      	(builtin_strncpy_read_str): Likewise.
      	(builtin_memset_read_str): Likewise.
      	(builtin_memset_gen_str): Likewise.
      	(expand_builtin_signbit): Use scalar_int_mode for local variables.
      	* cfgexpand.c (convert_debug_memory_address): Take a scalar_int_mode
      	instead of a machine_mode.
      	* combine.c (simplify_if_then_else): Use scalar_int_mode for local
      	variables.
      	(make_extraction): Likewise.
      	(try_widen_shift_mode): Take and return scalar_int_modes instead
      	of machine_modes.
      	* config/aarch64/aarch64.c (aarch64_libgcc_cmp_return_mode): Return
      	a scalar_int_mode instead of a machine_mode.
      	* config/avr/avr.c (avr_addr_space_address_mode): Likewise.
      	(avr_addr_space_pointer_mode): Likewise.
      	* config/cr16/cr16.c (cr16_unwind_word_mode): Likewise.
      	* config/msp430/msp430.c (msp430_addr_space_pointer_mode): Likewise.
      	(msp430_unwind_word_mode): Likewise.
      	* config/spu/spu.c (spu_unwind_word_mode): Likewise.
      	(spu_addr_space_pointer_mode): Likewise.
      	(spu_addr_space_address_mode): Likewise.
      	(spu_libgcc_cmp_return_mode): Likewise.
      	(spu_libgcc_shift_count_mode): Likewise.
      	* config/rl78/rl78.c (rl78_addr_space_address_mode): Likewise.
      	(rl78_addr_space_pointer_mode): Likewise.
      	(fl78_unwind_word_mode): Likewise.
      	(rl78_valid_pointer_mode): Take a scalar_int_mode instead of a
      	machine_mode.
      	* config/alpha/alpha.c (vms_valid_pointer_mode): Likewise.
      	* config/ia64/ia64.c (ia64_vms_valid_pointer_mode): Likewise.
      	* config/mips/mips.c (mips_mode_rep_extended): Likewise.
      	(mips_valid_pointer_mode): Likewise.
      	* config/tilegx/tilegx.c (tilegx_mode_rep_extended): Likewise.
      	* config/ft32/ft32.c (ft32_valid_pointer_mode): Likewise.
      	(ft32_addr_space_pointer_mode): Return a scalar_int_mode instead
      	of a machine_mode.
      	(ft32_addr_space_address_mode): Likewise.
      	* config/m32c/m32c.c (m32c_valid_pointer_mode): Take a
      	scalar_int_mode instead of a machine_mode.
      	(m32c_addr_space_pointer_mode): Return a scalar_int_mode instead
      	of a machine_mode.
      	(m32c_addr_space_address_mode): Likewise.
      	* config/powerpcspe/powerpcspe.c (rs6000_abi_word_mode): Likewise.
      	(rs6000_eh_return_filter_mode): Likewise.
      	* config/rs6000/rs6000.c (rs6000_abi_word_mode): Likewise.
      	(rs6000_eh_return_filter_mode): Likewise.
      	* config/s390/s390.c (s390_libgcc_cmp_return_mode): Likewise.
      	(s390_libgcc_shift_count_mode): Likewise.
      	(s390_unwind_word_mode): Likewise.
      	(s390_valid_pointer_mode): Take a scalar_int_mode rather than a
      	machine_mode.
      	* target.def (mode_rep_extended): Likewise.
      	(valid_pointer_mode): Likewise.
      	(addr_space.valid_pointer_mode): Likewise.
      	(eh_return_filter_mode): Return a scalar_int_mode rather than
      	a machine_mode.
      	(libgcc_cmp_return_mode): Likewise.
      	(libgcc_shift_count_mode): Likewise.
      	(unwind_word_mode): Likewise.
      	(addr_space.pointer_mode): Likewise.
      	(addr_space.address_mode): Likewise.
      	* doc/tm.texi: Regenerate.
      	* dojump.c (prefer_and_bit_test): Take a scalar_int_mode rather than
      	a machine_mode.
      	(do_jump): Use scalar_int_mode for local variables.
      	* dwarf2cfi.c (init_return_column_size): Take a scalar_int_mode
      	rather than a machine_mode.
      	* dwarf2out.c (convert_descriptor_to_mode): Likewise.
      	(scompare_loc_descriptor_wide): Likewise.
      	(scompare_loc_descriptor_narrow): Likewise.
      	* emit-rtl.c (adjust_address_1): Use scalar_int_mode for local
      	variables.
      	* except.c (sjlj_emit_dispatch_table): Likewise.
      	(expand_builtin_eh_copy_values): Likewise.
      	* explow.c (convert_memory_address_addr_space_1): Likewise.
      	Take a scalar_int_mode rather than a machine_mode.
      	(convert_memory_address_addr_space): Take a scalar_int_mode rather
      	than a machine_mode.
      	(memory_address_addr_space): Use scalar_int_mode for local variables.
      	* expmed.h (expand_mult_highpart_adjust): Take a scalar_int_mode
      	rather than a machine_mode.
      	* expmed.c (mask_rtx): Likewise.
      	(init_expmed_one_conv): Likewise.
      	(expand_mult_highpart_adjust): Likewise.
      	(extract_high_half): Likewise.
      	(expmed_mult_highpart_optab): Likewise.
      	(expmed_mult_highpart): Likewise.
      	(expand_smod_pow2): Likewise.
      	(expand_sdiv_pow2): Likewise.
      	(emit_store_flag_int): Likewise.
      	(adjust_bit_field_mem_for_reg): Use scalar_int_mode for local
      	variables.
      	(extract_low_bits): Likewise.
      	* expr.h (by_pieces_constfn): Take a scalar_int_mode rather than
      	a machine_mode.
      	* expr.c (pieces_addr::adjust):  Likewise.
      	(can_store_by_pieces): Likewise.
      	(store_by_pieces): Likewise.
      	(clear_by_pieces_1): Likewise.
      	(expand_expr_addr_expr_1): Likewise.
      	(expand_expr_addr_expr): Use scalar_int_mode for local variables.
      	(expand_expr_real_1): Likewise.
      	(try_casesi): Likewise.
      	* final.c (shorten_branches): Likewise.
      	* fold-const.c (fold_convert_const_int_from_fixed): Change the
      	type of "mode" to machine_mode.
      	* internal-fn.c (expand_arith_overflow_result_store): Take a
      	scalar_int_mode rather than a machine_mode.
      	(expand_mul_overflow): Use scalar_int_mode for local variables.
      	* loop-doloop.c (doloop_modify): Likewise.
      	(doloop_optimize): Likewise.
      	* optabs.c (expand_subword_shift): Take a scalar_int_mode rather
      	than a machine_mode.
      	(expand_doubleword_shift_condmove): Likewise.
      	(expand_doubleword_shift): Likewise.
      	(expand_doubleword_clz): Likewise.
      	(expand_doubleword_popcount): Likewise.
      	(expand_doubleword_parity): Likewise.
      	(expand_absneg_bit): Use scalar_int_mode for local variables.
      	(prepare_float_lib_cmp): Likewise.
      	* rtl.h (convert_memory_address_addr_space_1): Take a scalar_int_mode
      	rather than a machine_mode.
      	(convert_memory_address_addr_space): Likewise.
      	(get_mode_bounds): Likewise.
      	(get_address_mode): Return a scalar_int_mode rather than a
      	machine_mode.
      	* rtlanal.c (get_address_mode): Likewise.
      	* stor-layout.c (get_mode_bounds): Take a scalar_int_mode rather
      	than a machine_mode.
      	* targhooks.c (default_mode_rep_extended): Likewise.
      	(default_valid_pointer_mode): Likewise.
      	(default_addr_space_valid_pointer_mode): Likewise.
      	(default_eh_return_filter_mode): Return a scalar_int_mode rather
      	than a machine_mode.
      	(default_libgcc_cmp_return_mode): Likewise.
      	(default_libgcc_shift_count_mode): Likewise.
      	(default_unwind_word_mode): Likewise.
      	(default_addr_space_pointer_mode): Likewise.
      	(default_addr_space_address_mode): Likewise.
      	* targhooks.h (default_eh_return_filter_mode): Likewise.
      	(default_libgcc_cmp_return_mode): Likewise.
      	(default_libgcc_shift_count_mode): Likewise.
      	(default_unwind_word_mode): Likewise.
      	(default_addr_space_pointer_mode): Likewise.
      	(default_addr_space_address_mode): Likewise.
      	(default_mode_rep_extended): Take a scalar_int_mode rather than
      	a machine_mode.
      	(default_valid_pointer_mode): Likewise.
      	(default_addr_space_valid_pointer_mode): Likewise.
      	* tree-ssa-address.c (addr_for_mem_ref): Use scalar_int_mode for
      	local variables.
      	* tree-ssa-loop-ivopts.c (get_shiftadd_cost): Take a scalar_int_mode
      	rather than a machine_mode.
      	* tree-switch-conversion.c (array_value_type): Use scalar_int_mode
      	for local variables.
      	* tree-vrp.c (simplify_float_conversion_using_ranges): Likewise.
      	* var-tracking.c (use_narrower_mode): Take a scalar_int_mode rather
      	than a machine_mode.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251513
      Richard Sandiford committed
    • [51/77] Use opt_scalar_int_mode when iterating over integer modes · 59b51186
      This patch uses opt_scalar_int_mode rather than machine_mode
      when iterating over scalar_int_modes, in cases where that helps
      with future patches.  (Using machine_mode is still OK in places
      that don't really care about the mode being a scalar integer.)
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* cse.c (cse_insn): Use opt_scalar_int_mode for the mode iterator.
      	* explow.c (hard_function_value): Likewise.
      	* expmed.c (extract_fixed_bit_field_1): Likewise.  Move the
      	convert_to_mode call outside the loop.
      	* expr.c (alignment_for_piecewise_move): Use opt_scalar_int_mode
      	for the mode iterator.  Require the mode specified by max_pieces
      	to exist.
      	(emit_block_move_via_movmem): Use opt_scalar_int_mode for the
      	mode iterator.
      	(copy_blkmode_to_reg): Likewise.
      	(set_storage_via_setmem): Likewise.
      	* optabs.c (prepare_cmp_insn): Likewise.
      	* rtlanal.c (init_num_sign_bit_copies_in_rep): Likewise.
      	* stor-layout.c (finish_bitfield_representative): Likewise.
      
      gcc/fortran/
      	* trans-types.c (gfc_init_kinds): Use opt_scalar_int_mode for
      	the mode iterator.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251503
      Richard Sandiford committed
    • [4/77] Add FOR_EACH iterators for modes · c94843d2
      The new iterators are:
      
      - FOR_EACH_MODE_IN_CLASS: iterate over all the modes in a mode class.
      
      - FOR_EACH_MODE_FROM: iterate over all the modes in a class,
        starting at a given mode.
      
      - FOR_EACH_WIDER_MODE: iterate over all the modes in a class,
        starting at the next widest mode after a given mode.
      
      - FOR_EACH_2XWIDER_MODE: same, but considering only modes that
        are two times wider than the previous mode.
      
      - FOR_EACH_MODE_UNTIL: iterate over all the modes in a class until
        a given mode is reached.
      
      - FOR_EACH_MODE: iterate over all the modes in a class between
        two given modes, inclusive of the first but not the second.
      
      These help with the stronger type checking added by later patches,
      since every new mode will be in the same class as the previous one.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
                  Alan Hayward  <alan.hayward@arm.com>
                  David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* machmode.h (mode_traits): New structure.
      	(get_narrowest_mode): New function.
      	(mode_iterator::start): Likewise.
      	(mode_iterator::iterate_p): Likewise.
      	(mode_iterator::get_wider): Likewise.
      	(mode_iterator::get_known_wider): Likewise.
      	(mode_iterator::get_2xwider): Likewise.
      	(FOR_EACH_MODE_IN_CLASS): New mode iterator.
      	(FOR_EACH_MODE): Likewise.
      	(FOR_EACH_MODE_FROM): Likewise.
      	(FOR_EACH_MODE_UNTIL): Likewise.
      	(FOR_EACH_WIDER_MODE): Likewise.
      	(FOR_EACH_2XWIDER_MODE): Likewise.
      	* builtins.c (expand_builtin_strlen): Use new mode iterators.
      	* combine.c (simplify_comparison): Likewise
      	* config/i386/i386.c (type_natural_mode): Likewise.
      	* cse.c (cse_insn): Likewise.
      	* dse.c (find_shift_sequence): Likewise.
      	* emit-rtl.c (init_derived_machine_modes): Likewise.
      	(init_emit_once): Likewise.
      	* explow.c (hard_function_value): Likewise.
      	* expmed.c (extract_fixed_bit_field_1): Likewise.
      	(extract_bit_field_1): Likewise.
      	(expand_divmod): Likewise.
      	(emit_store_flag_1): Likewise.
      	* expr.c (init_expr_target): Likewise.
      	(convert_move): Likewise.
      	(alignment_for_piecewise_move): Likewise.
      	(widest_int_mode_for_size): Likewise.
      	(emit_block_move_via_movmem): Likewise.
      	(copy_blkmode_to_reg): Likewise.
      	(set_storage_via_setmem): Likewise.
      	(compress_float_constant): Likewise.
      	* omp-low.c (omp_clause_aligned_alignment): Likewise.
      	* optabs-query.c (get_best_extraction_insn): Likewise.
      	* optabs.c (expand_binop): Likewise.
      	(expand_twoval_unop): Likewise.
      	(expand_twoval_binop): Likewise.
      	(widen_leading): Likewise.
      	(widen_bswap): Likewise.
      	(expand_parity): Likewise.
      	(expand_unop): Likewise.
      	(prepare_cmp_insn): Likewise.
      	(prepare_float_lib_cmp): Likewise.
      	(expand_float): Likewise.
      	(expand_fix): Likewise.
      	(expand_sfix_optab): Likewise.
      	* postreload.c (move2add_use_add2_insn): Likewise.
      	* reg-stack.c (reg_to_stack): Likewise.
      	* reginfo.c (choose_hard_reg_mode): Likewise.
      	* rtlanal.c (init_num_sign_bit_copies_in_rep): Likewise.
      	* stor-layout.c (mode_for_size): Likewise.
      	(smallest_mode_for_size): Likewise.
      	(mode_for_vector): Likewise.
      	(finish_bitfield_representative): Likewise.
      	* tree-ssa-math-opts.c (target_supports_divmod_p): Likewise.
      	* tree-vect-generic.c (type_for_widest_vector_mode): Likewise.
      	* tree-vect-stmts.c (vectorizable_conversion): Likewise.
      	* var-tracking.c (prepare_call_arguments): Likewise.
      
      gcc/ada/
      	* gcc-interface/misc.c (fp_prec_to_size): Use new mode iterators.
      	(fp_size_to_prec): Likewise.
      
      gcc/c-family/
      	* c-common.c (c_common_fixed_point_type_for_size): Use new mode
      	iterators.
      	* c-cppbuiltin.c (c_cpp_builtins): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251455
      Richard Sandiford committed
  19. 29 Jun, 2017 1 commit
    • asan.c (asan_emit_stack_protection): Update. · 357067f2
      	* asan.c (asan_emit_stack_protection): Update.
      	(create_cond_insert_point): Update.
      	* auto-profile.c (afdo_propagate_circuit): Update.
      	* basic-block.h (struct edge_def): Turn probability to
      	profile_probability.
      	(EDGE_FREQUENCY): Update.
      	* bb-reorder.c (find_traces_1_round): Update.
      	(better_edge_p): Update.
      	(sanitize_hot_paths): Update.
      	* cfg.c (unchecked_make_edge): Initialize probability to uninitialized.
      	(make_single_succ_edge): Update.
      	(check_bb_profile): Update.
      	(dump_edge_info): Update.
      	(update_bb_profile_for_threading): Update.
      	* cfganal.c (connect_infinite_loops_to_exit): Initialize new edge
      	probabilitycount to 0.
      	* cfgbuild.c (compute_outgoing_frequencies): Update.
      	* cfgcleanup.c (try_forward_edges): Update.
      	(outgoing_edges_match): Update.
      	(try_crossjump_to_edge): Update.
      	* cfgexpand.c (expand_gimple_cond): Update make_single_succ_edge.
      	(expand_gimple_tailcall): Update.
      	(construct_init_block): Use make_single_succ_edge.
      	(construct_exit_block): Use make_single_succ_edge.
      	* cfghooks.c (verify_flow_info): Update.
      	(redirect_edge_succ_nodup): Update.
      	(split_edge): Update.
      	(account_profile_record): Update.
      	* cfgloopanal.c (single_likely_exit): Update.
      	* cfgloopmanip.c (scale_loop_profile): Update.
      	(set_zero_probability): Remove.
      	(duplicate_loop_to_header_edge): Update.
      	* cfgloopmanip.h (loop_version): Update prototype.
      	* cfgrtl.c (try_redirect_by_replacing_jump): Update.
      	(force_nonfallthru_and_redirect): Update.
      	(update_br_prob_note): Update.
      	(rtl_verify_edges): Update.
      	(purge_dead_edges): Update.
      	(rtl_lv_add_condition_to_bb): Update.
      	* cgraph.c: (cgraph_edge::redirect_call_stmt_to_calle): Update.
      	* cgraphunit.c (init_lowered_empty_function): Update.
      	(cgraph_node::expand_thunk): Update.
      	* cilk-common.c: Include profile-count.h
      	* dojump.c (inv): Remove.
      	(jumpifnot): Update.
      	(jumpifnot_1): Update.
      	(do_jump_1): Update.
      	(do_jump): Update.
      	(do_jump_by_parts_greater_rtx): Update.
      	(do_compare_rtx_and_jump): Update.
      	* dojump.h (jumpifnot, jumpifnot_1, jumpif_1, jumpif, do_jump,
      	do_jump_1. do_compare_rtx_and_jump): Update prototype.
      	* dwarf2cfi.c: Include profile-count.h
      	* except.c (dw2_build_landing_pads): Use make_single_succ_edge.
      	(sjlj_emit_dispatch_table): Likewise.
      	* explow.c: Include profile-count.h
      	* expmed.c (emit_store_flag_force): Update.
      	(do_cmp_and_jump): Update.
      	* expr.c (compare_by_pieces_d::generate): Update.
      	(compare_by_pieces_d::finish_mode): Update.
      	(emit_block_move_via_loop): Update.
      	(store_expr_with_bounds): Update.
      	(store_constructor): Update.
      	(expand_expr_real_2): Update.
      	(expand_expr_real_1): Update.
      	* expr.h (try_casesi, try_tablejump): Update prototypes.
      	* gimple-pretty-print.c (dump_probability): Update.
      	(dump_profile): New.
      	(dump_gimple_label): Update.
      	(dump_gimple_bb_header): Update.
      	* graph.c (draw_cfg_node_succ_edges): Update.
      	* hsa-gen.c (convert_switch_statements): Update.
      	* ifcvt.c (cheap_bb_rtx_cost_p): Update.
      	(find_if_case_1): Update.
      	(find_if_case_2): Update.
      	* internal-fn.c (expand_arith_overflow_result_store): Update.
      	(expand_addsub_overflow): Update.
      	(expand_neg_overflow): Update.
      	(expand_mul_overflow): Update.
      	(expand_vector_ubsan_overflow): Update.
      	* ipa-cp.c (good_cloning_opportunity_p): Update.
      	* ipa-split.c (split_function): Use make_single_succ_edge.
      	* ipa-utils.c (ipa_merge_profiles): Update.
      	* loop-doloop.c (add_test): Update.
      	(doloop_modify): Update.
      	* loop-unroll.c (compare_and_jump_seq): Update.
      	(unroll_loop_runtime_iterations): Update.
      	* lra-constraints.c (lra_inheritance): Update.
      	* lto-streamer-in.c (input_cfg): Update.
      	* lto-streamer-out.c (output_cfg): Update.
      	* mcf.c (adjust_cfg_counts): Update.
      	* modulo-sched.c (sms_schedule): Update.
      	* omp-expand.c (expand_omp_for_init_counts): Update.
      	(extract_omp_for_update_vars): Update.
      	(expand_omp_ordered_sink): Update.
      	(expand_omp_for_ordered_loops): Update.
      	(expand_omp_for_generic): Update.
      	(expand_omp_for_static_nochunk): Update.
      	(expand_omp_for_static_chunk): Update.
      	(expand_cilk_for): Update.
      	(expand_omp_simd): Update.
      	(expand_omp_taskloop_for_outer): Update.
      	(expand_omp_taskloop_for_inner): Update.
      	* omp-simd-clone.c (simd_clone_adjust): Update.
      	* optabs.c (expand_doubleword_shift): Update.
      	(expand_abs): Update.
      	(emit_cmp_and_jump_insn_1): Update.
      	(expand_compare_and_swap_loop): Update.
      	* optabs.h (emit_cmp_and_jump_insns): Update prototype.
      	* predict.c (predictable_edge_p): Update.
      	(edge_probability_reliable_p): Update.
      	(set_even_probabilities): Update.
      	(combine_predictions_for_insn): Update.
      	(combine_predictions_for_bb): Update.
      	(propagate_freq): Update.
      	(estimate_bb_frequencies): Update.
      	(force_edge_cold): Update.
      	* profile-count.c (profile_count::dump): Add missing space into dump.
      	(profile_count::debug): Add newline.
      	(profile_count::differs_from_p): Explicitly convert to unsigned.
      	(profile_count::stream_in): Update.
      	(profile_probability::dump): New member function.
      	(profile_probability::debug): New member function.
      	(profile_probability::differs_from_p): New member function.
      	(profile_probability::differs_lot_from_p): New member function.
      	(profile_probability::stream_in): New member function.
      	(profile_probability::stream_out): New member function.
      	* profile-count.h (profile_count_quality): Rename to ...
      	(profile_quality): ... this one.
      	(profile_probability): New.
      	(profile_count): Update.
      	* profile.c (compute_branch_probabilities): Update.
      	* recog.c (peep2_attempt): Update.
      	* sched-ebb.c (schedule_ebbs): Update.
      	* sched-rgn.c (find_single_block_region): Update.
      	(compute_dom_prob_ps): Update.
      	(schedule_region): Update.
      	* sel-sched-ir.c (compute_succs_info): Update.
      	* stmt.c (struct case_node): Update.
      	(do_jump_if_equal): Update.
      	(get_outgoing_edge_probs): Update.
      	(conditional_probability): Update.
      	(emit_case_dispatch_table): Update.
      	(expand_case): Update.
      	(expand_sjlj_dispatch_table): Update.
      	(emit_case_nodes): Update.
      	* targhooks.c: Update.
      	* tracer.c (better_p): Update.
      	(find_best_successor): Update.
      	* trans-mem.c (expand_transaction): Update.
      	* tree-call-cdce.c: Update.
      	* tree-cfg.c (gimple_split_edge): Upate.
      	(move_sese_region_to_fn): Upate.
      	* tree-cfgcleanup.c (cleanup_control_expr_graph): Upate.
      	* tree-eh.c (lower_resx): Upate.
      	(cleanup_empty_eh_move_lp): Upate.
      	* tree-if-conv.c (version_loop_for_if_conversion): Update.
      	* tree-inline.c (copy_edges_for_bb): Update.
      	(copy_cfg_body): Update.
      	* tree-parloops.c (gen_parallel_loop): Update.
      	* tree-profile.c (gimple_gen_ic_func_profiler): Update.
      	(gimple_gen_time_profiler): Update.
      	* tree-ssa-dce.c (remove_dead_stmt): Update.
      	* tree-ssa-ifcombine.c (update_profile_after_ifcombine): Update.
      	* tree-ssa-loop-im.c (execute_sm_if_changed): Update.
      	* tree-ssa-loop-ivcanon.c (remove_exits_and_undefined_stmts): Update.
      	(unloop_loops): Update.
      	(try_peel_loop): Update.
      	* tree-ssa-loop-manip.c (tree_transform_and_unroll_loop): Update.
      	* tree-ssa-loop-split.c (connect_loops): Update.
      	(split_loop): Update.
      	* tree-ssa-loop-unswitch.c (tree_unswitch_loop): Update.
      	(hoist_guard): Update.
      	* tree-ssa-phionlycprop.c (propagate_rhs_into_lhs): Update.
      	* tree-ssa-phiopt.c (replace_phi_edge_with_variable): Update.
      	(value_replacement): Update.
      	* tree-ssa-reassoc.c (branch_fixup): Update.
      	* tree-ssa-tail-merge.c (replace_block_by): Update.
      	* tree-ssa-threadupdate.c (remove_ctrl_stmt_and_useless_edges): Update.
      	(create_edge_and_update_destination_phis): Update.
      	(compute_path_counts): Update.
      	(recompute_probabilities): Update.
      	(update_joiner_offpath_counts): Update.
      	(freqs_to_counts_path): Update.
      	(duplicate_thread_path): Update.
      	* tree-switch-conversion.c (hoist_edge_and_branch_if_true): Update.
      	(struct switch_conv_info): Update.
      	(gen_inbound_check): Update.
      	* tree-vect-loop-manip.c (slpeel_add_loop_guard): Update.
      	(vect_do_peeling): Update.
      	(vect_loop_versioning): Update.
      	* tree-vect-loop.c (scale_profile_for_vect_loop): Update.
      	(optimize_mask_stores): Update.
      	* ubsan.c (ubsan_expand_null_ifn): Update.
      	* value-prof.c (gimple_divmod_fixed_value): Update.
      	(gimple_divmod_fixed_value_transform): Update.
      	(gimple_mod_pow2): Update.
      	(gimple_mod_pow2_value_transform): Update.
      	(gimple_mod_subtract): Update.
      	(gimple_mod_subtract_transform): Update.
      	(gimple_ic): Update.
      	(gimple_stringop_fixed_value): Update.
      	(gimple_stringops_transform): Update.
      	* value-prof.h: Update.
      
      From-SVN: r249800
      Jan Hubicka committed
  20. 02 Feb, 2017 1 commit
  21. 01 Jan, 2017 1 commit
  22. 18 Nov, 2016 2 commits
    • Re-apply: Drop excess size used for run time allocated stack variables. · d7931859
      The patch got reverted after hitting PR77359 which turned out to be a
      rs6000 backend problem.  Reapplying after the PR got fixed.
      
      gcc/ChangeLog:
      
      2016-11-18  Dominik Vogt  <vogt@linux.vnet.ibm.com>
      
      	Re-apply after PR bootstrap/77359 is fixed:
      	2016-08-23  Dominik Vogt  <vogt@linux.vnet.ibm.com>
      
              * explow.c (get_dynamic_stack_size): Take known alignment of stack
              pointer + STACK_DYNAMIC_OFFSET into account when calculating the
              size needed.
      
      --This line, and those below, will be
      ignored--
      
      M    gcc/ChangeLog
      M    gcc/explow.c
      
      From-SVN: r242590
      Dominik Vogt committed
    • Use rtx_mode_t instead of std::make_pair · f079167a
      This change makes the code less sensitive to the exact type of the mode,
      i.e. it forces a conversion where necessary.  This becomes important
      when wrappers like scalar_int_mode and scalar_mode can also be used
      instead of machine_mode.
      
      Using rtx_mode_t also abstracts away the representation.  The fact that
      it's a std::pair rather than a custom class isn't important to users of
      the interface.
      
      gcc/
      2016-11-18  Richard Sandiford  <richard.sandiford@arm.com>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      	* combine.c (try_combine): Use rtx_mode_t instead of std::make_pair.
      	* dwarf2out.c (mem_loc_descriptor, loc_descriptor): Likewise.
      	(add_const_value_attribute): Likewise.
      	* explow.c (plus_constant): Likewise.
      	* expmed.c (expand_mult, make_tree): Likewise.
      	* expr.c (convert_modes): Likewise.
      	* loop-doloop.c (doloop_optimize): Likewise.
      	* postreload.c (reload_cse_simplify_set): Likewise.
      	* simplify-rtx.c (simplify_const_unary_operation): Likewise.
      	(simplify_binary_operation_1, simplify_const_binary_operation):
      	(simplify_const_relational_operation, simplify_immed_subreg): Likewise.
      	* wide-int.h: Update documentation to recommend rtx_mode_t
      	instead of std::make_pair.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r242586
      Richard Sandiford committed
  23. 21 Oct, 2016 1 commit
    • make LABEL_REF_LABEL a rtx_insn * · 04a121a7
      While changing LABEL_REF_LABEL it might as well become an inline
      function, so that its clearer what types are involved.  Unfortunately
      because it is still possible to use XEXP and related macros on a
      LABEL_REF rtx you can still set the field to be a non insn rtx.  The
      other unfortunate thing is that the generators actually create LABEL_REF
      rtx that refer to MATCH_x rtx, so there we actually need to use XEXP to
      bypass the checking this patch adds.
      
      gcc/ChangeLog:
      
      2016-10-21  Trevor Saunders  <tbsaunde+gcc@tbsaunde.org>
      
      	* rtl.h (label_ref_label): New function.
      	(set_label_ref_label): New function.
      	(LABEL_REF_LABEL): Delete.
      	* alias.c (rtx_equal_for_memref_p): Adjust.
      	* cfgbuild.c (make_edges): Likewise.
      	(purge_dead_tablejump_edges): Likewise.
      	* cfgexpand.c (convert_debug_memory_address): Likewise.
      	* cfgrtl.c (patch_jump_insn): Likewise.
      	* combine.c (distribute_notes): Likewise.
      	* cse.c (hash_rtx_cb): Likewise.
      	(exp_equiv_p): Likewise.
      	(fold_rtx): Likewise.
      	(check_for_label_ref): Likewise.
      	* cselib.c (rtx_equal_for_cselib_1): Likewise.
      	(cselib_hash_rtx): Likewise.
      	* emit-rtl.c (mark_label_nuses): Likewise.
      	* explow.c (convert_memory_address_addr_space_1): Likewise.
      	* final.c (output_asm_label): Likewise.
      	(output_addr_const): Likewise.
      	* gcse.c (add_label_notes): Likewise.
      	* genconfig.c (walk_insn_part): Likewise.
      	* genrecog.c (validate_pattern): Likewise.
      	* ifcvt.c (cond_exec_get_condition): Likewise.
      	(noce_emit_store_flag): Likewise.
      	(noce_get_alt_condition): Likewise.
      	(noce_get_condition): Likewise.
      	* jump.c (maybe_propagate_label_ref): Likewise.
      	(mark_jump_label_1): Likewise.
      	(redirect_exp_1): Likewise.
      	(rtx_renumbered_equal_p): Likewise.
      	* lra-constraints.c (operands_match_p): Likewise.
      	* print-rtl.c (print_value): Likewise.
      	* reload.c (find_reloads): Likewise.
      	* reload1.c (set_label_offsets): Likewise.
      	* reorg.c (get_branch_condition): Likewise.
      	* rtl-tests.c (test_uncond_jump): Likewise.
      	* rtl.c (rtx_equal_p_cb): Likewise.
      	(rtx_equal_p): Likewise.
      	* rtlanal.c (reg_mentioned_p): Likewise.
      	(rtx_referenced_p): Likewise.
      	(get_condition): Likewise.
      	* varasm.c (const_hash_1): Likewise.
      	(compare_constant): Likewise.
      	(const_rtx_hash_1): Likewise.
      	(output_constant_pool_1): Likewise.
      
      From-SVN: r241401
      Trevor Saunders committed
  24. 17 Oct, 2016 1 commit
  25. 13 Oct, 2016 1 commit
    • Move MEMMODEL_* from coretypes.h to memmodel.h · 4d0cdd0c
      2016-10-13  Thomas Preud'homme  <thomas.preudhomme@arm.com>
      
          gcc/
          * coretypes.h: Move MEMMODEL_* macros and enum memmodel definition
          into ...
          * memmodel.h: This file.
          * alias.c, asan.c, auto-inc-dec.c, bb-reorder.c, bt-load.c,
            caller-save.c, calls.c, ccmp.c, cfgbuild.c, cfgcleanup.c,
            cfgexpand.c, cfgloopanal.c, cfgrtl.c, cilk-common.c, combine.c,
            combine-stack-adj.c, common/config/aarch64/aarch64-common.c,
            common/config/arm/arm-common.c, common/config/bfin/bfin-common.c,
            common/config/c6x/c6x-common.c, common/config/i386/i386-common.c,
            common/config/ia64/ia64-common.c, common/config/nvptx/nvptx-common.c,
            compare-elim.c, config/aarch64/aarch64-builtins.c,
            config/aarch64/aarch64-c.c, config/aarch64/cortex-a57-fma-steering.c,
            config/arc/arc.c, config/arc/arc-c.c, config/arm/arm-builtins.c,
            config/arm/arm-c.c, config/avr/avr.c, config/avr/avr-c.c,
            config/avr/avr-log.c, config/bfin/bfin.c, config/c6x/c6x.c,
            config/cr16/cr16.c, config/cris/cris.c, config/darwin-c.c,
            config/darwin.c, config/epiphany/epiphany.c,
            config/epiphany/mode-switch-use.c,
            config/epiphany/resolve-sw-modes.c, config/fr30/fr30.c,
            config/frv/frv.c, config/ft32/ft32.c, config/h8300/h8300.c,
            config/i386/i386-c.c, config/i386/winnt.c, config/iq2000/iq2000.c,
            config/lm32/lm32.c, config/m32c/m32c.c, config/m32r/m32r.c,
            config/m68k/m68k.c, config/mcore/mcore.c,
            config/microblaze/microblaze.c, config/mmix/mmix.c,
            config/mn10300/mn10300.c, config/moxie/moxie.c,
            config/msp430/msp430.c, config/nds32/nds32-cost.c,
            config/nds32/nds32-intrinsic.c, config/nds32/nds32-md-auxiliary.c,
            config/nds32/nds32-memory-manipulation.c,
            config/nds32/nds32-predicates.c, config/nds32/nds32.c,
            config/nios2/nios2.c, config/nvptx/nvptx.c, config/pa/pa.c,
            config/pdp11/pdp11.c, config/rl78/rl78.c, config/rs6000/rs6000-c.c,
            config/rx/rx.c, config/s390/s390-c.c, config/s390/s390.c,
            config/sh/sh.c, config/sh/sh-c.c, config/sh/sh-mem.cc,
            config/sh/sh_treg_combine.cc, config/sol2.c, config/spu/spu.c,
            config/stormy16/stormy16.c, config/tilegx/tilegx.c,
            config/tilepro/tilepro.c, config/v850/v850.c, config/vax/vax.c,
            config/visium/visium.c, config/vms/vms-c.c, config/xtensa/xtensa.c,
            coverage.c, cppbuiltin.c, cprop.c, cse.c, cselib.c, dbxout.c, dce.c,
            df-core.c, df-problems.c, df-scan.c, dojump.c, dse.c, dwarf2asm.c,
            dwarf2cfi.c, dwarf2out.c, emit-rtl.c, except.c, explow.c, expmed.c,
            expr.c, final.c, fold-const.c, function.c, fwprop.c, gcse.c,
            ggc-page.c, haifa-sched.c, hsa-brig.c, hsa-gen.c, hw-doloop.c,
            ifcvt.c, init-regs.c, internal-fn.c, ira-build.c, ira-color.c,
            ira-conflicts.c, ira-costs.c, ira-emit.c, ira-lives.c, ira.c, jump.c,
            loop-doloop.c, loop-invariant.c, loop-iv.c, loop-unroll.c,
            lower-subreg.c, lra.c, lra-assigns.c, lra-coalesce.c,
            lra-constraints.c, lra-eliminations.c, lra-lives.c, lra-remat.c,
            lra-spills.c, mode-switching.c, modulo-sched.c, omp-low.c, passes.c,
            postreload-gcse.c, postreload.c, predict.c, print-rtl-function.c,
            recog.c, ree.c, reg-stack.c, regcprop.c, reginfo.c, regrename.c,
            reload.c, reload1.c, reorg.c, resource.c, rtl-chkp.c, rtl-tests.c,
            rtlanal.c, rtlhooks.c, sched-deps.c, sched-rgn.c, sdbout.c,
            sel-sched-ir.c, sel-sched.c, shrink-wrap.c, simplify-rtx.c,
            stack-ptr-mod.c, stmt.c, stor-layout.c, target-globals.c,
            targhooks.c, toplev.c, tree-nested.c, tree-outof-ssa.c,
            tree-profile.c, tree-ssa-coalesce.c, tree-ssa-ifcombine.c,
            tree-ssa-loop-ivopts.c, tree-ssa-loop.c, tree-ssa-reassoc.c,
            tree-ssa-sccvn.c, tree-vect-data-refs.c, ubsan.c, valtrack.c,
            var-tracking.c, varasm.c: Include memmodel.h.
          * genattrtab.c (write_header): Include memmodel.h in generated file.
          * genautomata.c (main): Likewise.
          * gengtype.c (open_base_files): Likewise.
          * genopinit.c (main): Likewise.
          * genconditions.c (write_header): Include memmodel.h earlier in
          generated file.
          * genemit.c (main): Likewise.
          * genoutput.c (output_prologue): Likewise.
          * genpeep.c (main): Likewise.
          * genpreds.c (write_insn_preds_c): Likewise.
          * genrecog.c (write_header): Likewise.
          * Makefile.in (PLUGIN_HEADERS): Include memmodel.h
      
          gcc/ada/
          * gcc-interface/utils2.c: Include memmodel.h.
      
          gcc/c-family/
          * c-cppbuiltin.c: Include memmodel.h.
          * c-opts.c: Likewise.
          * c-pragma.c: Likewise.
          * c-warn.c: Likewise.
      
          gcc/c/
          * c-typeck.c: Include memmodel.h.
      
          gcc/cp/
          * decl2.c: Include memmodel.h.
          * rtti.c: Likewise.
      
          gcc/fortran/
          * trans-intrinsic.c: Include memmodel.h.
      
          gcc/go/
          * go-backend.c: Include memmodel.h.
      
          libgcc/
          * libgcov-profiler.c: Replace MEMMODEL_* macros by their __ATOMIC_*
          equivalent.
          * config/tilepro/atomic.c: Likewise and stop casting model to
          enum memmodel.
      
      From-SVN: r241121
      Thomas Preud'homme committed
  26. 05 Oct, 2016 1 commit
  27. 04 Oct, 2016 1 commit
  28. 27 Sep, 2016 1 commit
    • auto-inc-dec.c (try_merge): Remove break after return. · bbfac6da
      	* auto-inc-dec.c (try_merge): Remove break after return.
      	* cselib.c (autoinc_split): Likewise.
      	* explow.c (promote_mode): Likewise.
      	* fixed-value.c (fixed_arithmetic): Likewise.
      	* hsa.c (hsa_internal_fn::get_arity): Likewise.
      	* rtlanal.c (modified_between_p, modified_in_p): Likewise.
      	* trans-mem.c (get_attrs_for): Likewise.
      	* tree-if-conv.c (if_convertible_stmt_p): Likewise.
      	* tree-vrp.c (simplify_stmt_using_ranges): Likewise.
      	* config/aarch64/aarch64-builtins.c (aarch64_fold_builtin): Likewise.
      	* config/aarch64/aarch64.c (aarch64_get_condition_code_1): Likewise.
      	* config/c6x/c6x.c (c6x_get_unit_specifier): Likewise.
      	* config/cr16/cr16.c (legitimate_pic_operand_p): Likewise.
      	* config/cris/cris.c (cris_op_str): Likewise.
      	* config/mn10300/mn10300.c (cc_flags_for_code): Likewise.
      	* config/tilepro/tilepro.c (tilepro_emit_setcc_internal_di): Likewise.
      c-family/
      	* c-ada-spec.c (print_ada_declaration): Remove break after return.
      objc/
      	* objc-act.c (continue_class): Remove break after return.
      	(objc_maybe_printable_name): Likewise.
      fortran/
      	* dependency.c (gfc_dep_compare_expr): Remove break after return.
      	* frontend-passes.c (optimize_op): Likewise.
      	* interface.c (gfc_current_interface_head): Likewise.
      	* symbol.c (check_conflict): Likewise.
      	* trans-intrinsic.c (build_fix_expr): Likewise.
      ada/
      	* terminals.c (is_gui_app): Remove break after return.
      
      From-SVN: r240554
      Jakub Jelinek committed
  29. 05 Sep, 2016 1 commit
    • re PR target/77452 (ICE: in plus_constant, at explow.c:87 with… · 8a27cf73
      re PR target/77452 (ICE: in plus_constant, at explow.c:87 with -fno-split-wide-types -mavx512f --param=max-combine-insns=2)
      
      	PR rtl-optimization/77452
      	* explow.c (plus_constant) <case MEM>: Extract scalar constant from
      	inner-mode reference to a CONST_VECTOR constant in the constant pool.
      
      testsuite/ChangeLog:
      
      	PR rtl-optimization/77452
      	* gcc.target/i386/pr77452.c: New test.
      
      From-SVN: r239989
      Uros Bizjak committed
  30. 24 Aug, 2016 1 commit
  31. 23 Aug, 2016 1 commit
    • Drop excess size used for run time allocated stack variables. · 1135a133
      * get_dynamic_stack_size is passed a SIZE of a data block (which is
        allocated elsewhere), the SIZE_ALIGN of the SIZE (i.e. the alignment
        of the underlying memory units (e.g. 32 bytes split into 4 times 8
        bytes = 64 bit alignment) and the REQUIRED_ALIGN of the data portion
        of the allocated memory.
      
      * Assuming the function is called with SIZE = 2, SIZE_ALIGN = 8 and
        REQUIRED_ALIGN = 64 it first adds 7 bytes to SIZE -> 9.  This is
        what is needed to have two bytes 8-byte-aligned at some memory
        location without any known alignment.
      
      * Finally round_push is called to round up SIZE to a multiple of the
        stack slot size.
      
      The key to understanding this is that the function assumes that
      STACK_DYNMAIC_OFFSET is completely unknown at the time its called
      and therefore it does not make assumptions about the alignment of
      STACKPOINTER + STACK_DYNMAIC_OFFSET.  The latest patch simply
      hard-codes that SP + SDO is supposed to be aligned to at least
      stack slot size (and does that in a very complicated way).  Since
      there is no guarantee that this is the case on all targets, the
      patch is broken.  It may miscalculate a SIZE that is too small in
      some cases.
      
      However, on many targets there is some guarantee about the
      alignment of SP + SDO even if the actual value of SDO is unknown.
      On s390x it's always 8-byte-aligned (stack slot size).  So the
      right fix should be to add knowledge about the target's guaranteed
      alignment of SP + SDO to the function.  I'm right now testing a
      much simpler patch that uses
      REGNO_POINTER_ALIGN(VIRTUAL_STACK_DYNAMIC_REGNUM) as the
      alignment.
      
      
      gcc/ChangeLog:
      
      2016-08-23  Dominik Vogt  <vogt@linux.vnet.ibm.com>
      
      	* explow.c (get_dynamic_stack_size): Take known alignment of stack
      	pointer + STACK_DYNAMIC_OFFSET into account when calculating the
      	size needed.  Correct a typo in a comment.
      
      From-SVN: r239688
      Dominik Vogt committed