From: Eric Botcazou Date: Wed, 14 Nov 2007 23:21:15 +0000 (+0100) Subject: re PR target/33923 (ICE in reload_cse_simplify_operands (insn does not satisfy its... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c6f4f1d196519805291afdc140fdd2e43388499e;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 695f9b88a21..60529f59754 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-11-14 Eric Botcazou + + 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 PR middle-end/34088 diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index 5d32b702538..5f0c28ce706 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -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 */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index be76b344bf6..66ac3de12e8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-11-14 Eric Botcazou + + * gcc.dg/pr33923.c: New test. + 2007-11-14 Jakub Jelinek PR middle-end/34088 diff --git a/gcc/testsuite/gcc.dg/pr33923.c b/gcc/testsuite/gcc.dg/pr33923.c new file mode 100644 index 00000000000..d71e5578a8a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr33923.c @@ -0,0 +1,76 @@ +/* PR target/33923 */ +/* Testcase by Martin Michlmayr */ + +/* { 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; +}