re PR target/33923 (ICE in reload_cse_simplify_operands (insn does not satisfy its...
authorEric Botcazou <ebotcazou@libertysurf.fr>
Wed, 14 Nov 2007 23:21:15 +0000 (00:21 +0100)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 14 Nov 2007 23:21:15 +0000 (23:21 +0000)
PR target/33923
* config/ia64/ia64.h (CANNOT_CHANGE_MODE_CLASS): Forbid mode changes
for registers in BR_REGS class.

From-SVN: r130188

gcc/ChangeLog
gcc/config/ia64/ia64.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr33923.c [new file with mode: 0644]

index 695f9b88a21afadc90fb58639a67c7efa33cda34..60529f5975488215915593102826dbe87198742b 100644 (file)
@@ -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
index 5d32b702538282590f7325cfe7954492f785b98d..5f0c28ce706efb36030a534f7c0bd6094033bcfb 100644 (file)
@@ -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))
 \f
 /* Basic Stack Layout */
 
index be76b344bf619e1e417e2349c0eeaf52eb9eb260..66ac3de12e8f03757d6b6e5320c506a7ee581b3f 100644 (file)
@@ -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 (file)
index 0000000..d71e557
--- /dev/null
@@ -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;
+}