From ff24b82044cde0c0ff5dd68f45bc9f2bfbcfb3cf Mon Sep 17 00:00:00 2001 From: Stephane Carrez Date: Sun, 6 Jun 2004 15:56:33 +0200 Subject: [PATCH] re PR target/14457 (ICE with simple c++ source) PR target/14457 * config/m68hc11/m68hc11.c (splitable_operand): New predicate. * config/m68hc11/m68hc11-protos.h (splitable_operand): Declare. * config/m68hc11/m68hc11.h (PREDICATE_CODES): Register it. (inhibit_libc): Must define. * config/m68hc11/m68hc11.md ("movhi_const0"): Use splitable_operand. ("*andhi3_gen", "iorhi3", "*iorhi3_gen"): Likewise. ("xorhi3"): Likewise. From-SVN: r82670 --- gcc/ChangeLog | 11 +++++++++++ gcc/config/m68hc11/m68hc11-protos.h | 3 ++- gcc/config/m68hc11/m68hc11.c | 18 ++++++++++++++++++ gcc/config/m68hc11/m68hc11.h | 5 ++++- gcc/config/m68hc11/m68hc11.md | 16 ++++++++-------- 5 files changed, 43 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2896c089b1c..cca009ba24f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2004-06-06 Stephane Carrez + + PR target/14457 + * config/m68hc11/m68hc11.c (splitable_operand): New predicate. + * config/m68hc11/m68hc11-protos.h (splitable_operand): Declare. + * config/m68hc11/m68hc11.h (PREDICATE_CODES): Register it. + (inhibit_libc): Must define. + * config/m68hc11/m68hc11.md ("movhi_const0"): Use splitable_operand. + ("*andhi3_gen", "iorhi3", "*iorhi3_gen"): Likewise. + ("xorhi3"): Likewise. + 2004-06-06 Eric Botcazou * cgraphunit.c (cgraph_decide_inlining): Adjust dump lines in diff --git a/gcc/config/m68hc11/m68hc11-protos.h b/gcc/config/m68hc11/m68hc11-protos.h index f5a1b4e8eb3..dbd7d87f7f4 100644 --- a/gcc/config/m68hc11/m68hc11-protos.h +++ b/gcc/config/m68hc11/m68hc11-protos.h @@ -1,5 +1,5 @@ /* Prototypes for exported functions defined in m68hc11.c - Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Stephane Carrez (stcarrez@nerim.fr) This file is part of GCC. @@ -104,6 +104,7 @@ extern int memory_reload_operand (rtx, enum machine_mode); extern int stack_register_operand (rtx, enum machine_mode); extern int d_register_operand (rtx, enum machine_mode); extern int hard_addr_reg_operand (rtx, enum machine_mode); +extern int splitable_operand (rtx, enum machine_mode); extern int arith_src_operand (rtx, enum machine_mode); extern int m68hc11_logical_operator (rtx, enum machine_mode); extern int m68hc11_arith_operator (rtx, enum machine_mode); diff --git a/gcc/config/m68hc11/m68hc11.c b/gcc/config/m68hc11/m68hc11.c index dadbd9a08fd..321e1ab1633 100644 --- a/gcc/config/m68hc11/m68hc11.c +++ b/gcc/config/m68hc11/m68hc11.c @@ -1009,6 +1009,24 @@ non_push_operand (rtx operand, enum machine_mode mode) return 1; } +int +splitable_operand (rtx operand, enum machine_mode mode) +{ + if (general_operand (operand, mode) == 0) + return 0; + + if (push_operand (operand, mode) == 1) + return 0; + + /* Reject a (MEM (MEM X)) because the patterns that use non_push_operand + need to split such addresses to access the low and high part but it + is not possible to express a valid address for the low part. */ + if (mode != QImode && GET_CODE (operand) == MEM + && GET_CODE (XEXP (operand, 0)) == MEM) + return 0; + return 1; +} + int reg_or_some_mem_operand (rtx operand, enum machine_mode mode) { diff --git a/gcc/config/m68hc11/m68hc11.h b/gcc/config/m68hc11/m68hc11.h index b441b4dad9f..378454ca658 100644 --- a/gcc/config/m68hc11/m68hc11.h +++ b/gcc/config/m68hc11/m68hc11.h @@ -92,7 +92,9 @@ Note: while (0) /* As an embedded target, we have no libc. */ -#define inhibit_libc +#ifndef inhibit_libc +# define inhibit_libc +#endif /* Forward type declaration for prototypes definitions. rtx_ptr is equivalent to rtx. Can't use the same name. */ @@ -1633,6 +1635,7 @@ do { \ {"m68hc11_shift_operator", {ASHIFT, ASHIFTRT, LSHIFTRT, ROTATE, ROTATERT}},\ {"m68hc11_eq_compare_operator", {EQ, NE}}, \ {"non_push_operand", {SUBREG, REG, MEM}}, \ +{"splitable_operand", {SUBREG, REG, MEM}}, \ {"reg_or_some_mem_operand", {SUBREG, REG, MEM}}, \ {"tst_operand", {SUBREG, REG, MEM}}, \ {"cmp_operand", {SUBREG, REG, MEM, SYMBOL_REF, LABEL_REF, \ diff --git a/gcc/config/m68hc11/m68hc11.md b/gcc/config/m68hc11/m68hc11.md index 864fdb34f0e..364bdbb6ff8 100644 --- a/gcc/config/m68hc11/m68hc11.md +++ b/gcc/config/m68hc11/m68hc11.md @@ -885,7 +885,7 @@ }") (define_insn "movhi_const0" - [(set (match_operand:HI 0 "non_push_operand" "=d,A,um") + [(set (match_operand:HI 0 "splitable_operand" "=d,A,um") (const_int 0))] "" "@ @@ -3230,8 +3230,8 @@ (define_insn "*andhi3_gen" [(set (match_operand:HI 0 "register_operand" "=d,d,!*A") - (and:HI (match_operand:HI 1 "register_operand" "%0,0,0") - (match_operand:HI 2 "general_operand" "mi,!u*A,!um*A")))] + (and:HI (match_operand:HI 1 "splitable_operand" "%0,0,0") + (match_operand:HI 2 "splitable_operand" "mi,!u*A,!um*Ai")))] "" "* { @@ -3371,7 +3371,7 @@ (define_expand "iorhi3" [(set (match_operand:HI 0 "register_operand" "") (ior:HI (match_operand:HI 1 "register_operand" "") - (match_operand:HI 2 "general_operand" "")))] + (match_operand:HI 2 "splitable_operand" "")))] "" "") @@ -3459,8 +3459,8 @@ (define_insn "*iorhi3_gen" [(set (match_operand:HI 0 "register_operand" "=d,d,!*A") - (ior:HI (match_operand:HI 1 "register_operand" "%0,0,0") - (match_operand:HI 2 "general_operand" "mi,!u*A,!um*A")))] + (ior:HI (match_operand:HI 1 "splitable_operand" "%0,0,0") + (match_operand:HI 2 "splitable_operand" "mi,!u*A,!um*Ai")))] "" "* { @@ -3589,8 +3589,8 @@ (define_insn "xorhi3" [(set (match_operand:HI 0 "register_operand" "=d,d,!*A") - (xor:HI (match_operand:HI 1 "register_operand" "%0,0,0") - (match_operand:HI 2 "general_operand" "im,!u*A,!ium*A")))] + (xor:HI (match_operand:HI 1 "splitable_operand" "%0,0,0") + (match_operand:HI 2 "splitable_operand" "im,!u*A,!ium*A")))] "" "* { -- 2.30.2