aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <jlaw@ventanamicro.com>2023-09-19 11:28:53 -0600
committerJeff Law <jlaw@ventanamicro.com>2023-09-19 11:30:31 -0600
commiteec7c373c2de6d5806537552de5f5b2bd064c43e (patch)
tree82531bcd42ad5a1279800033e2006b1d13d1bd76
parent15acabb80f91b12836bcf4ffcb92ea10fe4e8272 (diff)
downloadgcc-eec7c373c2de6d5806537552de5f5b2bd064c43e.zip
gcc-eec7c373c2de6d5806537552de5f5b2bd064c43e.tar.gz
gcc-eec7c373c2de6d5806537552de5f5b2bd064c43e.tar.bz2
Fix bogus operand predicate on iq2000
The iq2000-elf port regressed these tests recently: > iq2000-sim: gcc.c-torture/execute/20040703-1.c -O2 (test for excess errors) > iq2000-sim: gcc.c-torture/execute/20040703-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none (test for excess errors) > iq2000-sim: gcc.c-torture/execute/20040703-1.c -O3 -g (test for excess errors) It turns out one of the patterns had an operand predicate that allowed REG, SUBREG, CONST_INT (with a limited set of CONST_INTs). Yet the constraint only allowed the limited set of immediates. This naturally triggered an LRA constraint failure. The fix is trivial, create an operand predicate that accurately reflects the kinds of operands allowed by the instruction. It turns out this was a long standing bug -- fixing the pattern resolved 55 failing tests in the testsuite. gcc/ * config/iq2000/predicates.md (uns_arith_constant): New predicate. * config/iq2000/iq2000.md (rotrsi3): Use it.
-rw-r--r--gcc/config/iq2000/iq2000.md2
-rw-r--r--gcc/config/iq2000/predicates.md9
2 files changed, 10 insertions, 1 deletions
diff --git a/gcc/config/iq2000/iq2000.md b/gcc/config/iq2000/iq2000.md
index aaeda39..f157a82 100644
--- a/gcc/config/iq2000/iq2000.md
+++ b/gcc/config/iq2000/iq2000.md
@@ -988,7 +988,7 @@
(define_insn "rotrsi3"
[(set (match_operand:SI 0 "register_operand" "=r")
(rotatert:SI (match_operand:SI 1 "register_operand" "r")
- (match_operand:SI 2 "uns_arith_operand" "O")))]
+ (match_operand:SI 2 "uns_arith_constant" "O")))]
""
"ram %0,%1,%2,0x0,0x0"
[(set_attr "type" "arith")])
diff --git a/gcc/config/iq2000/predicates.md b/gcc/config/iq2000/predicates.md
index 1330f7d6..38857e1 100644
--- a/gcc/config/iq2000/predicates.md
+++ b/gcc/config/iq2000/predicates.md
@@ -17,6 +17,15 @@
;; along with GCC; see the file COPYING3. If not see
;; <http://www.gnu.org/licenses/>.
+;; Return 1 if OP can be used as an operand where a 16-bit
+;; unsigned integer is needed.
+
+(define_predicate "uns_arith_constant"
+ (match_code "const_int")
+{
+ return SMALL_INT_UNSIGNED (op);
+})
+
;; Return 1 if OP can be used as an operand where a register or 16-bit
;; unsigned integer is needed.