[llvm-dev] Finding which registers the operand of a load maps to
Gus Smith via llvm-dev
llvm-dev at lists.llvm.org
Tue Mar 20 19:44:27 PDT 2018
​Appreciate all of the quick responses to my ridiculous questions so far.
Hoping this one attracts similarly good dis​cussion!
Let's say I have the following series of instructions:
%a = load i32, i32* %ptr1
%b = load i32, i32* %ptr2
%c = add i32 %a, %b
store i32 %c, i32* %ptr3
This gets compiled (roughly) to
mov eax, dword ptr [rsp - 4]
add eax, dword ptr [rsp - 8]
mov dword ptr [rsp - 12], eax
In an opt pass, I would like to replace this series of four instructions
with a single intrinsic, @llvm.cache.add, which will represent an add
performed in the cache:
call @llvm.cache.add(%ptr3, %ptr1, %ptr2)
This intrinsic will compile (preferably) to a single instruction:
cache_add dword [rsp - 12], dword [rsp - 4], dword [rsp - 8]
When it comes time to generate code for this intrinsic, I am faced with a
predicament:
1. I need to make sure %ptr3, %ptr1, and %ptr2 are allocated in
register(s) (rsp in the example above) and,
2. I need to know *which* registers they are allocated in, as this will
be needed to actually generate the instruction.
Unfortunately, I am stuck on both of these. I have begun researching into
the code generation process, but am a little lost in the weeds. I found a
page of documentation that seemed important (
https://llvm.org/docs/CodeGenerator.html#mapping-virtual-registers-to-physical-registers),
however, it's a little above my current knowledge. Thus, I have some
questions:
1. To solve problem #1, I was planning on simply inserting the `call
@llvm.cache.add` instruction *after* the store instruction in the
initial grouping of four instructions. My intent is to ensure that the
argument of the store (%ptr3) is defined before its use by `call
@llvm.cache.add`. Is this safe?
2. Is the information in problem #2 readily accessible? If I have a
value `i32* %ptr1`, is there some way to map that to the expression `[rsp -
4]`? Presumably, this is exactly what happens during code generation for
the load and store instructions -- is there an easy way to imitate what
they do?
Thanks for all the help so far!
Gus, PSU
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180320/801fa000/attachment.html>
More information about the llvm-dev
mailing list