This is another minor patch for elimination of redundant test/compares
on the H8. In particular it allows the compiler to use the result of a
byte sized AND instruction to eliminate a compare/test. The only
"trick" here is we have to distinguish between BCLR which clears a bit,
but does not set condition codes and AND which does set condition codes.
This patch also fixes a minor goof in the length computation of such
instructions. The prior patterns had the length computation backwards.
Byte sized ANDs are always 2 bytes while a BCLR can be from 2 to 8 bytes
long depending on the target operand.
Finally this patch also merges the H8SX BSET/BNOT for QI and HI mode.
This is about 9 hours into the 22 hour test cycle (my timeouts are
dramatically longer than the defaults to improve test coverage and
stability). I'm not expecting any issues.
Committed to the trunk,
Jeff
commit 941aa24ca9553b422dba6e267448ddd952bc52d1
Author: Jeff Law <jeffreya...@gmail.com>
Date: Tue Jun 8 10:10:23 2021 -0400
Further improve redundant test/compare removal on the H8
gcc/
* config/h8300/logical.md (andqi3_1): Move BCLR case into
define_insn_and_split.
Create length attribute on define_insn_and_split. Only split for
cases which we
know will use AND.
(andqi3_1<cczn>): Renamed from andqi3_1_clobber_flags. Only handle
AND here and
fix length computation.
(b<code><mode>msx): Combine QImode and HImode H8/SX patterns using
iterator.
diff --git a/gcc/config/h8300/logical.md b/gcc/config/h8300/logical.md
index 34cf74e24ee..fae3c7cd0c5 100644
--- a/gcc/config/h8300/logical.md
+++ b/gcc/config/h8300/logical.md
@@ -62,22 +62,21 @@
(match_operand:QI 2 "h8300_src_operand" "Y0,rn")))]
"register_operand (operands[0], QImode)
|| single_zero_operand (operands[2], QImode)"
- "#"
- "&& reload_completed"
+ "bclr %W2,%R0"
+ "&& reload_completed && !single_zero_operand (operands[2], QImode)"
[(parallel [(set (match_dup 0) (and:QI (match_dup 1) (match_dup 2)))
- (clobber (reg:CC CC_REG))])])
+ (clobber (reg:CC CC_REG))])]
+ ""
+ [(set_attr "length" "8,2")])
-(define_insn "andqi3_1_clobber_flags"
- [(set (match_operand:QI 0 "bit_operand" "=U,r")
- (and:QI (match_operand:QI 1 "bit_operand" "%0,0")
- (match_operand:QI 2 "h8300_src_operand" "Y0,rn")))
+(define_insn "*andqi3_1<cczn>"
+ [(set (match_operand:QI 0 "register_operand" "=r")
+ (and:QI (match_operand:QI 1 "register_operand" "%0")
+ (match_operand:QI 2 "h8300_src_operand" "rn")))
(clobber (reg:CC CC_REG))]
- "register_operand (operands[0], QImode)
- || single_zero_operand (operands[2], QImode)"
- "@
- bclr %W2,%R0
- and %X2,%X0"
- [(set_attr "length" "2,8")])
+ ""
+ "and %X2,%X0"
+ [(set_attr "length" "2")])
(define_insn_and_split "*andor<mode>3"
[(set (match_operand:QHSI 0 "register_operand" "=r")
@@ -166,22 +165,14 @@
;; OR/XOR INSTRUCTIONS
;; ----------------------------------------------------------------------
-(define_insn "b<code>qi_msx"
- [(set (match_operand:QI 0 "bit_register_indirect_operand" "=WU")
- (ors:QI (match_operand:QI 1 "bit_register_indirect_operand" "%0")
- (match_operand:QI 2 "single_one_operand" "Y2")))]
+(define_insn "b<code><mode>_msx"
+ [(set (match_operand:QHI 0 "bit_register_indirect_operand" "=WU")
+ (ors:QHI (match_operand:QHI 1 "bit_register_indirect_operand" "%0")
+ (match_operand:QHI 2 "single_one_operand" "Y2")))]
"TARGET_H8300SX && rtx_equal_p (operands[0], operands[1])"
{ return <CODE> == IOR ? "bset\\t%V2,%0" : "bnot\\t%V2,%0"; }
[(set_attr "length" "8")])
-(define_insn "b<code>hi_msx"
- [(set (match_operand:HI 0 "bit_register_indirect_operand" "=m")
- (ors:HI (match_operand:HI 1 "bit_register_indirect_operand" "%0")
- (match_operand:HI 2 "single_one_operand" "Y2")))]
- "TARGET_H8300SX"
- { return <CODE> == IOR ? "bset\\t%V2,%0" : "bnot\\t%V2,%0"; }
- [(set_attr "length" "8")])
-
(define_insn_and_split "<code>qi3_1"
[(set (match_operand:QI 0 "bit_operand" "=U,rQ")
(ors:QI (match_operand:QI 1 "bit_operand" "%0,0")