<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/55991>55991</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
"CloneModule" falsely initialized global "blockaddress" variables
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Hatsunespica
</td>
</tr>
</table>
<pre>
Bug Report:
+ Function: `CloneModule`, Say `M2 = CloneModule(M1)`
+ Assumption of this function: `M1` and `M2` should be independent. All changes in `M1` shouldn't have any influences on `M2`.
Bug Reproduce:
+ Prerequisite:
+ A function F containing 2 or 3 basic blocks. Say `bb0, bb1, bb2`.
+ A global array of [Addresses of Basic Blocks](https://llvm.org/docs/LangRef.html#addresses-of-basic-blocks) . Each address specifies the function and basic block name it points to. It has initial value `(F, bb0), (F, bb1), (F, bb2)`
+ Operation:
+ Change the name of `bb0, bb1, bb2` to `update1, update2, update3` in `M1`.
+ Expected behavior:
+ The global array in `M1` should have the form `(F, update1), (F, update2), (F, update3)`
+ The global array in `M2` should have the form `(F, bb0), (F, bb1), (F, bb2)`
+ Actual behavior:
+ M1 : `(F, update1), (F, update2), (F, update3)`
+ M2 : `(F, update1), (F, update2), (F, update3)`
+ Conclusion:
+ The global variables in M2 along with M1 changed. It breaks our assumption.
How we found it:
+ test case:
```
@loop.targets = constant [2 x i8*] [i8* blockaddress(@loop, %bb0), i8* blockaddress(@loop, %bb1)]
@loop.target = constant i8* blockaddress(@loop, %bb1)
define void @loop(i64* %p) {
entry:
br label %bb0
bb0:
%target = load i8*, i8** @loop.target, align 8
indirectbr i8* %target, [label %bb0, label %bb1]
bb1:
ret void
}
```
After we clone this module, and optimize it with [sccp](https://llvm.org/docs/Passes.html#sccp-sparse-conditional-constant-propagation) pass. It crashes and report following error:
```
/home/spica/GitRepo/llvm-project/llvm/lib/Transforms/Utils/SCCPSolver.cpp:676: void llvm::SCCPInstVisitor::getFeasibleSuccessors(llvm::Instruction&, llvm::SmallVectorImpl<bool>&): Assertion `Addr->getFunction() == T->getParent() && "Block address of a different function ?"' failed.
#0 0x00007f0f1fb610d4 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
#1 0x00007f0f1fb5e114 SignalHandler(int) Signals.cpp:0:0
#2 0x00007f0f1f58c0c0 (/lib/x86_64-linux-gnu/libc.so.6+0x430c0)
#3 0x00007f0f1f58c03b raise /build/glibc-sMfBJT/glibc-2.31/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
#4 0x00007f0f1f56b859 abort /build/glibc-sMfBJT/glibc-2.31/stdlib/abort.c:81:7
#5 0x00007f0f1f56b729 get_sysdep_segment_value /build/glibc-sMfBJT/glibc-2.31/intl/loadmsgcat.c:509:8
#6 0x00007f0f1f56b729 _nl_load_domain /build/glibc-sMfBJT/glibc-2.31/intl/loadmsgcat.c:970:34
#7 0x00007f0f1f57d006 (/lib/x86_64-linux-gnu/libc.so.6+0x34006)
#8 0x00007f0f20a517d5 llvm::SCCPInstVisitor::getFeasibleSuccessors(llvm::Instruction&, llvm::SmallVectorImpl<bool>&) (/home/spica/GitRepo/llvm-project/build/./lib/libLLVMTransformUtils.so.15git+0x22a7d5)
#9 0x00007f0f20a576c6 llvm::SCCPInstVisitor::visitTerminator(llvm::Instruction&) (/home/spica/GitRepo/llvm-project/build/./lib/libLLVMTransformUtils.so.15git+0x2306c6)
#10 0x00007f0f20a59dc1 llvm::SCCPInstVisitor::solve() (/home/spica/GitRepo/llvm-project/build/./lib/libLLVMTransformUtils.so.15git+0x232dc1)
#11 0x00007f0f1ea36c9a runSCCP(llvm::Function&, llvm::DataLayout const&, llvm::TargetLibraryInfo const*) SCCP.cpp:0:0
#12 0x00007f0f1ea37106 llvm::SCCPPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/spica/GitRepo/llvm-project/build/./lib/../lib/libLLVMScalarOpts.so.15git+0x348106)
#13 0x00007f0f2259ff86 llvm::detail::PassModel<llvm::Function, llvm::SCCPPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/spica/GitRepo/llvm-project/build/./lib/libLLVMPasses.so.15git+0xa4f86)
#14 0x00007f0f1feda3a4 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/spica/GitRepo/llvm-project/build/./lib/libLLVMCore.so.15git+0x2da3a4)
#15 0x00007f0f2259b246 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/spica/GitRepo/llvm-project/build/./lib/libLLVMPasses.so.15git+0xa0246)
#16 0x00007f0f1fed8ed6 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/spica/GitRepo/llvm-project/build/./lib/libLLVMCore.so.15git+0x2d8ed6)
#17 0x00007f0f225a3ad6 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/spica/GitRepo/llvm-project/build/./lib/libLLVMPasses.so.15git+0xa8ad6)
#18 0x000055bdc61630eb llvm_util::optimize_module[abi:cxx11](llvm::Module*, llvm::StringRef) (./alive-tv+0x3f0eb)
#19 0x000055bdc6154b4c main (./alive-tv+0x30b4c)
#20 0x00007f0f1f56d0b3 __libc_start_main /build/glibc-sMfBJT/glibc-2.31/csu/../csu/libc-start.c:342:3
#21 0x000055bdc615665e _start (./alive-tv+0x3265e)
```
Location in source code:
```
// Now that all of the things that global variable initializer can refer to
// have been created, loop through and copy the global variable referrers
// over... We also set the attributes on the global now.
//
```
https://github.com/llvm/llvm-project/blob/main/llvm/lib/Transforms/Utils/CloneModule.cpp#L112
Maybe need to maintain the basic block information as well?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWdty47gR_Rr5BSUW75Ie_CDbo8yk7OzU2pk8qkAQlJChCAYAZStfn26AFC_Wrj27s5OtVFwybwC6T59uNJpgJvPT9U2zIz_zWiozi9Yz_27mrwmZhTdk01TMCFnBYzJL_dtSVvxB5k3J4W4W3pJHesKGh5DMojsybA-XD8EsXGG_gcC11s2hRpFEFsTshSbFWAeMSn1Cq9zJxRu9l02Zk4wTUeW85nCojEfWZUnYnlY7rqGhH-u6V7NwYcieHjkIO0GHomx4xaCvrM6iPYdteGy5UGAF4xM6Piuu-L8aoYUZNuGfNe5sC9kQJitDRSWqHQmJVCQiGdWCkayU7Kv2OuayzPKYZYE7DVANBe9KmdGSUKVgGDA3S27Wea641mhQQW6s7Bsre5bcAft7Y2qNIMMN_MryePCk2sFlLpmG0z0Q9zMvvL05lLMwop20uSzmFuncIQUfEo98oGxP2j5E15yJQoBms-e9zeizgY2kogfwmCG1FJWBvtIj5BO6BN0ljAB7jhScQmwsLTeOAB-DBq76J8GrJ-HrwPqp5oq2YTSgD5tubYxYrBYS0neZeAIgsa2pc2q4bXCXYX8ZYb9BuHlDFB9egBrDMVYh8oRUF6LkCXCM3Pk6dl3YWnKlOgz5OSMbMXIGeeFpNObqLRSOhrdg_GY3rZlpQOVFerD9IYCzSwTf0WQrOfz-km10yYqVjZ5G3oTjI1WCZqXLVAiFQqrckWdh9tZml8dyDydIpjj9CrO6UYSe0-WFTPVRPpNn9E0DE09MU7fh2hBGNbdGu2GA3P3cbeyXUtaeoWrHYYJiBoespQ2tDCaYkLwQsZyFa0goeG-v3dxuMwGQ0wpxVCV9XLyrs6UestUFOGM075c24Cfnhag4OUoBa0nXdynSGGXBiBpT22xx43rDkqJOAw4zRUqa8bIzyz7GiyHNyQBsKWne8tXZbxWNzMImWopdRZadFFjThIKsAQqdmWex1rLkZgQDHg3ugzN7eN0jU4AJ7W7pWNxdDgB7XBeGKwwkhqu3W5MP7Rp-a5O6hAg8iH_bZG4jFkBpxur3LTSfKS4r3TqD4-a6pkrzObg3FxjctJx3rp7DylvTnUvl4J8aRttZwRTVe5g_CEjZWgUivyzlM66wXKlBMpmaGW728gDWbHQtGIXzX4TBcqeFiyr_CQ5ob_EkMjg-KVppzHxoxd-NKPH8eHv7-VGWR648VtegMl2kOMNslNnhgCJaY7dPYNEXrBUctGgNLt1wWCAhDzw2DEoRLRUGcj8Mh6jGlUNhap3dizzQsvwCOKX6dKjLWXSbSQmnD7bnCkFAdcWVXYvBeKwP5tCMWrsSCyYNxnx0hwH71LZ-pgqCv2tDYSmcQltMnNd8WDQpyUVRcOzcL_qzCLwOyXJBCipKyGBtCIKrfeK_-PC3KPwiKLI08PMYSigoBh4NZV-BXsYfYSrQ8iM4teQKINigxYmzIq5JtzT79v8sOxjLTngQxGQqTKBVbwgKR4KSJfOZTywXbRS8LNNtGs9LUTUv813VuAbmaekBUzf-SxzBkHPqQZnRK5lRRhQVGkqdcJM1ogQbNzsUM9cPxc1fn863oRcFGKgWMlx4Ht6dNJS9GH1NJV7cg6PFAZjgbEV7DAxLMAkEPZJ4jCTNlsmK0Awnz3uRmNzxYEdZJUtUsuiVJFMlCyAd4mrrcG813x0gZrZtsfc-veA7tB-T6kHvGHWqEx_jfNnrTi_p3lblFgduc3mgWNf8HpWrBUZMFPc6F2Odi9z3028LmSiGIaOQWQ5khj5NgkWe_FfTSWvQexNnx693JgGO9_dfHs5J1CZQpCBIdlCsIA1hSMHMEQ-rCQ-LlKVv8XDEmyeuDqKi-PDXGPgxdkU-wO6rEUhX_sSuVc6Ct-zSuMyc0_IPQB0CqBHqUZblNErZihLVVAh3RHO_wEyi7I4aek9PsjGumHvV4clWOvciU1SdPlWF7Pq5NQAUvc7bCC2cQFsE_jRQsPBwdwD5fXDXkHVPWugHWtEdrCHR7YVB322KeK_888hoSdVPtZn4JoqXgT-OqOEiE4bJqiiWQwJybmA9dtdIxIPMeXnZnnFa6IgbPf0MNQBXR547grj-bbTh70_sj9YJbcE6cgCNgd4R_-Ollec0ovGQMeT811D_DxN4KxWf5BZLz4i_ZBK_WRh_j_j9w3j__3wYzQcf3DXyZzqZD0ueD_3pdoWfZIcSha5zWp9XuykH3TbyNzDQDvkR4YzWjcxfjMMZwj3_tnB-OL9yv4-07xWPPWm_FI1_Hk9cjMQlnbiiq6WTJMtZGqSRzzOLe9uYzgfdlsa23elIbmgm4Dl7eQkCt6_xmoD1ZKk08C6Le-ithQiXluLI5-boVu0CNI-grcbQkjiLGWnfUS6M96F5OD70J687uZ9FZLvFt4utNlSZ7be88DDddFWIu3R9UY599YniEI-9-mACP00TTpziywaE0KE34NLukzveS2Z3fHB3VMtGMQ5lYN5_Y7koADfgcMuJ_E0-E7OnhsAbjfusZLexqp12jyd7sN3XB3C_IoxWRPECroyciLW73xnnFWGKU8Nz634pa5CqZLPb270oJuuT1TjVYqUqDq9kY7ES9448j5B_cACsJdHcWAHUQEBljXGfqAYiK_nsjYVc5GO8EQfzY99kHpOHWb-vNZlnIB5OGDKDPr-89zX4vGeL8jC6D4Jw6KEHeso4qTjP8UsKCsZvYNaW4ZchUaFo53GqyTMvYVpuyFDSVX4d5atoRa-MMCW_noXh6OtiSAogj5engTfzjjBoHu8Vh_0G_FWjyutvpkpo3WBW3STJahVc7a-TZbLyU7qKWeIHGQ2XK86yfLXMlz5nq4Be2V1afQ2ZBdRX_JlYEbhXltxdievQD0M_BfqiZBXHHocXxoDlywAExlmYz2KfA32l1-2nXqlrCylrdhq3lIWGd4RzI-RFsQParTqQTxuzl-r6IzW6qbhNuFdW_7XF_x-YqP05">