From c1813d8fe186df911999d9d25f96b2875ad72d46 Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Mon, 23 Mar 2015 17:19:34 +0000 Subject: [PATCH] [AArch64] Enable rematerialization of float 0 values. Patch by Geoff Berry. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232967 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AArch64/AArch64InstrInfo.td | 11 +++++++++-- test/CodeGen/AArch64/remat-float0.ll | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/AArch64/remat-float0.ll diff --git a/lib/Target/AArch64/AArch64InstrInfo.td b/lib/Target/AArch64/AArch64InstrInfo.td index 57a23a05beb..552be6d64f4 100644 --- a/lib/Target/AArch64/AArch64InstrInfo.td +++ b/lib/Target/AArch64/AArch64InstrInfo.td @@ -2348,8 +2348,15 @@ defm UCVTF : IntegerToFP<1, "ucvtf", uint_to_fp>; defm FMOV : UnscaledConversion<"fmov">; -def : Pat<(f32 (fpimm0)), (FMOVWSr WZR)>, Requires<[NoZCZ]>; -def : Pat<(f64 (fpimm0)), (FMOVXDr XZR)>, Requires<[NoZCZ]>; +// Add pseudo ops for FMOV 0 so we can mark them as isReMaterializable +let isReMaterializable = 1, isCodeGenOnly = 1 in { +def FMOVS0 : Pseudo<(outs FPR32:$Rd), (ins), [(set f32:$Rd, (fpimm0))]>, + PseudoInstExpansion<(FMOVWSr FPR32:$Rd, WZR)>, + Requires<[NoZCZ]>; +def FMOVD0 : Pseudo<(outs FPR64:$Rd), (ins), [(set f64:$Rd, (fpimm0))]>, + PseudoInstExpansion<(FMOVXDr FPR64:$Rd, XZR)>, + Requires<[NoZCZ]>; +} //===----------------------------------------------------------------------===// // Floating point conversion instruction. diff --git a/test/CodeGen/AArch64/remat-float0.ll b/test/CodeGen/AArch64/remat-float0.ll new file mode 100644 index 00000000000..3c3681b0ead --- /dev/null +++ b/test/CodeGen/AArch64/remat-float0.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -verify-machineinstrs + +; Check that float 0 gets rematerialized with an fmov of zero reg instead +; of spilled/filled. + +declare void @bar(float) + +define void @foo() { +; CHECK-LABEL: foo: +; CHECK: fmov s0, wzr +; CHECK: bl bar +; CHECK: fmov s0, wzr +; CHECK: bl bar + call void @bar(float 0.000000e+00) + call void asm sideeffect "", "~{s0},~{s1},~{s2},~{s3},~{s4},~{s5},~{s6},~{s7},~{s8},~{s9},~{s10},~{s11},~{s12},~{s13},~{s14},~{s15},~{s16},~{s17},~{s18},~{s19},~{s20},~{s21},~{s22},~{s23},~{s24},~{s25},~{s26},~{s27},~{s28},~{s29},~{s30},~{s31}"() + call void @bar(float 0.000000e+00) + ret void +}