[PATCH] D124878: [Bitcode] Include indirect users of BlockAddresses in bitcode
Wende Tan via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 4 14:28:58 PDT 2022
twd2 added a comment.
In D124878#3489625 <https://reviews.llvm.org/D124878#3489625>, @nickdesaulniers wrote:
> Thanks for the patch! Indeed, the `users` _might_ be `Constant`s rather than just `Instructions`. One thing to think about is that you can declare global `Constants`. I used the `dyn_cast<Instruction>` to check that this was not the case. I think you'll need to differentiate that, too. Meaning, if the user is a Constant, are the Constant's users Instructions (or not if simply GlobalVar).
The users of `Constant`s are not only `Instruction`s and `GlobalValue`s, but also other `Constant`s.
For example, in rickyz's original reproducing code, the only user of `i8* blockaddress(@repro, %label)` is a `ConstantExpr`, `i64 ptrtoint (i8* blockaddress(@repro, %label) to i64)`.
This `ConstantExpr` will not pass the `dyn_cast<Instruction>` check, and no `Instruction` will be encoded in the bitcode.
Further, the only user of `i64 ptrtoint (... to i64)` is also a `ConstantExpr`, `i64 add (i64 ptrtoint (i8* blockaddress(@repro, %label) to i64), i64 1)`.
Finally, the only user of `i64 add (..., i64 1)` is the `tail call ...` `Instruction` in `Function` `@fun`.
We should find this `Instruction` and add the `Function` into the bitcode.
So, we might have to do a searching loop to first identify what `Constant`s (directly or recursively) use the given `BlockAddress`, and what `Instruction`s (`Function`s) use these `Constant`s, as my patch proposes.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124878/new/
https://reviews.llvm.org/D124878
More information about the llvm-commits
mailing list