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

    <tr>
        <th>Summary</th>
        <td>
            [DebugInfo][TailCallElim] Cloned AccRecInstrNew should drop its debugloc when being inserted into other blocks
        </td>
    </tr>

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

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

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

<pre>
    TailCallElimination-[L805](https://github.com/llvm/llvm-project/blob/15bb02650e26875c48889053d6a9697444583721/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp#L805): In optimized `@test^_multiple_returns`, `%accumulator.ret.tr` (in block `%case99`) and `%accumulator.ret.tr2` (in block `%case0`) have the same debug location of `%accumulate` (in block `%default`). However, they are all in different switch cases, the debug location of `% accumulate` should not be propagated to the two `*.ret.tr*`. 

Before TailCallElim optimization:
```LLVM IR
define i32 @test6_multiple_returns(i32 %x, i32 %y) local_unnamed_addr !dbg !5 {
entry:
  switch i32 %x, label %default [
    i32 0, label %case0
    i32 99, label %case99
  ], !dbg !8

case0:                                            ; preds = %entry
  %helper = call i32 @test6_helper(), !dbg !9
  ret i32 %helper, !dbg !10

case99:                                           ; preds = %entry
  %sub1 = add i32 %x, -1, !dbg !11
  %recurse1 = call i32 @test6_multiple_returns(i32 %sub1, i32 %y), !dbg !12
  ret i32 18, !dbg !13

default:                                          ; preds = %entry
  %sub2 = add i32 %x, -1, !dbg !14
  %recurse2 = call i32 @test6_multiple_returns(i32 %sub2, i32 %y), !dbg !15
->%accumulate = add i32 %recurse2, %y, !dbg !16
  ret i32 %accumulate, !dbg !17
}

!16 = !DILocation(line: 9, column: 1, scope: !5)
```

After TailCallElim optimization: 
```LLVM IR
define i32 @test6_multiple_returns(i32 %x, i32 %y) local_unnamed_addr !dbg !5 {
entry:
  br label %tailrecurse

tailrecurse: ; preds = %default, %case99, %entry
  %accumulator.tr = phi i32 [ %accumulator.tr, %case99 ], [ 0, %entry ], [ %accumulate, %default ]
  %x.tr = phi i32 [ %x, %entry ], [ %sub1, %case99 ], [ %sub2, %default ]
  %ret.tr = phi i32 [ poison, %entry ], [ %current.ret.tr, %case99 ], [ %ret.tr, %default ]
  %ret.known.tr = phi i1 [ false, %entry ], [ true, %case99 ], [ %ret.known.tr, %default ]
  switch i32 %x.tr, label %default [
    i32 0, label %case0
    i32 99, label %case99
  ], !dbg !8

case0:                                            ; preds = %tailrecurse
  %helper = tail call i32 @test6_helper(), !dbg !9
->%accumulator.ret.tr2 = add i32 %accumulator.tr, %helper, !dbg !10
 %current.ret.tr1 = select i1 %ret.known.tr, i32 %ret.tr, i32 %accumulator.ret.tr2
  ret i32 %current.ret.tr1, !dbg !11

case99: ; preds = %tailrecurse
  %sub1 = add i32 %x.tr, -1, !dbg !12
->%accumulator.ret.tr = add i32 %accumulator.tr, 18, !dbg !10
  %current.ret.tr = select i1 %ret.known.tr, i32 %ret.tr, i32 %accumulator.ret.tr
  br label %tailrecurse, !dbg !13

default:                                          ; preds = %tailrecurse
  %sub2 = add i32 %x.tr, -1, !dbg !14
  %accumulate = add i32 %accumulator.tr, %y, !dbg !10
  br label %tailrecurse, !dbg !15
}

!10 = !DILocation(line: 9, column: 1, scope: !5)
```

TailCallElimination-[L777](https://github.com/llvm/llvm-project/blob/15bb02650e26875c48889053d6a9697444583721/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp#L777): The same as the above error. When either `%accumulator.ret.tr` or `%accumulator.ret.tr1` is executed,  block `%if.then2` would be considered being executed.

Before TailCallElim optimization:
```LLVM IR
define i32 @test7_multiple_accumulators(i32 %a) local_unnamed_addr !dbg !18 {
entry:
  %tobool = icmp eq i32 %a, 0, !dbg !19
  br i1 %tobool, label %return, label %if.end, !dbg !20

if.end: ; preds = %entry
  %and = and i32 %a, 1, !dbg !21
  %tobool1 = icmp eq i32 %and, 0, !dbg !22
  %sub = add nsw i32 %a, -1, !dbg !23
  br i1 %tobool1, label %if.end3, label %if.then2, !dbg !24

if.then2:                                         ; preds = %if.end
  %recurse1 = tail call i32 @test7_multiple_accumulators(i32 %sub), !dbg !25
->%accumulate1 = add nsw i32 %recurse1, 1, !dbg !26
 br label %return, !dbg !27

if.end3: ; preds = %if.end
  %recurse2 = tail call i32 @test7_multiple_accumulators(i32 %sub), !dbg !28
  %accumulate2 = mul nsw i32 %recurse2, 2, !dbg !29
  br label %return, !dbg !30

return: ; preds = %if.end3, %if.then2, %entry
  %retval.0 = phi i32 [ %accumulate1, %if.then2 ], [ %accumulate2, %if.end3 ], [ 0, %entry ], !dbg !31
  ret i32 %retval.0, !dbg !32
}

!26 = !DILocation(line: 18, column: 1, scope: !18)
```

After TailCallElim optimization:
```LLVM IR
define i32 @test7_multiple_accumulators(i32 %a) local_unnamed_addr !dbg !16 {
entry:
  br label %tailrecurse

tailrecurse: ; preds = %if.then2, %entry
  %accumulator.tr = phi i32 [ 0, %entry ], [ %accumulate1, %if.then2 ]
  %a.tr = phi i32 [ %a, %entry ], [ %sub, %if.then2 ]
  %tobool = icmp eq i32 %a.tr, 0, !dbg !17
  br i1 %tobool, label %return, label %if.end, !dbg !18

if.end: ; preds = %tailrecurse
  %and = and i32 %a.tr, 1, !dbg !19
  %tobool1 = icmp eq i32 %and, 0, !dbg !20
  %sub = add nsw i32 %a.tr, -1, !dbg !21
  br i1 %tobool1, label %if.end3, label %if.then2, !dbg !22

if.then2: ; preds = %if.end
  %accumulate1 = add nsw i32 %accumulator.tr, 1, !dbg !23
  br label %tailrecurse, !dbg !24

if.end3: ; preds = %if.end
  %recurse2 = tail call i32 @test7_multiple_accumulators(i32 %sub), !dbg !25
  %accumulate2 = mul nsw i32 %recurse2, 2, !dbg !26
->%accumulator.ret.tr = add nsw i32 %accumulator.tr, %accumulate2, !dbg !23
  ret i32 %accumulator.ret.tr, !dbg !27

return:                                           ; preds = %tailrecurse
->%accumulator.ret.tr1 = add nsw i32 %accumulator.tr, 0, !dbg !23
  ret i32 %accumulator.ret.tr1, !dbg !27
}

!23 = !DILocation(line: 18, column: 1, scope: !16)
```

The two test case are in llvm/test/Transforms/TailCallElim/accum_recursion.ll.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcWVtz27oR_jXQCyYaErw_6MG24qln0j6kmfbRA5IrCz0QoAKglfTXdwCQFq-SnOP0cjIZX4TlYvfDYr_9TKo1exEAG5Tco2S7oo3ZS7W5O8pqD0KvSln_2HyjjD9Qzj9zdmCCGibFJ5Tcf8mDBCVbRPK9MUeNojtEHhF5fGFm35TrSh4QeeT8tfv26ajkP6AyiDyWXJaIPIZJWQYkTQIgaZ4lVZzneREkUZ3SIi2yOI6TPMpI2PPD7HPfFBV6J9VBI_L414pyquynlPGvUDVKMyl6sa6r4xGRyIVLChTd4SeB5dGwA_sX1BilAYoDA9qg5PPzoeGGHTk8KzCNEtqukgdnRBJaVc2h4dRItVZg1kahNMCI5Ezgksvqt9auohqKwv1cYCrqxcfJ8vNB-_ievgI2e8CaHgDXUDYvmMvKZYblbuwa5j3WsKMNN97nGv9JnuAVlM3M7OEHpgow5RwzgWu224ECYbA-MVPtsQ1Gt5aL--NhAHovG15jIQ0uAR-VPNIXaqDGRjo35iT9g3cdjuQOpcEao2CLgjv_9R52UgHuV193bG53W3DePA38_y9f_vZn_PTVf1rDjgnALCK4Pd90erokd-sk-W4zbH_-YXG3OfLnRgh6gPqZ1rXCiIR1-WK_JRhl934bEEb9eAsFd6j13XJaAsfnU8D2srXm2FkGAzN__AODophYFEVn4i7hQy-8vA-j9xY5V7f-Q9E9PiqoNUbR1m7os-z2I8ke-BGUW61c4fRR9ouI5Pa6DQJ7C1mB6SDqrPt2YTDOoCjel8LVDHRThm6N1vXgtD6Fo1jC3lPK9RcIFzJfri-73ajERtuQMTZhPrKI-qB0N_o9qNwCCrkNlHgKCvkZUMhlUBK_zScUfR50uXGQXQj-cetp4CadqbtexxoaZy3M2baPt3PT4hZun760LRCRnDMB9hhc7JXkzcG2JuwQ05U8ukXbNGx6w4bV3-BuZ0Bd7Hb4f7DdlerclQxlvD2IfmL9j20S4yLsKtkfXXvZ_S_j-uwzqPHt57hnPpHkfmox8PnWJ5N733C7DfoLM4XRa9vbXizfFyL4fsF11wVmY-pdiMVNPVtOtj1Kpm0tLm5cNcpy-hvbLocwsFgO4jchT2IQSug87CjXsBSIUQ1c27tzvBzBiGFb2z8AyU7uz5hqrcHP8O24fZ7nz3Efnb0-lxh6WlyeGzVwqIyrium5vjVtM_xgbkCeNu7RdvNsPZ4cbgR7dipog5xwILmC7nVwJxQf9GIZ5vmRqF5r3r967FjEfjp8LGEfz7HCZCyYLefxcBC8D45kcTwIfuV4sCTCsyz7fxLhNlwvwr91mpZqpwlpKV8Bg1JSrfHf9yAwMLO3ne-C9pbLy6FdZxrDd6gaA7XFe6CJ2W5t9iCcBj85vVoCrqTQrAYF9jcmXt4eX_9SaZqdZ7VeJr2BjV4d0sJ8eUqzBS1LKbmrUFYdjhj-ic-uH7qB6M1Z0bsUvt14BwOG9GPl4CO2W4Ooh87IoJBbi7mePBn3RO1vtKgHwY6aAQkneYazifrARqkSMuxBbz1E6NNg13EPItECRuEMItH4M196Q4fxCCdv845WO0G0BXtBwM7OE1dLUTflZNAgS0ItnIOzC2LuLDup1m_G5zrrGWbToopmq2oJA_LRGOSznOS3OTR8BgFXAOMqKOb4aA6CaHCvWotlBKKW_4bFN7l0Cswr5evgorqCcORsUUORs6GN4boIO6cXzgx_XXQjU7JEyuSyZvcD2AVWDvPfq9r_80SQ_lK5fqV8rkj024T3bHX19lgS_5el92WnFwiynR3HHJl9IEcO5eQFjpyfneeYstMYS8z-U2QZ3ECWCzP7maY_ii_JEl9e54ArDDUj1S6Q_3XVMKH2_z5bJR_DVumtIvgiunOUMYV67q-3ZzlwYTw4c-NHqtbFnG8sqfHdui3PcSEu_rmaRL-T-tIrirR9kWdL0L0ldK8RmcCtTHSvVEc6sU-UiDy67J5VpxfXnK9X9Saqi6igK9iEWZgnRZKRbLXfZCWt8yQpSxqkcUrisAqsXI2SEiCKi92KbUhA4iANsyCKSZCtSVZXdZ3QJIY4SQuK4gAOlPG1DXAt1cuKad3ApkiyKFy5S6zdi3BCBJywW0SEoGS7UhsnnsvmRaM44EwbffZimOHuDfoWyublSeykZZbkfpBsssUPXAqo8V1VfYXqSWij_gKn7l1preQRM6P9K1YuK3yyGtiLUCY0KAM1ZsJILJ0sdlJWrxrFN--W_i41ex4-9dcN-XcAAAD__87o-bs">