[llvm] r325130 - [ARM] f16 stack spill/reloads
Sjoerd Meijer via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 14 07:09:09 PST 2018
Author: sjoerdmeijer
Date: Wed Feb 14 07:09:09 2018
New Revision: 325130
URL: http://llvm.org/viewvc/llvm-project?rev=325130&view=rev
Log:
[ARM] f16 stack spill/reloads
This adds support for handling f16 stack spills/reloads.
Differential Revision: https://reviews.llvm.org/D43280
Modified:
llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
llvm/trunk/test/CodeGen/ARM/fp16-instructions.ll
Modified: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp?rev=325130&r1=325129&r2=325130&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp Wed Feb 14 07:09:09 2018
@@ -963,6 +963,17 @@ storeRegToStackSlot(MachineBasicBlock &M
MFI.getObjectSize(FI), Align);
switch (TRI->getSpillSize(*RC)) {
+ case 2:
+ if (ARM::HPRRegClass.hasSubClassEq(RC)) {
+ BuildMI(MBB, I, DL, get(ARM::VSTRH))
+ .addReg(SrcReg, getKillRegState(isKill))
+ .addFrameIndex(FI)
+ .addImm(0)
+ .addMemOperand(MMO)
+ .add(predOps(ARMCC::AL));
+ } else
+ llvm_unreachable("Unknown reg class!");
+ break;
case 4:
if (ARM::GPRRegClass.hasSubClassEq(RC)) {
BuildMI(MBB, I, DL, get(ARM::STRi12))
@@ -1161,6 +1172,16 @@ loadRegFromStackSlot(MachineBasicBlock &
MFI.getObjectSize(FI), Align);
switch (TRI->getSpillSize(*RC)) {
+ case 2:
+ if (ARM::HPRRegClass.hasSubClassEq(RC)) {
+ BuildMI(MBB, I, DL, get(ARM::VLDRH), DestReg)
+ .addFrameIndex(FI)
+ .addImm(0)
+ .addMemOperand(MMO)
+ .add(predOps(ARMCC::AL));
+ } else
+ llvm_unreachable("Unknown reg class!");
+ break;
case 4:
if (ARM::GPRRegClass.hasSubClassEq(RC)) {
BuildMI(MBB, I, DL, get(ARM::LDRi12), DestReg)
@@ -1168,7 +1189,6 @@ loadRegFromStackSlot(MachineBasicBlock &
.addImm(0)
.addMemOperand(MMO)
.add(predOps(ARMCC::AL));
-
} else if (ARM::SPRRegClass.hasSubClassEq(RC)) {
BuildMI(MBB, I, DL, get(ARM::VLDRS), DestReg)
.addFrameIndex(FI)
Modified: llvm/trunk/test/CodeGen/ARM/fp16-instructions.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/fp16-instructions.ll?rev=325130&r1=325129&r2=325130&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/fp16-instructions.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/fp16-instructions.ll Wed Feb 14 07:09:09 2018
@@ -11,6 +11,10 @@
; RUN: llc < %s -mtriple=thumbv7-none-eabi -mattr=+vfp4 | FileCheck %s --check-prefixes=CHECK,CHECK-SOFTFP-FP16
; RUN: llc < %s -mtriple=thumbv7-none-eabi -mattr=+fullfp16 | FileCheck %s --check-prefixes=CHECK,CHECK-SOFTFP-FULLFP16
+; Test fast-isel
+; RUN: llc < %s -mtriple=arm-none-eabi -mattr=+fullfp16 -O0 | FileCheck %s --check-prefixes=CHECK-SPILL-RELOAD
+; RUN: llc < %s -mtriple=thumbv7-none-eabi -mattr=+fullfp16 -O0 | FileCheck %s --check-prefixes=CHECK-SPILL-RELOAD
+
; HARD:
; RUN: llc < %s -mtriple=arm-none-eabihf -mattr=+vfp3 | FileCheck %s --check-prefixes=CHECK,CHECK-HARDFP-VFP3
; RUN: llc < %s -mtriple=arm-none-eabihf -mattr=+vfp4 | FileCheck %s --check-prefixes=CHECK,CHECK-HARDFP-FP16
@@ -719,3 +723,25 @@ entry:
; CHECK-SOFTFP-FULLFP16: vldr.16 [[S2:s[0-9]]], [sp, #{{.}}]
; CHECK-SOFTFP-FULLFP16: vadd.f16 s{{.}}, [[S2]], [[S0_2]]
}
+
+; Test function calls to check store/load reg to/from stack
+define i32 @fn1() {
+entry:
+ %coerce = alloca half, align 2
+ %tmp2 = alloca i32, align 4
+ store half 0xH7C00, half* %coerce, align 2
+ %0 = load i32, i32* %tmp2, align 4
+ %call = call i32 bitcast (i32 (...)* @fn2 to i32 (i32)*)(i32 %0)
+ store half 0xH7C00, half* %coerce, align 2
+ %1 = load i32, i32* %tmp2, align 4
+ %call3 = call i32 bitcast (i32 (...)* @fn3 to i32 (i32)*)(i32 %1)
+ ret i32 %call3
+
+; CHECK-SPILL-RELOAD-LABEL: fn1:
+; CHECK-SPILL-RELOAD: vstr.16 s0, [sp, #{{.}}] @ 2-byte Spill
+; CHECK-SPILL-RELOAD-NEXT: bl fn2
+; CHECK-SPILL-RELOAD-NEXT: vldr.16 s0, [sp, #{{.}}] @ 2-byte Reload
+}
+
+declare dso_local i32 @fn2(...)
+declare dso_local i32 @fn3(...)
More information about the llvm-commits
mailing list