This is the mail archive of the
mailing list for the GCC project.
[committed] Fix ICE due to bogus operand predicate in H8 port peepholes
- From: Jeff Law <law at redhat dot com>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 3 Dec 2018 08:21:22 -0700
- Subject: [committed] Fix ICE due to bogus operand predicate in H8 port peepholes
This is a bit more interesting than the last H8 fix.
The H8 has peepholes to optimize masking a value down to a byte. They
rely on using gen_lowpart to extract the low byte value of the source
operand which works well on the H8 because accessing the low byte of a
reg is particularly cheap. THey also work on memory operands.
These peepholes don't really work on symbolic operands. And if one
makes it into the peephole we'll abort in gen_lowpart.
Anyway, the peepholes currently accept "general_operand", which of
course allows those problematical symbolic operands. Changing the
operand to "nonimmediate_operand" resolves the issue. Note that
compile-time constants aren't really a concern here as the expression
would have already been simplified.
This fixes a half-dozen failures in the H8 testsuite. More importantly
it makes it less likely that a test will suddenly fail because of
improvements to constant propagation or forward propagation.
Installing on the trunk.
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bde3cd4f042..be0aab2c876 100644
@@ -1,3 +1,8 @@
+2018-12-03 Jeff Law <email@example.com>
+ * config/h8300/h8300.md (low byte masking peepholes): Only accept
+ nonimmediate_operand for the to-be-masked operand.
2018-12-03 Richard Biener <firstname.lastname@example.org>
* tree-ssa-sccvn.c (eliminate_dom_walker::eliminate_stmt): Only
diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md
index b3ba7e0f719..9e8f7159846 100644
@@ -4647,7 +4647,7 @@
[(set (match_operand:SI 0 "register_operand" "")
- (match_operand:SI 1 "general_operand" ""))
+ (match_operand:SI 1 "nonimmediate_operand" ""))
(set (match_dup 0)
(and:SI (match_dup 0)
@@ -4666,7 +4666,7 @@
[(set (match_operand 0 "register_operand" "")
- (match_operand 1 "general_operand" ""))
+ (match_operand 1 "nonimmediate_operand" ""))
(set (match_operand:SI 2 "register_operand" "")
(and:SI (match_dup 2)
(match_operand:SI 3 "const_int_qi_operand" "")))]