aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2007-11-15 00:21:15 +0100
committerEric Botcazou <ebotcazou@gcc.gnu.org>2007-11-14 23:21:15 +0000
commitc6f4f1d196519805291afdc140fdd2e43388499e (patch)
tree36aea9f33ba007b4bed28b66f158e01080ecc402 /gcc
parentf7bc70c5bfd8b06a03df87734d37201cc0ac9463 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/ia64/ia64.h10
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/pr33923.c76
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;
+}