Index: src/gcc/lambda-code.c
===================================================================
--- src/gcc/lambda-code.c	(revision 162004)
+++ src/gcc/lambda-code.c	(working copy)
@@ -1735,7 +1735,7 @@ lambda_loopnest_to_gcc_loopnest (struct 
       lambda_loop newloop;
       basic_block bb;
       edge exit;
-      tree ivvar, ivvarinced;
+      tree ivvar, ivvarinced, ivvarcond;
       gimple exitcond;
       gimple_seq stmts;
       enum tree_code testtype;
@@ -1743,7 +1743,6 @@ lambda_loopnest_to_gcc_loopnest (struct 
       lambda_linear_expression offset;
       tree type;
       bool insert_after;
-      gimple inc_stmt;
 
       oldiv = VEC_index (tree, old_ivs, i);
       type = TREE_TYPE (oldiv);
@@ -1799,20 +1798,9 @@ lambda_loopnest_to_gcc_loopnest (struct 
       create_iv (newlowerbound,
 		 build_int_cst (type, LL_STEP (newloop)),
 		 ivvar, temp, &bsi, insert_after, &ivvar,
-		 NULL);
+		 &ivvarinced);
 
-      /* Unfortunately, the incremented ivvar that create_iv inserted may not
-	 dominate the block containing the exit condition.
-	 So we simply create our own incremented iv to use in the new exit
-	 test,  and let redundancy elimination sort it out.  */
-      inc_stmt = gimple_build_assign_with_ops (PLUS_EXPR, SSA_NAME_VAR (ivvar),
-					       ivvar,
-					       build_int_cst (type, LL_STEP (newloop)));
-
-      ivvarinced = make_ssa_name (SSA_NAME_VAR (ivvar), inc_stmt);
-      gimple_assign_set_lhs (inc_stmt, ivvarinced);
-      bsi = gsi_for_stmt (exitcond);
-      gsi_insert_before (&bsi, inc_stmt, GSI_SAME_STMT);
+      gcc_assert (gimple_code (SSA_NAME_DEF_STMT (ivvar)) == GIMPLE_PHI);
 
       /* Replace the exit condition with the new upper bound
          comparison.  */
@@ -1826,7 +1814,17 @@ lambda_loopnest_to_gcc_loopnest (struct 
       if (exit->flags & EDGE_FALSE_VALUE)
 	testtype = swap_tree_comparison (testtype);
 
-      gimple_cond_set_condition (exitcond, testtype, newupperbound, ivvarinced);
+      if (bb != bsi.bb)
+	{
+	  /* The incremented ivvar that create_iv inserted does not
+	     dominate the block containing the exit condition. Use
+	     the phi that dominates exitcond instead.  */
+	  ivvarcond = ivvar;
+	}
+      else
+	ivvarcond = ivvarinced;
+
+      gimple_cond_set_condition (exitcond, testtype, newupperbound, ivvarcond);
       update_stmt (exitcond);
       VEC_replace (tree, new_ivs, i, ivvar);
 
Index: src/gcc/testsuite/gcc.dg/tree-ssa/pr43567-1.c
===================================================================
--- src/gcc/testsuite/gcc.dg/tree-ssa/pr43567-1.c	(revision 0)
+++ src/gcc/testsuite/gcc.dg/tree-ssa/pr43567-1.c	(revision 0)
@@ -0,0 +1,28 @@
+/* { dg-do run } */ 
+/* { dg-options "-O2 -fno-tree-ch -ftree-loop-linear -fdump-tree-ltrans-all" } */
+
+__attribute__((noinline))
+void test (int n, int *a)
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++)
+      a[j] = 0;
+}
+
+int main ()
+{
+  int success;
+  int a[4] = {11 , 12, 13, 14 };
+  test (2, &a[1]);
+  success =
+    a[0] == 11
+    && a[1] == 0
+    && a[2] == 0
+    && a[3] == 14;
+  return !success;
+}
+
+/* { dg-final { scan-tree-dump-times "transformed loop" 1 "ltrans" } } */ 
+/* { dg-final { cleanup-tree-dump "ltrans" } } */
Index: src/gcc/testsuite/gcc.dg/tree-ssa/pr43567-2.c
===================================================================
--- src/gcc/testsuite/gcc.dg/tree-ssa/pr43567-2.c	(revision 0)
+++ src/gcc/testsuite/gcc.dg/tree-ssa/pr43567-2.c	(revision 0)
@@ -0,0 +1,28 @@
+/* { dg-do run } */ 
+/* { dg-options "-O2 -ftree-ch -ftree-loop-linear -fdump-tree-ltrans-all" } */
+
+__attribute__((noinline))
+void test (int n, int *a)
+{
+  int i, j;
+
+  for (i = 0; i < n; i++)
+    for (j = 0; j < n; j++)
+      a[j] = 0;
+}
+
+int main ()
+{
+  int success;
+  int a[4] = {11 , 12, 13, 14 };
+  test (2, &a[1]);
+  success =
+    a[0] == 11
+    && a[1] == 0
+    && a[2] == 0
+    && a[3] == 14;
+  return !success;
+}
+
+/* { dg-final { scan-tree-dump-times "transformed loop" 1 "ltrans" } } */ 
+/* { dg-final { cleanup-tree-dump "ltrans" } } */
