51 lines
1.3 KiB
Diff
51 lines
1.3 KiB
Diff
2014-07-15 Michael Matz <matz@suse.de>
|
|
|
|
PR rtl-optimization/61772
|
|
* ifcvt.c (dead_or_predicable): Check jump to be free of side
|
|
effects.
|
|
|
|
* gcc.dg/torture/pr61772.c: New test.
|
|
|
|
Index: gcc/testsuite/gcc.dg/torture/pr61772.c
|
|
===================================================================
|
|
--- gcc/testsuite/gcc.dg/torture/pr61772.c (revision 0)
|
|
+++ gcc/testsuite/gcc.dg/torture/pr61772.c (revision 212563)
|
|
@@ -0,0 +1,24 @@
|
|
+/* { dg-do compile } */
|
|
+/* { dg-final { scan-assembler-times "XXX" 2 } } */
|
|
+
|
|
+static inline __attribute__((always_inline)) int dec_and_test (int *i)
|
|
+{
|
|
+ asm volatile goto ("XXX %0, %l[cc_label]"
|
|
+ : : "m" (*i) : "memory" : cc_label);
|
|
+ return 0;
|
|
+cc_label:
|
|
+ return 1;
|
|
+}
|
|
+extern int getit (int *);
|
|
+int f (int *i, int cond)
|
|
+{
|
|
+ if (cond) {
|
|
+ getit (0);
|
|
+ if (dec_and_test (i))
|
|
+ getit (i);
|
|
+ return 42;
|
|
+ }
|
|
+ if (dec_and_test (i))
|
|
+ (void)1;
|
|
+ return getit (i);
|
|
+}
|
|
Index: gcc/ifcvt.c
|
|
===================================================================
|
|
--- gcc/ifcvt.c (revision 212562)
|
|
+++ gcc/ifcvt.c (revision 212563)
|
|
@@ -4138,6 +4138,8 @@ dead_or_predicable (basic_block test_bb,
|
|
|
|
if (JUMP_P (end))
|
|
{
|
|
+ if (!onlyjump_p (end))
|
|
+ return FALSE;
|
|
if (head == end)
|
|
{
|
|
head = end = NULL_RTX;
|