[llvm-dev] Prevent LLVM optimizations from erasing unused basic blocks

Friedman, Eli via llvm-dev llvm-dev at lists.llvm.org
Tue Oct 9 11:38:58 PDT 2018


On 10/9/2018 11:31 AM, Gleb Popov via llvm-dev wrote:
> Hello LLVM Devs.
>
> In my compiler I attach some arbitrary data to functions by creating 
> BBs with inline assembly. However, these blocks are "unused" from LLVM 
> point of view and get erased from the function.
>
> To counter that I started adding checks for conditions that are 
> guaranteed to be true or false. I ended up with calling 
> @llvm.returnaddress(i32 0) intrinsic and comparing the result with 0. 
> It worked well until in one function I had two such calls and SROA 
> replaced one of checks with constant 1 and erased the BB.
>
> I should probably stop trying to fool LLVM and "do it right", but 
> don't have any idea how. Note that I can't use global variables for a 
> reason, so the data has to be encoded in a BB using inline assembly. 
> All I need is just prevent optimizations from erasing it.

A reachable inline asm won't be erased if LLVM thinks it has some 
side-effect.  The simplest way to do this is the "sideeffect" marking 
(in C++, it's a parameter to InlineAsm::get()).  See 
http://llvm.org/docs/LangRef.html#inline-assembler-expressions .

-Eli

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project



More information about the llvm-dev mailing list