]> granicus.if.org Git - llvm/commit
[AArch64] NFC: Add generic StackOffset to describe scalable offsets.
authorSander de Smalen <sander.desmalen@arm.com>
Tue, 6 Aug 2019 13:06:40 +0000 (13:06 +0000)
committerSander de Smalen <sander.desmalen@arm.com>
Tue, 6 Aug 2019 13:06:40 +0000 (13:06 +0000)
commit403adef16f998c36cc51f587f48b1e7f4c26e09e
treea56b0ec23b814c44fc1b33d367a5e7dcf5a6d10d
parent76f4f248702c4147c13045f02351fb8ca23051c1
[AArch64] NFC: Add generic StackOffset to describe scalable offsets.

To support spilling/filling of scalable vectors we need a more generic
representation of a stack offset than simply 'int'.

For this we introduce the StackOffset struct, which comprises multiple
offsets sized by their respective MVTs. Byte-offsets will thus be a simple
tuple such as { offset, MVT::i8 }. Adding two byte-offsets will result in a
byte offset { offsetA + offsetB, MVT::i8 }. When two offsets have different
types, we can canonicalise them to use the same MVT, as long as their
runtime sizes are guaranteed to have the same size-ratio as they would have
at compile-time.

When we have both scalable- and fixed-size objects on the stack, we can
create an offset that is:

  ({ offset_fixed, MVT::i8 } + { offset_scalable, MVT::nxv1i8 })

The struct also contains a getForFrameOffset() method that is specific to
AArch64 and decomposes the frame-offset to be used directly in instructions
that operate on the stack or index into the stack.

Note: This patch adds StackOffset as an AArch64-only concept, but we would
like to make this a generic concept/struct that is supported by all
interfaces that take or return stack offsets (currently as 'int'). Since
that would be a bigger change that is currently pending on D32530 landing,
we thought it makes sense to first show/prove the concept in the AArch64
target before proposing to roll this out further.

Reviewers: thegameg, rovka, t.p.northover, efriedma, greened

Reviewed By: rovka, greened

Differential Revision: https://reviews.llvm.org/D61435

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368024 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp
lib/Target/AArch64/AArch64FrameLowering.cpp
lib/Target/AArch64/AArch64FrameLowering.h
lib/Target/AArch64/AArch64InstrInfo.cpp
lib/Target/AArch64/AArch64InstrInfo.h
lib/Target/AArch64/AArch64RegisterInfo.cpp
lib/Target/AArch64/AArch64StackOffset.h [new file with mode: 0644]
unittests/Target/AArch64/CMakeLists.txt
unittests/Target/AArch64/TestStackOffset.cpp [new file with mode: 0644]