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