<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60175>60175</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
assertion in visitFREEZE()
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
pawosm-arm
</td>
</tr>
</table>
<pre>
I've prepared IR ([reproducer.ll.gz](https://github.com/llvm/llvm-project/files/10469926/reproducer.ll.gz)) using a slightly modified compiler. The affected part of this IR represents the following loop:
```
if (lden < ((unsigned long)(BASE))) {
for (i = 4 - 1; i >= 0; i--) {
work = num[i] + carry * BASE;
quo[i] = work / lden;
carry = work % lden;
}
}
```
With the compiler built from the most recent LLVM sources the following assertion is failing:
```
llvm::SDValue {anonymous}::DAGCombiner::visitFREEZE(llvm::SDNode*): Assertion `DAG.isGuaranteedNotToBeUndefOrPoison(R, false) && "Can't create node that may be undef/poison!"' failed.
```
The slight modification required to build the affected IR was in the pipeline builder and it was simply this:
```
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -1142,8 +1142,17 @@ void PassBuilder::addVectorPasses(OptimizationLevel Level,
/*UseBlockFrequencyInfo=*/true));
ExtraPasses.addPass(
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
+ if (RunNewGVN)
+ FPM.addPass(NewGVNPass());
+ else
+ FPM.addPass(GVNPass());
ExtraPasses.addPass(InstCombinePass());
FPM.addPass(std::move(ExtraPasses));
+ } else if (Level.getSpeedupLevel() > 1) {
+ if (RunNewGVN)
+ FPM.addPass(NewGVNPass());
+ else
+ FPM.addPass(GVNPass());
}
// Now that we've formed fast to execute loop structures, we do further
```
The immediate observed change after the extra GVN pass was this:
```
for.body.preheader: ; preds = %if.end11
%1 = load i64, ptr %hnum, align 8, !tbaa !6
%shr18 = lshr i64 %1, 32
%and16 = and i64 %1, 4294967295
%2 = load i64, ptr %lnum, align 8, !tbaa !6
%and14 = and i64 %2, 4294967295
%div.lhs.trunc = trunc i64 %shr18 to i32
%div.rhs.trunc = trunc i64 %0 to i32
%div45 = udiv i32 %div.lhs.trunc, %div.rhs.trunc
%div.zext = zext i32 %div45 to i64
- %rem.lhs.trunc = trunc i64 %shr18 to i32
- %rem.rhs.trunc = trunc i64 %0 to i32
- %rem46 = urem i32 %rem.lhs.trunc, %rem.rhs.trunc
+ %rem46 = urem i32 %div.lhs.trunc, %div.rhs.trunc
%rem.zext = zext i32 %rem46 to i64
%mul.1 = shl nuw i64 %rem.zext, 32
%add.1 = or i64 %and16, %mul.1
%div.1 = udiv i64 %add.1, %0
%rem.1 = urem i64 %add.1, %0
%add.2 = call i64 @llvm.fshl.i64(i64 %rem.1, i64 %2, i64 32)
%div.2 = udiv i64 %add.2, %0
%rem.2 = urem i64 %add.2, %0
%mul.3 = shl nuw i64 %rem.2, 32
%add.3 = or i64 %and14, %mul.3
%div.3 = udiv i64 %add.3, %0
%3 = shl i64 %div.2, 32
%4 = add i64 %3, %div.3
%5 = shl nuw i64 %div.zext, 32
%6 = add i64 %5, %div.1
br label %if.end34
```
(the second pair of `trunc` instructions has gone)
Upon the assertion:
`MaybePoisonOperands.size()` is `1`, `dumpr` of `N` is:
```
t14: i32 = freeze t13
t13: i32 = truncate t12
t12: i64,ch = CopyFromReg t0, Register:i64 %0
t0: ch,glue = EntryToken
```
`dumpr` of `N0` is:
```
t13: i32 = truncate t12
t12: i64,ch = CopyFromReg t0, Register:i64 %0
t0: ch,glue = EntryToken
```
`dumpr` of `R` is:
```
t58: i32 = <<Deleted Node!>>
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysWFuTozoO_jXOiyoUGMjlIQ-5dLq6aqZnqueyVfvmYBG8AzbHNsmkf_2WDUlIN5mZs3tSXR3A0qdPkiXhMGPEXiIuSLoi6WbEGlsovajZUZlqzHQ12il-WjwROj0g1BprppHD0wsQOiPpSmOtFW8y1EFZBvtXkm4InRXW1obES0K3hG73whbNLshURei2LA_nr3Gt1X8ws4Ruc1GiIXQbhclkPqcTQrfvkOmc0Dk0Rsg9MDCl2Be2PEGluMgFcshUVYsSdQBfCwSW55hZ5FAzbUHlYAthHG-HiwalNWALhFyVpTo6zFKp2nEONyRckknY_flbAJE7j0uOEki89t7TWSN99DiUSu49wdlq-eWhperYkumqA8iVdkoCSLyBBMYQkXgF7vbBPQn93Xh8q-Q_R6V_eC3ZVCRdCZJugNAVZEzrExC6BG8zPiv91aiLWLzp1OkWHPerlP90EFep9L0UmW66m8vVm-D8S9jCx_KcAdg1orSQa1X555UyFjRmKC18-PD9IxjV6AzfJoAZg9oKJUEYyJkohdzfS4jfRvGSxMsvm--sbNBFjUklT5VqjGPqFzfLx7WqdkKibh8chBF2-_Lw8O8Hl84eyrPiSOjSJS5ewvLChUzCzfIxEOaxYZpJi8iflf2qVvhNcsw_6c9KGCUJnb0QuoaclQZ9Ft0ungChdM0koVMLmUZmEaTiCLZgFip2gh1C43AI3dYdUEQoJXTqQ4A8GPTfbfG2BLoCyJhnq_GvRrgKtcpngfsYX4rh6QWOzICQ_nEtaiyFxFYSNTDJQVgvYkRVlydfNfdyMB6PgfVKWuwI3X52WTTdxarF_dzZMUFW1x0UXbV_sPtfEZKQJCGMoyihhK5nria662gK3epBCQ49nDbZjPPvmFmlz6Zmn2orKvHqY_gBD1iC_0_o-rz3XSdbfjO4KlX2Y-vCjDI7PclckXjj983W6ga70r8U0MNPq1lrJmCcuyvXOtrFLy7GIj-tt4_dQu-Jo6Skl6bzIFPygNp-OQqbFS9M7vGrelpXNaGzntmeZRfatme9NPIZj4_fn93yZc1_tp8_9li1UmeK7-EAAN3mvjy4Vb-r600NB-JJGtsV6B3dWxvG8jaFlTogobMe6hBhMt14yl0kfE6DPdovNSJv6i7HM1-u8QNEN923c_lXQfw_4zeQg_tBvHbfc1Db6QrP6ti2kyO2UzpXukIOOTPWtQH8iVlj0c83MFY3mW20i9cajghcQd5oW6C-22dEVSEXrnWpnUF9cLO2cFsQWG5R-1aCLhHw-P0ZamaM7yC_ah2OY-DeLIJaY4GsLU349ceNyFojN35iEZqKPEDJo6gXkTTyi6ViHMQkcU7W1k3etHDjk66BlWIvYeYuCY3sjjH3PeljmEJHsxbHFNrheGSnEtO-IJM8mnhB3zl7cgmdJ_PJlM7Tvjy9R678c3LOZvLWJh20SWjKxSEoCxNY3cjMa7VXnV7rqVUgbh1zavq-WjiskqRetOHi4Fbf2W_dugV_a_UVf1qP4i-uKEnqbU6SbvZ4BY3V3_NufNb6Y-cuhpI20Y3G6kzrxnzn3A14vxXdA_nTCHXYg_FpkfvxaQNaNWXQFoQpSpDN8ezjGWlgS3PeqajLzvfbvKPmId8mLerlvVNxMJ1K2Bd3lqNeEH4j7hbaqslYWbbiSejeF4LcFGXgy2jW88qj9KvCXcf00ravpOkgaXqPNB0kPSjuYhTfCzsdjnk8EPOkF_P4Lf14kH48xOfKpZP07r_n0bUVfmkrcW8_3hBIh7w7l-974Mlb4LQHfN1NOw0l22F57e1xMjg-3FuPewHGTEl3whPanfDIJGwLZhKCkO2kc69QUDADeyXxOrv9_2-1at-DLweP67g6W_3ITjts3_A_1aiZ5CYw4hW7Ae0sGWc4ctycT5OQN1Wt3UpL6bkVujcJbZS4yecLOd5ArhFfEWx0Cbe77Al4D90sttE1xP7GCfmhkhVecq3q01ar6gX3YD25F9wLY_2oPfe6_mnQhg4jKwhd7_2JKt7Ag7T69FX9QDmciPPDt06Hv_P6t079Ay79gw69_MafdNb3h8RrEq83WKI7dLUny8if9B8G1Ud8EfN5PGcjXESTaUKTdJ7Eo2JB4xmncZJmWRiyaYi7lNNdOp9kKU53szweiQUNaRxGNKRhNA_jgMXpJIuTkGGcx1E4IUmIFRNl4Hum0vuRMKbBxSSMpunIl5vxP_5QKvEIftGdP9PNSC_8rzS7Zm9czxXGmiuKFbbERe_ILuH2bE3ofNTocvG3fwvyFNz5z1P8bwAAAP__sb01yQ">