* RX: Fix ICEs in gcc testsuite
@ 2011-01-25 14:54 Nick Clifton
2011-02-06 23:27 ` Richard Henderson
0 siblings, 1 reply; 2+ messages in thread
From: Nick Clifton @ 2011-01-25 14:54 UTC (permalink / raw)
To: gcc-patches
Hi Guys,
I am applying the patch below to fix several internal compiler errors
reported when running the GCC testsuite for the RX target, and to
clean up a few minor details. The changes are as follows:
* Do not attempt to promote complex types to SImode when returning
them from a function.
* Remove the new addsi3_unspec pattern and just create the UNPSEC by
hand. (Thanks to RTH for suggesting this).
* Do not accept immediates in the subdi3 pattern as it may not be
possible to split the result.
* Remove non-existent builtins from the RX builtin test.
Cheers
Nick
gcc/ChangeLog
2011-01-25 Nick Clifton <nickc@redhat.com>
* config/rx/rx.h (LIBCALL_VALUE): Do not promote complex types.
* config/rx/rx.c (rx_function_value): Likewise.
(rx_promote_function_mode): Likewise.
(gen_safe_add): Place an outsized immediate value inside an UNSPEC
in order to make it legitimate.
* config/rx/rx.md (adddi3_internal): If the second operand is a
MEM make sure that the first operand is the same as the result
register.
(addsi3_unspec): Delete.
(subdi3): Do not accept immediate operands.
(subdi3_internal): Likewise.
gcc/testsuite/ChangeLog
2011-01-25 Nick Clifton <nickc@redhat.com>
* gcc.target/rx/builtins.c: Allow -fipa-cp-clone.
(saturate_add): Delete.
(exchange): Delete.
(main): Do not run saturate_add.
(set_interrupts): Delete.
Index: gcc/config/rx/rx.h
===================================================================
--- gcc/config/rx/rx.h (revision 169221)
+++ gcc/config/rx/rx.h (working copy)
@@ -251,6 +251,7 @@
#define LIBCALL_VALUE(MODE) \
gen_rtx_REG (((GET_MODE_CLASS (MODE) != MODE_INT \
+ || COMPLEX_MODE_P (MODE) \
|| GET_MODE_SIZE (MODE) >= 4) \
? (MODE) \
: SImode), \
Index: gcc/config/rx/rx.md
===================================================================
--- gcc/config/rx/rx.md (revision 169221)
+++ gcc/config/rx/rx.md (working copy)
@@ -961,8 +961,18 @@
if (rtx_equal_p (op0l, op1l))
;
+ /* It is preferable that op0l == op1l... */
else if (rtx_equal_p (op0l, op2l))
x = op1l, op1l = op2l, op2l = x;
+ /* ... but it is only a requirement if op2l == MEM. */
+ else if (MEM_P (op2l))
+ {
+ /* Let's hope that we still have a scratch register free. */
+ gcc_assert (op1h != scratch);
+ emit_move_insn (scratch, op2l);
+ op2l = scratch;
+ }
+
emit_insn (gen_addsi3_flags (op0l, op1l, op2l));
if (rtx_equal_p (op0h, op1h))
@@ -978,22 +988,6 @@
DONE;
})
-;; A pattern to add an integer to a register, regardless of the
-;; setting of the -mmax-constant-size command line switch.
-;; See rx.c:gen_safe_add() for more details.
-(define_insn "addsi3_unspec"
- [(set (match_operand:SI 0 "register_operand" "=r,r")
- (plus:SI (match_operand:SI 1 "register_operand" "%0,r")
- (const:SI (unspec:SI [(match_operand 2 "const_int_operand" "n,n")] UNSPEC_CONST))))
- (clobber (reg:CC CC_REG))]
- ""
- "@
- add\t%2, %0
- add\t%2, %1, %0"
- [(set_attr "timings" "11")
- (set_attr "length" "6")]
-)
-
(define_insn "andsi3"
[(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r,r,r")
(and:SI (match_operand:SI 1 "register_operand" "%0,0,0,0,0,0,r,r,0")
@@ -1483,9 +1477,9 @@
)
(define_expand "subdi3"
- [(set (match_operand:DI 0 "register_operand" "")
- (minus:DI (match_operand:DI 1 "register_operand" "")
- (match_operand:DI 2 "rx_source_operand" "")))]
+ [(set (match_operand:DI 0 "register_operand")
+ (minus:DI (match_operand:DI 1 "register_operand")
+ (match_operand:DI 2 "rx_compare_operand")))]
""
{
rtx op0l, op0h, op1l, op1h, op2l, op2h;
@@ -1504,7 +1498,7 @@
(define_insn_and_split "subdi3_internal"
[(set (match_operand:SI 0 "register_operand" "=&r,&r")
(minus:SI (match_operand:SI 2 "register_operand" " 0, r")
- (match_operand:SI 3 "rx_source_operand" "rnQ, r")))
+ (match_operand:SI 3 "rx_compare_operand" "rQ, r")))
(set (match_operand:SI 1 "register_operand" "= r, r")
(minus:SI
(minus:SI
Index: gcc/config/rx/rx.c
===================================================================
--- gcc/config/rx/rx.c (revision 169221)
+++ gcc/config/rx/rx.c (working copy)
@@ -874,7 +874,10 @@
/* RX ABI specifies that small integer types are
promoted to int when returned by a function. */
- if (GET_MODE_SIZE (mode) > 0 && GET_MODE_SIZE (mode) < 4)
+ if (GET_MODE_SIZE (mode) > 0
+ && GET_MODE_SIZE (mode) < 4
+ && ! COMPLEX_MODE_P (mode)
+ )
return gen_rtx_REG (SImode, FUNC_RETURN_REGNUM);
return gen_rtx_REG (mode, FUNC_RETURN_REGNUM);
@@ -892,6 +895,7 @@
{
if (for_return != 1
|| GET_MODE_SIZE (mode) >= 4
+ || COMPLEX_MODE_P (mode)
|| GET_MODE_SIZE (mode) < 1)
return mode;
@@ -1324,7 +1328,10 @@
insn = emit_insn (gen_addsi3 (dest, src, val));
else
{
- insn = emit_insn (gen_addsi3_unspec (dest, src, val));
+ /* Wrap VAL in an UNSPEC so that rx_is_legitimate_constant
+ will not reject it. */
+ val = gen_rtx_CONST (SImode, gen_rtx_UNSPEC (SImode, gen_rtvec (1, val), UNSPEC_CONST));
+ insn = emit_insn (gen_addsi3 (dest, src, val));
if (is_frame_related)
/* We have to provide our own frame related note here
Index: gcc/testsuite/gcc.target/rx/builtins.c
===================================================================
--- gcc/testsuite/gcc.target/rx/builtins.c (revision 169221)
+++ gcc/testsuite/gcc.target/rx/builtins.c (working copy)
@@ -1,12 +1,6 @@
/* { dg-do run } */
-/* { dg-options "-fno-ipa-cp-clone" } */
/* Verify that the RX specific builtin functions work. */
-
-/* IPA CP cloning is disabled because the constant propagation
- has no understanding of the saturation behaviour of the
- __builtin_rx_sat function and so it will optimize away the
- saturation addition test. */
#include <stdlib.h>
#include <stdio.h>
@@ -25,20 +19,6 @@
return __builtin_rx_revw (arg);
}
-int
-saturate_add (int arg1, int arg2)
-{
- arg1 += arg2;
- return __builtin_rx_sat (arg1);
-}
-
-int
-exchange (int arg1, int arg2)
-{
- arg1 = __builtin_rx_xchg (arg2);
- return arg1;
-}
-
long
multiply_and_accumulate (long arg1, long arg2, long arg3)
{
@@ -118,7 +98,6 @@
main (void)
{
CHECK_1ARG (half_word_swap, 0x12345678, 0x34127856);
- CHECK_2ARG (saturate_add, 0x80000000, 0x80000000, 0x80000000);
CHECK_3ARG (multiply_and_accumulate, 0x111, 0x222, 0x333, 0x70007);
CHECK_1ARG (rxround, 0.5, 1);
return 0;
@@ -163,9 +142,3 @@
{
__builtin_rx_rmpa ();
}
-
-void
-set_interrupts (void)
-{
- __builtin_mvtipl (3);
-}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: RX: Fix ICEs in gcc testsuite
2011-01-25 14:54 RX: Fix ICEs in gcc testsuite Nick Clifton
@ 2011-02-06 23:27 ` Richard Henderson
0 siblings, 0 replies; 2+ messages in thread
From: Richard Henderson @ 2011-02-06 23:27 UTC (permalink / raw)
To: gcc-patches
On 01/25/2011 06:32 AM, Nick Clifton wrote:
> * Do not accept immediates in the subdi3 pattern as it may not be
> possible to split the result.
Huh? When?
r~
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-02-06 23:27 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-25 14:54 RX: Fix ICEs in gcc testsuite Nick Clifton
2011-02-06 23:27 ` Richard Henderson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).