diff options
author | Richard Henderson <rth@redhat.com> | 2002-03-30 16:15:19 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-03-30 16:15:19 -0800 |
commit | bdbe5b8d8d619546938f0db3631f82dc944bc0ef (patch) | |
tree | d185d6c7d62af9f76c31adac33c3469286614f64 /gcc/config/ia64 | |
parent | 4ab95d826743404ec341f82a89cf40d06adcf0b9 (diff) | |
download | gcc-bdbe5b8d8d619546938f0db3631f82dc944bc0ef.zip gcc-bdbe5b8d8d619546938f0db3631f82dc944bc0ef.tar.gz gcc-bdbe5b8d8d619546938f0db3631f82dc944bc0ef.tar.bz2 |
ia64.c (group_barrier_needed_p): Special case prologue_allocate_stack.
* config/ia64/ia64.c (group_barrier_needed_p): Special case
prologue_allocate_stack.
(ia64_single_set): Use insn codes for recognition of special
cases, not rtl matching.
* config/ia64/ia64.md (prologue_allocate_stack): Op 3 is in-out.
* gcc.c-torture/compile/20020330-1.c: New.
From-SVN: r51615
Diffstat (limited to 'gcc/config/ia64')
-rw-r--r-- | gcc/config/ia64/ia64.c | 30 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.md | 2 |
2 files changed, 17 insertions, 15 deletions
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 78ba70e..74cbf81 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -4764,6 +4764,7 @@ group_barrier_needed_p (insn) /* We play dependency tricks with the epilogue in order to get proper schedules. Undo this for dv analysis. */ case CODE_FOR_epilogue_deallocate_stack: + case CODE_FOR_prologue_allocate_stack: pat = XVECEXP (pat, 0, 0); break; @@ -5235,21 +5236,22 @@ ia64_single_set (insn) x = COND_EXEC_CODE (x); if (GET_CODE (x) == SET) return x; - ret = single_set_2 (insn, x); - if (ret == NULL && GET_CODE (x) == PARALLEL) - { - /* Special case here prologue_allocate_stack and - epilogue_deallocate_stack. Although it is not a classical - single set, the second set is there just to protect it - from moving past FP-relative stack accesses. */ - if (XVECLEN (x, 0) == 2 - && GET_CODE (XVECEXP (x, 0, 0)) == SET - && GET_CODE (XVECEXP (x, 0, 1)) == SET - && GET_CODE (SET_DEST (XVECEXP (x, 0, 1))) == REG - && SET_DEST (XVECEXP (x, 0, 1)) == SET_SRC (XVECEXP (x, 0, 1)) - && ia64_safe_itanium_class (insn) == ITANIUM_CLASS_IALU) - ret = XVECEXP (x, 0, 0); + + /* Special case here prologue_allocate_stack and epilogue_deallocate_stack. + Although they are not classical single set, the second set is there just + to protect it from moving past FP-relative stack accesses. */ + switch (recog_memoized (insn)) + { + case CODE_FOR_prologue_allocate_stack: + case CODE_FOR_epilogue_deallocate_stack: + ret = XVECEXP (x, 0, 0); + break; + + default: + ret = single_set_2 (insn, x); + break; } + return ret; } diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md index 8b134a6..a7d7dca 100644 --- a/gcc/config/ia64/ia64.md +++ b/gcc/config/ia64/ia64.md @@ -4848,7 +4848,7 @@ [(set (match_operand:DI 0 "register_operand" "=r,r,r") (plus:DI (match_operand:DI 1 "register_operand" "%r,r,a") (match_operand:DI 2 "gr_reg_or_22bit_operand" "r,I,J"))) - (set (match_operand:DI 3 "register_operand" "=r,r,r") + (set (match_operand:DI 3 "register_operand" "+r,r,r") (match_dup 3))] "" "@ |