diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2007-11-15 00:21:15 +0100 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2007-11-14 23:21:15 +0000 |
commit | c6f4f1d196519805291afdc140fdd2e43388499e (patch) | |
tree | 36aea9f33ba007b4bed28b66f158e01080ecc402 | |
parent | f7bc70c5bfd8b06a03df87734d37201cc0ac9463 (diff) | |
download | gcc-c6f4f1d196519805291afdc140fdd2e43388499e.zip gcc-c6f4f1d196519805291afdc140fdd2e43388499e.tar.gz gcc-c6f4f1d196519805291afdc140fdd2e43388499e.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.h | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr33923.c | 76 |
4 files changed, 93 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 695f9b8..60529f5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index 5d32b70..5f0c28c 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 be76b34..66ac3de 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gcc.dg/pr33923.c b/gcc/testsuite/gcc.dg/pr33923.c new file mode 100644 index 0000000..d71e557 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr33923.c @@ -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; +} |