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