-/* { dg-options "-Os -fdump-tree-pre-details -fdisable-tree-evrp -fno-tree-dse" } */
+/* { dg-options "-Os -fgimple -fdump-tree-pre-details -fdisable-tree-evrp -fno-tree-dse" } */
+#if __SIZEOF_INT__ == 2
+#define unsigned __UINT32_TYPE__
+#define int __INT32_TYPE__
+#endif
+
+unsigned a;
+int b, c;
+
+void __GIMPLE(ssa, startwith("pre")) fn2 ()
+{
+ int b_lsm6;
+ int j;
+ int c0_1;
+ int iftmp2_8;
+
+ __BB(2):
+ a = _Literal (unsigned)30;
+ c0_1 = c;
+ b_lsm6_9 = b;
+ goto __BB7;
+
+ __BB(3):
+ if (j_6(D) != _Literal (int)2147483647)
+ goto __BB4;
+ else
+ goto __BB9;
+
+ __BB(4):
+ iftmp2_8 = j_6(D) + _Literal (int)1;
+ goto __BB5;
+
+ __BB(9):
+ iftmp2_8 = j_6(D) + _Literal (int)1;
+ goto __BB5;
+
+ __BB(5):
+ b_lsm6_10 = _Literal (int)2147483647;
+ goto __BB6;
+
+ __BB(6):
+ if (c0_1 != _Literal (int) 0)
+ goto __BB3;
+ else
+ goto __BB8;
+
+ __BB(8):
+ goto __BB7;
+
+ __BB(7):
+ goto __BB6;
+
+}
+
+#if 0
+/* This used to be a C based testcase but ccp3 would now would remove
+ the setting of iftmp2_8 (in the above gimple) which would cause PRE
+ not to test what PRE was doing incorrectly. The original code is below. */
/* Disable tree-evrp because the new version of evrp sees
<bb 3> :
if (j_8(D) != 2147483647)
/* Likewise disable DSE which also elides the tail merging "opportunity". */
-#if __SIZEOF_INT__ == 2
-#define unsigned __UINT32_TYPE__
-#define int __INT32_TYPE__
-#endif
-
-unsigned a;
-int b, c;
-
static int
fn1 (int p1, int p2)
{
for (; c; b = fn1 (j, 1))
;
}
+#endif
/* { dg-final { scan-tree-dump-times "(?n)find_duplicates: <bb .*> duplicate of <bb .*>" 1 "pre" } } */
def_bb = gimple_bb (stmt);
+ bool any_use = false;
FOR_EACH_IMM_USE_FAST (use_p, iter, val)
{
if (is_gimple_debug (USE_STMT (use_p)))
continue;
+
+ any_use = true;
bb = gimple_bb (USE_STMT (use_p));
if (bb == def_bb)
continue;
return false;
}
+ /* When there is no use avoid making the stmt live on other paths.
+ This can happen with DCE disabled or not done as seen in PR98845. */
+ if (!any_use)
+ return false;
+
return true;
}