2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-10 06:40:29 +08:00

re PR target/33923 (ICE in reload_cse_simplify_operands (insn does not satisfy its constraints))

PR target/33923
	* config/ia64/ia64.h (CANNOT_CHANGE_MODE_CLASS): Forbid mode changes
	for registers in BR_REGS class.

From-SVN: r130188
This commit is contained in:
Eric Botcazou 2007-11-15 00:21:15 +01:00 committed by Eric Botcazou
parent f7bc70c5bf
commit c6f4f1d196
4 changed files with 93 additions and 3 deletions
gcc
ChangeLog
config/ia64
testsuite

@ -1,3 +1,9 @@
2007-11-14 Eric Botcazou <ebotcazou@libertysurf.fr>
PR target/33923
* config/ia64/ia64.h (CANNOT_CHANGE_MODE_CLASS): Forbid mode changes
for registers in BR_REGS class.
2007-11-14 Jakub Jelinek <jakub@redhat.com>
PR middle-end/34088

@ -887,12 +887,16 @@ enum reg_class
: (((CLASS) == FR_REGS || (CLASS) == FP_REGS) && (MODE) == XCmode) ? 2 \
: (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
/* In FP regs, we can't change FP values to integer values and vice versa,
/* In BR regs, we can't change the DImode at all.
In FP regs, we can't change FP values to integer values and vice versa,
but we can change e.g. DImode to SImode, and V2SFmode into DImode. */
#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
(SCALAR_FLOAT_MODE_P (FROM) != SCALAR_FLOAT_MODE_P (TO) \
? reg_classes_intersect_p (CLASS, FR_REGS) : 0)
(reg_classes_intersect_p (CLASS, BR_REGS) \
? (FROM) != (TO) \
: (SCALAR_FLOAT_MODE_P (FROM) != SCALAR_FLOAT_MODE_P (TO) \
? reg_classes_intersect_p (CLASS, FR_REGS) \
: 0))
/* Basic Stack Layout */

@ -1,3 +1,7 @@
2007-11-14 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/pr33923.c: New test.
2007-11-14 Jakub Jelinek <jakub@redhat.com>
PR middle-end/34088

@ -0,0 +1,76 @@
/* PR target/33923 */
/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
/* { dg-do compile } */
/* { dg-options "-O3 --param max-partial-antic-length=0" } */
static int pendingCommand;
static int currentModifiers;
typedef struct
{
int (*updateKeys) (int *keyPressed);
}
ProtocolOperations;
static const ProtocolOperations *protocol;
brl_readCommand (void)
{
unsigned long int keys;
int command;
int keyPressed;
unsigned char routingKeys[200];
int routingKeyCount;
signed char rightVerticalSensor;
if (pendingCommand != (-1))
{
return command;
}
if (!protocol->updateKeys (&keyPressed))
{
if (rightVerticalSensor >= 0)
keys |= 1;
if ((routingKeyCount == 0) && keys)
{
if (currentModifiers)
{
doChord:switch (keys);
}
else
{
doCharacter:
command = 0X2200;
if (keys & 0X01UL)
command |= 0001;
if (keys & 0X02UL)
command |= 0002;
if (keys & 0X04UL)
command |= 0004;
if (keys & 0X08UL)
command |= 0010;
if (keys & 0X10UL)
command |= 0020;
if (keys & 0X20UL)
command |= 0040;
if (currentModifiers & (0X0010 | 0X0200))
command |= 0100;
if (currentModifiers & 0X0040)
command |= 0200;
if (currentModifiers & 0X0100)
command |= 0X020000;
if (currentModifiers & 0X0400)
command |= 0X080000;
if (currentModifiers & 0X0800)
command |= 0X040000;
}
unsigned char key1 = routingKeys[0];
if (key1 == 0)
{
} else if (key1 == 1)
if (keys)
{
currentModifiers |= 0X0010;
goto doCharacter;
}
}
}
return command;
}