From: Bradley Smith Date: Fri, 12 Feb 2021 12:51:10 +0000 (+0000) Subject: [AArch64] Allow folding FMUL/FADD into FMA for FP16 types X-Git-Tag: llvmorg-14-init~14746 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5b094bfeb3ccaf3ba118f161277ade9fc5147272;p=platform%2Fupstream%2Fllvm.git [AArch64] Allow folding FMUL/FADD into FMA for FP16 types isFMAFasterThanFMulAndFAdd should return true for FP16 types when HasFullFP16 is present, since we have the instructions to handle it for both SVE and NEON. (SVE patterns and tests will follow). Differential Revision: https://reviews.llvm.org/D96599 --- diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index e77868c..710c9d1 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -11569,6 +11569,8 @@ bool AArch64TargetLowering::isFMAFasterThanFMulAndFAdd( return false; switch (VT.getSimpleVT().SimpleTy) { + case MVT::f16: + return Subtarget->hasFullFP16(); case MVT::f32: case MVT::f64: return true; diff --git a/llvm/test/CodeGen/AArch64/f16-instructions.ll b/llvm/test/CodeGen/AArch64/f16-instructions.ll index 6c1ea86..a324034 100644 --- a/llvm/test/CodeGen/AArch64/f16-instructions.ll +++ b/llvm/test/CodeGen/AArch64/f16-instructions.ll @@ -62,6 +62,26 @@ define half @test_fmul(half %a, half %b) #0 { ret half %r } +; CHECK-CVT-LABEL: test_fmadd: +; CHECK-CVT-NEXT: fcvt s1, h1 +; CHECK-CVT-NEXT: fcvt s0, h0 +; CHECK-CVT-NEXT: fmul s0, s0, s1 +; CHECK-CVT-NEXT: fcvt h0, s0 +; CHECK-CVT-NEXT: fcvt s0, h0 +; CHECK-CVT-NEXT: fcvt s1, h2 +; CHECK-CVT-NEXT: fadd s0, s0, s1 +; CHECK-CVT-NEXT: fcvt h0, s0 +; CHECK-CVT-NEXT: ret + +; CHECK-FP16-LABEL: test_fmadd: +; CHECK-FP16-NEXT: fmadd h0, h0, h1, h2 +; CHECK-FP16-NEXT: ret + +define half @test_fmadd(half %a, half %b, half %c) #0 { + %mul = fmul fast half %a, %b + %r = fadd fast half %mul, %c + ret half %r +} ; CHECK-CVT-LABEL: test_fdiv: ; CHECK-CVT-NEXT: fcvt s1, h1 ; CHECK-CVT-NEXT: fcvt s0, h0 @@ -1305,8 +1325,7 @@ define half @test_round(half %a) #0 { ; CHECK-CVT-NEXT: ret ; CHECK-FP16-LABEL: test_fmuladd: -; CHECK-FP16-NEXT: fmul h0, h0, h1 -; CHECK-FP16-NEXT: fadd h0, h0, h2 +; CHECK-FP16-NEXT: fmadd h0, h0, h1, h2 ; CHECK-FP16-NEXT: ret define half @test_fmuladd(half %a, half %b, half %c) #0 {