<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/89012>89012</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Loop Deletion(loop-deletion) pass might generate misunderstanding debug information
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
edumoot
</td>
</tr>
</table>
<pre>
Problems: Loop Deletion (loop-deletion) might generate unexpected debug information.
The variables, function arguments - 'paramA' and 'paramC', that we could use later are optimized out on line 13. However, they appear again on line 20, with inappropriate values - 'paramA = 0' and 'paramC = 0'. The condition of outer loop is false, so the inner loop could be not executed. That means 'paramA' cannot be 0.
After several experiments, we can confirm that (1) the problem on line 13 is caused by 'deadargelim' (Dead Arguments Elimination) and (2) 'loop-deletion'(Loop Deletion) is in charge of the problem on line 20.
```
* thread #1, name = 'case.out', stop reason = breakpoint 1.1
frame #0: 0x0000555555555154 case.out`calculateValue(paramA=<unavailable>, paramC=<unavailable>) at case.c:13:18
10 int calculateValue(int paramA, int paramB, int paramC, unsigned paramD)
11 {
12 int localVar = 2;
-> 13 globalVar1 = globalArray[2];
14 for (paramC = 0; paramC == 9; ++paramC)
15 for (paramA = 0; paramA < 0; paramA = paramA + 9)
16 {
(lldb) fr v
(int) paramA = <variable not available>
(int) paramC = <variable not available>
(int) localVar = 2
(lldb) s
Process 59718 stopped
* thread #1, name = 'case.out', stop reason = step in
frame #0: 0x0000555555555160 case.out`calculateValue(paramA=0, paramC=0) at case.c:20:20
17 unsigned localArray[6] ;
18 localArray[4] = addValues(paramA, paramB * paramC);
19 }
-> 20 return localVar+globalVar1;
21 }
22
23 int computeResult()
(lldb) fr v
(int) paramA = 0
(int) paramC = 0
(int) localVar = 2
```
Reproduce with:
```compiling pipeline
clang -g -O0 case.c -Xclang -disable-O0-optnone -emit-llvm -c -o case.bc
opt -passes='{passes}' case.bc -o case.opt.bc
llc --relocation-model=pic case.opt.bc -o case.s
clang case.s -o case.out
```
In LLVM 18.1.2 (commit [261aae0c](https://github.com/llvm/llvm-project/commit/26a1d6601d727a96f4301d0d8647b5a42760ae0c)), we set passes to:
```
cgscc(devirt<4>(inline,function-attrs<skip-non-recursive-function-attrs>,argpromotion,openmp-opt-cgscc,function<eager-inv;no-rerun>(sroa<modify-cfg>,early-cse<memssa>,speculative-execution<only-if-divergent-target>,jump-threading,correlated-propagation,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>,aggressive-instcombine,libcalls-shrinkwrap,tailcallelim,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,reassociate,constraint-elimination,loop-mssa(loop-instsimplify,loop-simplifycfg,licm<no-allowspeculation>,loop-rotate<header-duplication;no-prepare-for-lto>,licm<allowspeculation>,simple-loop-unswitch<nontrivial;trivial>),simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>,loop(loop-idiom,indvars,loop-deletion,loop-unroll-full),sroa<modify-cfg>,vector-combine,mldst-motion<no-split-footer-bb>,gvn<>,sccp,bdce,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>,jump-threading,correlated-propagation,adce,memcpyopt,dse,move-auto-init,loop-mssa(licm<allowspeculation>),coro-elide,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;hoist-common-insts;sink-common-insts;speculate-blocks;simplify-cond-branch>,instcombine<max-iterations=1;no-use-loop-info;no-verify-fixpoint>),function-attrs,function(require<should-not-run-function-passes>),coro-split)),deadargelim
```
In LLVM 17.0.6 (commit, [6009fe18](https://github.com/llvm/llvm-project/commit/6009708b4367171ccdbf4b5905cb6a803753fe18)), we set passes to:
```
cgscc(devirt<4>(inline<only-mandatory>,inline,function-attrs<skip-non-recursive>,argpromotion,openmp-opt-cgscc,function<eager-inv;no-rerun>(sroa<modify-cfg>,early-cse<memssa>,speculative-execution,jump-threading,correlated-propagation,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,instcombine<max-iterations=1000;no-use-loop-info>,aggressive-instcombine,constraint-elimination,libcalls-shrinkwrap,tailcallelim,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,reassociate,loop-mssa(loop-instsimplify,loop-simplifycfg,licm<no-allowspeculation>,loop-rotate<header-duplication;no-prepare-for-lto>,licm<allowspeculation>,simple-loop-unswitch<nontrivial;trivial>),simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;no-hoist-common-insts;no-sink-common-insts;speculate-blocks;simplify-cond-branch>,instcombine<max-iterations=1000;no-use-loop-info>,loop(loop-idiom,indvars,loop-deletion,loop-unroll-full),sroa<modify-cfg>,vector-combine,mldst-motion<no-split-footer-bb>,gvn<>,sccp,bdce,instcombine<max-iterations=1000;no-use-loop-info>,jump-threading,correlated-propagation,adce,memcpyopt,dse,move-auto-init,loop-mssa(licm<allowspeculation>),coro-elide,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;no-switch-to-lookup;keep-loops;hoist-common-insts;sink-common-insts;speculate-blocks;simplify-cond-branch>,instcombine<max-iterations=1000;no-use-loop-info>),function-attrs,function(require<should-not-run-function-passes>),coro-split)),deadargelim
```
The results of LLDB are shown above. GDB is also similar.
```
Breakpoint 1, calculateValue (paramA=<optimised out>, paramC=<optimised out>) at case.c:13
13 globalVar1 = globalArray[2];
(gdb) info args
paramA = <optimised out>
paramC = <optimised out>
(gdb) s
20 return localVar+globalVar1;
(gdb) info args
paramA = 0
paramC = 0
```
`cat case.c`
```
#include <stdio.h>
static unsigned globalVar1 = 15;
static unsigned globalArray[3] = {3, 3, 3};
int addValues(int param1, int param2)
{
return globalArray[1]+param1+param2;
}
int calculateValue(int paramA, int paramB, int paramC, unsigned paramD)
{
int localVar = 2;
globalVar1 = globalArray[2];
for (paramC = 0; paramC == 9; ++paramC)
for (paramA = 0; paramA < 0; paramA = paramA + 9)
{
unsigned localArray[6] ;
localArray[4] = addValues(paramA, paramB * paramC);
}
return localVar+globalVar1;
}
int computeResult()
{
int varA = 55;
int varB = 8888;
int varC = 1111;
varB = calculateValue(varA, varB, varC, varA + varB + varC) && addValues(varA, varC);
return varB;
}
int main (void)
{
printf("%d",computeResult());
return 0;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsOl2P46iyv4Z-QUQ2TmLnoR86zsy9V5qrvVqtVvcVQzlhB4MP4PT0-fVHhR3no7N9emZH2j2rabWSUBT1XVCmLELQewvwSFZbsto9iCEenH8ENXTOxYfGqZdHku1I9vR_3jUGukCKJ0o_OdfTHRiI2llKeGWc65maAIRvaKf3h0j3YMGLCHSw8KUHGUFRBc2wp9q2zncC0Rd05DB-_nIAehRei8ZAILym7WBlYiP8fujAxkAZJbzshRfdE-ElFVbNgJrwElfReBCRPgOVbjCKDgGoERE8FR6o66Pu9D9BUTdE6iw12gLNiwX9b_cMR_BIIR7ghYq-B-Gp2AttZ0Se4fyzjgeqreh773qvUcujMANciUdJsaPZKyFn8IKivtJZpZOOrkWRwFM0KNWBtsIEQHbBoURUW3uaHTVrgFoXKXwBOURQSFBE2oGw4dpKUlhEbIBmi0uDP7XIL6DawlB0k9fJzElJwHUoYKt9NxqV8CpHF6M4_RgVFzZEoaUYAijavKAECoQSfg9GdygG4dUOhKJPszc_GN1pK06RMxqq4vib8PImskrCq6voQzQdqLZUHpANmvCeZDy7jjOyzqb_ccifaDx4lIzwIkfdreggOYrwUooACzfEKbpCdD31IAJGf7GjjQfxuXfaRpov8pEipZS2PtHgRYZpk33Jsixbnf7y1ZLOdNeZFEYOGKO_YhQRXk2uK3akqAcrjkIbTApSfEARpmi_O7uhIo6kJSme8gI_qlmqPKOUZBsU9hVPBNJTzNSU4jgNtzicRzWOBpv2DjUt2BG-OfPIEw9SbukZxhMM7YKEjJPC_Cp8MiAnxXZEZKT4gGF0Qt0b1yS8PCGOwyfvxQtZbTlZ7eaVyGI5r2udpycjnvKt2NLzGEEbBBG-JXx70utCh9VM7Jbg0w1BHNc34938k2_p5orw-orw2Ui4kRrVoANbT48zUNuIsAvSpKhPm2RK_yv_X0b59eL6Gxff-OpW2DAfERJCoKtNmVcpR3pQ3yO9QoSeavvevFpn78ur7CqPstu84dn4MbutvHIb_s0pkAx0iso1WaGRL8KyGldeYS1HrB0VSiXRwlm2k1wYnE_0HJqXNDcjTVLuLhKHZ7OMHuLg7ew6wrfnVLokxE-pujuDeILMw2LeMKh0XT9E-BnCYCLh1RzX74_d7I3QfDV3N_Jutu70-TP03qlBQjqYSXG7zaPg2mi7p73uAY-EEUEaYfeU7Sn7aQobSdn_T1ClA-YF-yljro_WWaAMOh2ZMceOMkmZG9c0cqTm-khZL0KAgFsML0m5nYblbjyFEzadV7o-zquNkZQxD6g0nm2scwoMKXa9lpfY8-JwqcMIORMe4l1z_Y-lnz79-r80rxb5guOWJl3X6UhxP13nQkAmcVvl1SHGHus9wj8S_nGv42FoFtJ1hH9E_acv1nv3G8hI-MeREOEf-Vrkar3OclXyUmzW7bLIcpWpar0sm5VY8nKdJT48bYxjoREATxe0FY0O8_qu-HIfpCS8UnDUPpKiXqYjr9I2-ZTXp3qRiRh9IEUdPuueWWeZBzn4oI_AbnHwRBV-33vXubGoqF0PtuvR7WxiOVMmRQ1iD55peyTF1jrmwQ92lCN4J0hRd07p9oXJdj9SB-HNC5MBcA66EMQIDz2k3QmlGmu4kYGz5oXplil9BL8HG1nE6iaOq34bup6N-6m2e8Jr6bwH3OQUuqMX-6mcqoPueqPblyRI3Tg7BKZtiGl1ODijSLHLRy1a55-FVyw86ygPDKtSUmynkRd2Dyw6pmXXj_jTTHTMOPd5QOhngB5HGDeIcnA6RIZx4WziO8GDtp9vwSdTAGuMk58TaJI-ycIaL6w8jBbARdJ1Dfq8qDvxhemIjxra2XDWaAiQpGH4uDGCjuCRYKu_pHpt8v1-7yGk0LgkzGujGymMCSwcvLafn73oCa-j0AbBY037t7UxnsDBSXy0SSFmQ_RC28jgsmKvk4FTRE_PgYnZRPU0f2kjNKvsSFFbx4Qx7nlOAjcm0bjEu4ici_oAQoFnauiNlhMWKth76IUHtCkzuGV8OJO-TzdJMYXEYEfbJjls9PqohSHFdv71Ydya_q7e_b4ZhDiz_5XGQ6LWVh2FDyd_nh_i6skB3hnD2sGYydL3t84jyOg8OydlZ1SIbNqpUxSF3ujIWucieNY047r9EWcnx0uJidsoCd9d9fdvxmJk30En-xfXR8JrlZ7uO3cEJgaMDYsH6HVOvRHRm5Gdw5RU8CdH691Q_WvF6eZ1gXBxrvPKwz8G7ZFROLjBKGZdZH6w54rhVNxdGj-F31zLXF54vFmAlYtssT4XYFgG4dNDlm1ayKs_WoMhnTKrmmWxLvMyl1I17bJZbbKVbNaiyopyVSQ-b9Vg31KCTcVLJ6wS0fmXkxvfX5_99QqyHyXXv0_ELMvu5uKbBdbvVxU_Kq9T5fWjwPqPdOIfyZe_VTn1lqI_iqc_tXh6wzV_hVLplwNQn64aA3Ut_fRpt00NvHBwz5aKxh1hQf9rt6U6UGGCo0F32gi_uEtte9GlwXrn-maY3rRcxiZhGJuEd5our-dftV0SV_z-yk4G4dV-vEpFb1Dh99NF33UH4JUEZ5z6bZwzg4kwz77m1vg98mWvpMnear-tM3k23gX0ukdXaCvNoAA1C1FptzjMOoUoopbnK_kbc-erWfz7mCdPFKd7eVJuC3T69FFe-Cd9pvvwy8v7c_Msv-qW8fMlebml9NwRO1n7WoA8Vf7bE6HtRGNmfrqoP0vxDW289_Txrrp3b_XsvrpP9x26c9-5J3fTifuGJs_89_26PJc9mXdm5uvgeKNl88q_R-FHM61WV6pNc9s0V1VVdW929GOe5xftpXnRqxBFVmgBxJi-6-l7dM-4dPxRjy8DrAlfXxnygshtf-xkr0T_DfN0Qqc3WI5Oq9-xTO-1jW2yHCd8pdJXfc-s90XI7vC_3tke1GOhNsVGPMBjXuZFka-qnD8cHrNVoXjbKoB1I_gKFOd5I9t1W22Wq0KVD_qRZ3yZLfMyy7Oi4IuylaulEqKtxJrDakOWGXRCm4Uxx27h_P5BhzDAY7XJcv5gRAMmpLd_OLfwTNMkKrjaPfjHdLfQDPtAlpnRIYYzlaijgcebVzFevweENcDty0CdDoNV4EMUFqu-168EPQzePH711UeSPRD-Men2rwAAAP__yIfCDw">