Unreferenced BlockAddress broke IR compilation?

Hi:
I’m currently using 176249bd @ release/11.x for a downstream project that contains two passes.
The first pass randomly introduces DeadBasicBlocks (BasicBlocks that are not branched to in any way).
The second pass creates BlockAddress of all BasicBlocks in a function, put them into a GlobalVariable and patch br instructions to GEP+Load+indibr instructions.

When the first pass didn’t create deadBasicBlock, the transformed IR fully works as intended, however if deadbasicblock is introduced, all elements in the GV created in the second pass references to the same address in the compiled object file.

Not sure if this is a bug on LLVM side or not

Does https://reviews.llvm.org/rG90af134473331095adcf2c7e4a511ac35d9f2f4a help?

Hi:
Unfortunately main is beyond our use-case. Is there any suggestion on how to work around this bug?
Also, found a new case where even non-dead basicblocks could reproduce the same issue, is there any suggestion on how can I debug this?

Zhang

Seems like it’s an issue related to some state caching.

I tried to comment out MMIAddrLabelMap::getAddrLabelSymbolToEmit in MachineModuleInfo.cpp 's cache related code. (The one related to loading from AddrLabelSymbols) and the emitted assembly seems to be correct, at least the branch table is correct.

Arthur can you double check this? This was reproducible even for functions without a dangling BasicBlock in my IR.

Zhang