Commit 19233914 by Nick Clifton Committed by Nick Clifton

PR target/62554

        PR target/69610
gcc     * config/arm/arm.c (arm_option_override_internal): Disable
        interworking if the target does not support thumb instructions.
        (arm_reload_in_hi): Handle the case where a register to register
        move needs reloading because there is no simple pattern to handle
        it.
        (arm_reload_out_hi): Likewise.

tests   * gcc.target/arm/pr62554.c: New test.
        * gcc.target/arm/pr69610-1.c: New test.
        * gcc.target/arm/pr69610-2.c: New test.

From-SVN: r233518
parent 23f27839
2016-02-18 Nick Clifton <nickc@redhat.com>
PR target/62554
PR target/69610
* config/arm/arm.c (arm_option_override_internal): Disable
interworking if the target does not support thumb instructions.
(arm_reload_in_hi): Handle the case where a register to register
move needs reloading because there is no simple pattern to handle
it.
(arm_reload_out_hi): Likewise.
2016-02-18 Richard Biener <rguenther@suse.de> 2016-02-18 Richard Biener <rguenther@suse.de>
PR middle-end/69854 PR middle-end/69854
......
...@@ -2874,6 +2874,14 @@ arm_option_override_internal (struct gcc_options *opts, ...@@ -2874,6 +2874,14 @@ arm_option_override_internal (struct gcc_options *opts,
{ {
arm_override_options_after_change_1 (opts); arm_override_options_after_change_1 (opts);
if (TARGET_INTERWORK && !ARM_FSET_HAS_CPU1 (insn_flags, FL_THUMB))
{
/* The default is to enable interworking, so this warning message would
be confusing to users who have just compiled with, eg, -march=armv3. */
/* warning (0, "ignoring -minterwork because target CPU does not support THUMB"); */
opts->x_target_flags &= ~MASK_INTERWORK;
}
if (TARGET_THUMB_P (opts->x_target_flags) if (TARGET_THUMB_P (opts->x_target_flags)
&& !(ARM_FSET_HAS_CPU1 (insn_flags, FL_THUMB))) && !(ARM_FSET_HAS_CPU1 (insn_flags, FL_THUMB)))
{ {
...@@ -15440,6 +15448,17 @@ arm_reload_in_hi (rtx *operands) ...@@ -15440,6 +15448,17 @@ arm_reload_in_hi (rtx *operands)
else else
/* The slot is out of range, or was dressed up in a SUBREG. */ /* The slot is out of range, or was dressed up in a SUBREG. */
base = reg_equiv_address (REGNO (ref)); base = reg_equiv_address (REGNO (ref));
/* PR 62554: If there is no equivalent memory location then just move
the value as an SImode register move. This happens when the target
architecture variant does not have an HImode register move. */
if (base == NULL)
{
gcc_assert (REG_P (operands[0]));
emit_insn (gen_movsi (gen_rtx_SUBREG (SImode, operands[0], 0),
gen_rtx_SUBREG (SImode, ref, 0)));
return;
}
} }
else else
base = find_replacement (&XEXP (ref, 0)); base = find_replacement (&XEXP (ref, 0));
...@@ -15557,6 +15576,17 @@ arm_reload_out_hi (rtx *operands) ...@@ -15557,6 +15576,17 @@ arm_reload_out_hi (rtx *operands)
else else
/* The slot is out of range, or was dressed up in a SUBREG. */ /* The slot is out of range, or was dressed up in a SUBREG. */
base = reg_equiv_address (REGNO (ref)); base = reg_equiv_address (REGNO (ref));
/* PR 62554: If there is no equivalent memory location then just move
the value as an SImode register move. This happens when the target
architecture variant does not have an HImode register move. */
if (base == NULL)
{
gcc_assert (REG_P (outval));
emit_insn (gen_movsi (gen_rtx_SUBREG (SImode, ref, 0),
gen_rtx_SUBREG (SImode, outval, 0)));
return;
}
} }
else else
base = find_replacement (&XEXP (ref, 0)); base = find_replacement (&XEXP (ref, 0));
...@@ -19619,6 +19649,7 @@ output_return_instruction (rtx operand, bool really_return, bool reverse, ...@@ -19619,6 +19649,7 @@ output_return_instruction (rtx operand, bool really_return, bool reverse,
break; break;
case ARM_FT_INTERWORKED: case ARM_FT_INTERWORKED:
gcc_assert (arm_arch5 || arm_arch4t);
sprintf (instr, "bx%s\t%%|lr", conditional); sprintf (instr, "bx%s\t%%|lr", conditional);
break; break;
......
2016-02-18 Nick Clifton <nickc@redhat.com>
PR target/62554
PR target/69610
* gcc.target/arm/pr62554.c: New test.
* gcc.target/arm/pr69610-1.c: New test.
* gcc.target/arm/pr69610-2.c: New test.
2016-02-18 Richard Biener <rguenther@suse.de> 2016-02-18 Richard Biener <rguenther@suse.de>
PR middle-end/69854 PR middle-end/69854
......
/* Check that pre ARMv4 compilation still works. */
/* { dg-do compile } */
/* { dg-options "-marm -march=armv3 -O" } */
/* { dg-require-effective-target arm_arm_ok } */
typedef struct
{
char bits;
short val;
} code;
union uu
{
short us;
char b[2];
};
int a, b, c, f, g, h;
code *d;
code e;
int
fn1 (void)
{
char i;
do
if (e.bits)
{
dodist:
f = c;
if (e.bits & 6)
{
++i;
if (g)
do
{
union uu j;
j.b[1] = a;
h = j.us;
}
while (fn1);
}
else
{
e = d[b];
goto dodist;
}
}
while (i);
}
/* Check that pre ARMv4 compilation still works. */
/* { dg-do compile } */
/* { dg-options "-marm -march=armv3 -ftree-ter" } */
/* { dg-require-effective-target arm_arm_ok } */
typedef unsigned short v16u16 __attribute__ ((vector_size (16)));
typedef unsigned int v16u32 __attribute__ ((vector_size (16)));
unsigned short
foo (v16u16 v16u16_1, v16u32 v16u32_1)
{
v16u16_1 += (v16u16) v16u32_1;
return v16u16_1[5] + v16u32_1[1];
}
/* Check that pre ARMv4 compilation still works. */
/* { dg-do compile } */
/* { dg-options "-marm -march=armv3 -O2 -fno-forward-propagate" } */
/* { dg-require-effective-target arm_arm_ok } */
typedef short v16u16 __attribute__ ((vector_size (16)));
typedef unsigned v16u32 __attribute__ ((vector_size (16)));
typedef long long v16u64 __attribute__ ((vector_size (16)));
unsigned
foo
(int
u16_0,
unsigned
u32_0,
int
u64_0,
int
u16_1,
unsigned
u64_1,
v16u16
v16u16_0,
v16u32
v16u32_0,
v16u64 v16u64_0, v16u16 v16u16_1, v16u32 v16u32_1, v16u64 v16u64_1)
{
v16u16_1[3] -= v16u32_0[0];
v16u16_0 -= (v16u16) v16u32_0;
return u16_0 + u32_0 + u64_0 + u16_1 +
v16u16_0[0] + v16u16_0[2] + v16u16_0[3] + v16u16_0[4] + v16u16_0[5] + v16u32_0[0] + v16u32_0[1] + v16u32_0[3] + v16u64_0[1] +
v16u16_1[2] + v16u16_1[3] + v16u16_1[5] + v16u16_1[7] + v16u32_1[0] + v16u32_1[3] + v16u64_1[0] + v16u64_1[1];
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment