diff options
author | Jeff Law <jeffreyalaw@gmail.com> | 2021-06-18 18:02:16 -0400 |
---|---|---|
committer | Jeff Law <jeffreyalaw@gmail.com> | 2021-06-18 18:05:08 -0400 |
commit | 629cbc682a773e64c4bcb800ea98fb3051cd810c (patch) | |
tree | b145dba0ab7ef721f493039b8404df71bcbd023f /gcc/config/h8300 | |
parent | cb448ade74da1de1633e6ed97f8c5ecbac24b27a (diff) | |
download | gcc-629cbc682a773e64c4bcb800ea98fb3051cd810c.zip gcc-629cbc682a773e64c4bcb800ea98fb3051cd810c.tar.gz gcc-629cbc682a773e64c4bcb800ea98fb3051cd810c.tar.bz2 |
[committed] More useless code elimination on the H8
gcc/
* config/h8300/h8300.c (h8300_select_cc_mode): Handle SYMBOL_REF.
* config/h8300/logical.md (<code><mode>3 logcial expander): Generate
more efficient code when the source can be trivially simplified.
Diffstat (limited to 'gcc/config/h8300')
-rw-r--r-- | gcc/config/h8300/h8300.c | 2 | ||||
-rw-r--r-- | gcc/config/h8300/logical.md | 22 |
2 files changed, 22 insertions, 2 deletions
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c index 1077a2b..2b88325 100644 --- a/gcc/config/h8300/h8300.c +++ b/gcc/config/h8300/h8300.c @@ -1950,7 +1950,7 @@ h8300_select_cc_mode (enum rtx_code cond, rtx op0, rtx op1) || GET_CODE (op0) == NEG || GET_CODE (op0) == AND || GET_CODE (op0) == IOR || GET_CODE (op0) == XOR || GET_CODE (op0) == NOT || GET_CODE (op0) == ASHIFT - || GET_CODE (op0) == MULT + || GET_CODE (op0) == MULT || GET_CODE (op0) == SYMBOL_REF || GET_CODE (op0) == SIGN_EXTEND || GET_CODE (op0) == ZERO_EXTEND || REG_P (op0) || MEM_P (op0))) return CCZNmode; diff --git a/gcc/config/h8300/logical.md b/gcc/config/h8300/logical.md index cb4c638..07d36cf 100644 --- a/gcc/config/h8300/logical.md +++ b/gcc/config/h8300/logical.md @@ -4,7 +4,27 @@ (logicals:QHSI (match_operand:QHSI 1 "register_operand" "") (match_operand:QHSI 2 "h8300_src_operand" "")))] "" - "") + " + { + enum machine_mode mode = GET_MODE (operands[0]); + /* DImodes are not considered tieable, as a result operations involving + subregs of DImode objects are considered expensive which can prevent + CSE from doing obvious simplifications. + + We may ultimately change what is tieable, but this is an immediate + workaround while we evaluate changes to tieable modes. + + The key in terms of what we want to handle is then the result of + the operation is not a constant. */ + if ((<CODE> == AND && operands[2] == CONSTM1_RTX (mode)) + || (<CODE> == IOR && operands[2] == CONST0_RTX (mode)) + || (<CODE> == XOR && operands[2] == CONST0_RTX (mode)) + || ((<CODE> == AND || <CODE> == IOR) && operands[1] == operands[2])) + { + emit_move_insn (operands[0], operands[1]); + DONE; + } + }") ;; There's a ton of cleanup to do from here below. ;; ---------------------------------------------------------------------- |