aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/h8300
diff options
context:
space:
mode:
authorJeff Law <jeffreyalaw@gmail.com>2021-06-18 18:02:16 -0400
committerJeff Law <jeffreyalaw@gmail.com>2021-06-18 18:05:08 -0400
commit629cbc682a773e64c4bcb800ea98fb3051cd810c (patch)
treeb145dba0ab7ef721f493039b8404df71bcbd023f /gcc/config/h8300
parentcb448ade74da1de1633e6ed97f8c5ecbac24b27a (diff)
downloadgcc-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.c2
-rw-r--r--gcc/config/h8300/logical.md22
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.
;; ----------------------------------------------------------------------