diff --git a/gcc/testsuite/gcc.dg/torture/pr103458.c b/gcc/testsuite/gcc.dg/torture/pr103458.c
new file mode 100644
index 0000000000000000000000000000000000000000..3fd3b5fd2ffbc46d47e309bd34d389753875f1c2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr103458.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-Wno-div-by-zero" } */
+
+__attribute__ ((returns_twice)) int
+bar (void);
+
+void
+foo (int *p, int x)
+{
+  *p = 0;
+  while (*p < 1)
+    {
+      x = 0;
+      while (x < 1)
+        bar ();
+
+      x /= 0;
+    }
+
+  foo (p, x);
+}
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index e3e6f0955b7d15d3afbeb6898f53ad21741ef591..1f817b95faba63de7af31e4bb591c3fdfe0b1352 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -1650,8 +1650,12 @@ make_forwarders_with_degenerate_phis (function *fn)
       /* Only PHIs with three or more arguments have opportunities.  */
       if (EDGE_COUNT (bb->preds) < 3)
 	continue;
-      /* Do not touch loop headers.  */
-      if (bb->loop_father->header == bb)
+      /* Do not touch loop headers or blocks with abnormal predecessors.
+	 ???  This is to avoid creating valid loops here, see PR103458.
+	 We might want to improve things to either explicitely add those
+	 loops or at least consider blocks with no backedges.  */
+      if (bb->loop_father->header == bb
+	  || bb_has_abnormal_pred (bb))
 	continue;
 
       /* Take one PHI node as template to look for identical