<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/85076>85076</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            GVN Optimization pass removes necessary block and creates an infinite loop
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          upwindtec
      </td>
    </tr>
</table>

<pre>
    Hello,
We are writing an application that generates llvm IR. The generated code works properly unless we apply optimizations.

Here is the generated code before optimization:
define i64 @main(...) {
entry:
  %ptr = alloca ptr, align 8
  %0 = alloca i64, align 8
  %1 = alloca i64, align 8
 store i64 0, ptr %1, align 4
  br label %loop

exit: ; preds = %afterloop, %afterloop
  %returnval = load i64, ptr %0, align 4
  ret i64 %returnval

loop: ; preds = %loop, %entry
  %2 = load i64, ptr %1, align 4
  %addtmp = add i64 %2, 1
  store i64 %addtmp, ptr %1, align 4
  %eqtmp = icmp uge i64 %addtmp, 2
  %ifcond = icmp ne i1 %eqtmp, false
  br i1 %ifcond, label %afterloop, label %loop

afterloop:                                        ; preds = %loop
  store i64 1, ptr %ptr, align 4
  store i64 0, ptr %0, align 4
  br label %exit
  br label %exit
}

GVN optimization takes out the exit block in the call to MergeBlockIntoPredecessor because the exit block has only afterloop as predecessor, but  then the optimized code becomes this:
define i64 @main(...) {
entry:
  %0 = alloca i64, align 8
 %1 = alloca i64, align 8
  store i64 0, ptr %1, align 4
  br label %loop

loop:                                             ; preds = %loop, %entry
  %2 = phi i64 [ %addtmp, %loop ], [ 0, %entry ]
 %addtmp = add i64 %2, 1
  store i64 %addtmp, ptr %1, align 4
  %eqtmp = icmp ugt i64 %addtmp, 1
  br i1 %eqtmp, label %afterloop, label %loop

afterloop:                                        ; preds = %afterloop, %loop
  store i64 0, ptr %0, align 4
  br label %afterloop
  ret i64 0
}

 br label %exit is replaced by  br label %afterloop which creates an infinite loop.

Thank you

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVk1v4zYQ_TX0ZbCGREmxfNAhjuHuHvqBYtGeKXIksaFIlaTiur--IOUPee0ku2jRzSGGNPOGj48zT2TOyVYjVqTYkGK7YKPvjK3GYS-18MgXtRGH6iMqZQh9IsmWJI-_IzCLsLfSS90C08CGQUnOvDQafMc8tKjRMo8OlHrp4dOvS_jc4fm1AG4Ewt7YZweDNQNadYBRK3QO9hjrHcAMXvby71jWLae1p_8f0SJIB_62Zo2NsXiFJdkRJrCRGkE-5EDypGdSE1oul0tC10BWmykJtbeHMwSA0GLwFki2BaaU4QwGbwl9AqZkq6Gc5SXzLPmQ389K381yPmwh0ExCMC5Pi_SSmJ_K1RYUq1GFuDJmmIuEf0lPskcg2QYGi8LFdQktWOPRxmz6dP18IWnRj1a_MBVByjBxonpkk9xhY9FP4s7wc0ZxjXuMZmQm-S9E6GsE7skRNiOE74dJYiFOdGhITk9pF33PgPcL45-nupL3A4ztnQp0li8bbrS4AELjpedCIbthyuHsJKfwhAvx88leHdir533Jyh7hK__un8SNTOlMnqvuz29zk3eaZN6ysUXffE9W2_kef_jtp6vRBs-e0YEZffSCgINaGf4MUsc3nCkF3sCPaFvchMgn7c0vFgVydM5YqJGz0eGX-I45MFod4CwrMBe1OgLD1urRQwBOax2JXZyImx6DSUn3ry3ofWv5Kmf5j6zlG7vsjVZ7a-iHTk5CFZvrMTuCgRTb-Fhspt2cKsXAWZX_zxH8bYX0Zr7P4_89xvtL678_7t8ywjcfj9NHILk7wDdjHj7jFgfFOAqoD68Uh30neQfcYrxUMA1SN1JLjxDCV5eDzx3Tz3Aw4_S4EFUm1tmaLbBKV2mSZat8lS26qi7XxQMWaxRlw9KySDBJC8ZLnjfNes3oQlY0oXmSpVma5XmWLbHJ6pIiTYqMiaLkJE-wZ1ItwyVnaWy7kM6NWJVFsnpYxF24eLGiVOMeYpBQGu5ZtgqYD_XYOpInSjrvLlW89Aqr4HU_z71uYC5o1ZsXdKCjDTF7OPoV0-JVeRajVVXn_RB9iO4I3bXSd2O95KYndBcWPv58GKz5A7kndBfpOkJ3cTv_BAAA__8Dnfae">