re PR middle-end/59049 (Two VOIDmode constant in comparison passed to cstoresi4)
authorJoern Rennecke <joern.rennecke@embecosm.com>
Mon, 11 Nov 2013 18:57:25 +0000 (18:57 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Mon, 11 Nov 2013 18:57:25 +0000 (18:57 +0000)
        PR middle-end/59049
        * expmed.c (emit_store_flag): Fail for const-const comparison.

From-SVN: r204682

gcc/ChangeLog
gcc/expmed.c

index ca7e6a0..0fcb06e 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-11  Joern Rennecke  <joern.rennecke@embecosm.com>
+
+       PR middle-end/59049
+       * expmed.c (emit_store_flag): Fail for const-const comparison.
+
 2013-11-11  Tristan Gingold  <gingold@adacore.com>
            Eric Botcazou  <ebotcazou@adacore.com>
 
index 59f81df..1617bc0 100644 (file)
@@ -5401,6 +5401,13 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1,
   rtx subtarget;
   rtx tem, last, trueval;
 
+  /* If we compare constants, we shouldn't use a store-flag operation,
+     but a constant load.  We can get there via the vanilla route that
+     usually generates a compare-branch sequence, but will in this case
+     fold the comparison to a constant, and thus elide the branch.  */
+  if (CONSTANT_P (op0) && CONSTANT_P (op1))
+    return NULL_RTX;
+
   tem = emit_store_flag_1 (target, code, op0, op1, mode, unsignedp, normalizep,
                           target_mode);
   if (tem)