<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">