]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
AVR: Detect more skip opportunities.
authorGeorg-Johann Lay <avr@gjlay.de>
Fri, 13 Sep 2024 16:06:57 +0000 (18:06 +0200)
committerGeorg-Johann Lay <avr@gjlay.de>
Fri, 13 Sep 2024 18:43:36 +0000 (20:43 +0200)
The transparent call insns like "*parityhi2.libgcc" output a single
[R]CALL instruction that can be skipped by the skip instructions.
Such insns have attribute "type" of "xcall" and can therefore
be easily recognized.  Same applies when "adjust_len" is "call".

gcc/
* config/avr/avr.cc (avr_2word_insn_p): Return true for
transparent calls: When insn attribute "type" is "xcall"
or when "adjust_len" is "call".

gcc/config/avr/avr.cc

index 48d1d0e76465733713a9c623384fbda86ba8d422..4cb51ea68dc73047113457545319dd82a2738412 100644 (file)
@@ -12972,7 +12972,7 @@ test_hard_reg_class (enum reg_class rclass, rtx x)
 }
 
 
-/* Helper for jump_over_one_insn_p:  Test if INSN is a 2-word instruction
+/* Helper for `jump_over_one_insn_p':  Test if INSN is a 2-word instruction
    and thus is suitable to be skipped by CPSE, SBRC, etc.  */
 
 static bool
@@ -12986,7 +12986,10 @@ avr_2word_insn_p (rtx_insn *insn)
   switch (INSN_CODE (insn))
     {
     default:
-      return false;
+      return (recog_memoized (insn) >= 0
+             // Transparent calls may be skipped.
+             && (get_attr_type (insn) == TYPE_XCALL
+                 || get_attr_adjust_len (insn) == ADJUST_LEN_CALL));
 
     case CODE_FOR_movqi_insn:
     case CODE_FOR_movuqq_insn: