Fix for powerpc/c4x problem with missed loop optimizations.
authorJim Wilson <wilson@cygnus.com>
Thu, 8 Oct 1998 12:52:52 +0000 (12:52 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Thu, 8 Oct 1998 12:52:52 +0000 (05:52 -0700)
* loop.c (get_condition): Allow combine when either compare is
VOIDmode.

From-SVN: r22922

gcc/ChangeLog
gcc/loop.c

index ac2222bb39475214929defa8538ae374b3e93a57..73e72b1bb820fa3cc39bc73e000af6e95f93b62b 100644 (file)
@@ -1,3 +1,8 @@
+Thu Oct  8 12:50:47 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * loop.c (get_condition): Allow combine when either compare is
+       VOIDmode.
+
 Thu Oct 8 11:31:01 PDT 1998 Jeff Law  (law@cygnus.com)
 
        * version.c: Bump for snapshot.
index 4529946d1a92af1a43da83bf3518adc8b6f13404..dc4eaa9466dd057a2472420eb0b5ef011c20722e 100644 (file)
@@ -7765,7 +7765,14 @@ get_condition (jump, earliest)
             like Alpha that have an IEEE compliant EQ instruction, and
             a non-IEEE compliant BEQ instruction.  The use of CCmode is
             actually artificial, simply to prevent the combination, but
-            should not affect other platforms.  */
+            should not affect other platforms.
+
+            However, we must allow VOIDmode comparisons to match either
+            CCmode or non-CCmode comparison, because some ports have
+            modeless comparisons inside branch patterns.
+
+            ??? This mode check should perhaps look more like the mode check
+            in simplify_comparison in combine.  */
 
          if ((GET_CODE (SET_SRC (set)) == COMPARE
               || (((code == NE
@@ -7783,8 +7790,9 @@ get_condition (jump, earliest)
 #endif
                     ))
                   && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'))
-             && ((GET_MODE_CLASS (mode) == MODE_CC)
-                 == (GET_MODE_CLASS (inner_mode) == MODE_CC)))
+             && (((GET_MODE_CLASS (mode) == MODE_CC)
+                  == (GET_MODE_CLASS (inner_mode) == MODE_CC))
+                 || mode == VOIDmode || inner_mode == VOIDmode))
            x = SET_SRC (set);
          else if (((code == EQ
                     || (code == GE
@@ -7801,8 +7809,10 @@ get_condition (jump, earliest)
 #endif
                     ))
                   && GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'
-                  && ((GET_MODE_CLASS (mode) == MODE_CC)
-                      == (GET_MODE_CLASS (inner_mode) == MODE_CC)))
+                  && (((GET_MODE_CLASS (mode) == MODE_CC)
+                       == (GET_MODE_CLASS (inner_mode) == MODE_CC))
+                      || mode == VOIDmode || inner_mode == VOIDmode))
+
            {
              /* We might have reversed a LT to get a GE here.  But this wasn't
                 actually the comparison of data, so we don't flag that we