Skip to content
Snippets Groups Projects
Commit 873cffc7 authored by Georg-Johann Lay's avatar Georg-Johann Lay
Browse files

AVR: target/117726 - Better optimizations of ASHIFT:SI insns.

This patch improves the 4-byte ASHIFT insns.
1) It adds a "r,r,C15" alternative for improved long << 15.
2) It adds 3-operand alternatives (depending on options) and
   splits them after peephole2 / before avr-fuse-move into
   a 3-operand byte shift and a 2-operand residual bit shift.
For better control, it introduces new option -msplit-bit-shift
that's activated at -O2 and higher per default.  2) is even
performed with -Os, but not with -Oz.

	PR target/117726
gcc/
	* config/avr/avr.opt (-msplit-bit-shift): Add new optimization option.
	* common/config/avr/avr-common.cc (avr_option_optimization_table)
	[OPT_LEVELS_2_PLUS]: Turn on -msplit-bit-shift.
	* config/avr/avr.h (machine_function.n_avr_fuse_add_executed):
	New bool component.
	* config/avr/avr.md (attr "isa") <2op, 3op>: Add new values.
	(attr "enabled"): Handle them.
	(ashlsi3, *ashlsi3, *ashlsi3_const): Add "r,r,C15" alternative.
	Add "r,0,C4l" and "r,r,C4l" alternatives (depending on 2op / 3op).
	(define_split) [avr_split_bit_shift]: Add 2 new ashift:ALL4 splitters.
	(define_peephole2) [ashift:ALL4]: Add (match_dup 3) so that the scratch
	won't overlap with the output operand of the matched insn.
	(*ashl<mode>3_const_split): Remove unused ashift:ALL4 splitter.
	* config/avr/avr-passes.cc (emit_valid_insn)
	(emit_valid_move_clobbercc): Move out of anonymous namespace.
	(make_avr_pass_fuse_add) <gate>: Don't override.
	<execute>: Set n_avr_fuse_add_executed according to
	func->machine->n_avr_fuse_add_executed.
	(pass_data avr_pass_data_split_after_peephole2): New object.
	(avr_pass_split_after_peephole2): New rtl_opt_pass.
	(avr_emit_shift): New static function.
	(avr_shift_is_3op, avr_split_shift_p, avr_split_shift)
	(make_avr_pass_split_after_peephole2): New functions.
	* config/avr/avr-passes.def (avr_pass_split_after_peephole2):
	Insert new pass after pass_peephole2.
	* config/avr/avr-protos.h
	(n_avr_fuse_add_executed, avr_shift_is_3op, avr_split_shift_p)
	(avr_split_shift, avr_optimize_size_level)
	(make_avr_pass_split_after_peephole2): New prototypes.
	* config/avr/avr.cc (n_avr_fuse_add_executed): New global variable.
	(avr_optimize_size_level): New function.
	(avr_set_current_function): Set n_avr_fuse_add_executed
	according to cfun->machine->n_avr_fuse_add_executed.
	(ashlsi3_out) [case 15]: Output optimized code for this offset.
	(avr_rtx_costs_1) [ASHIFT, SImode]: Adjust costs of oggsets 15, 16.
	* config/avr/constraints.md (C4a, C4r, C4r): New constraints.
	* pass_manager.h (pass_manager): Adjust comments.
parent 938094ab
No related branches found
No related tags found
No related merge requests found
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment