PR middle-end/59049
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Nov 2013 18:57:25 +0000 (18:57 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Nov 2013 18:57:25 +0000 (18:57 +0000)
        * expmed.c (emit_store_flag): Fail for const-const comparison.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204682 138bc75d-0d04-0410-961f-82ee72b054a4

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)