From 0dcbf14745b79609199c9f5239c214f0c44e9032 Mon Sep 17 00:00:00 2001 From: Ikhlas Ajbar Date: Fri, 6 Dec 2024 13:49:26 -0800 Subject: [PATCH] [Hexagon][DAG][FREEZE] Fix bug 117337 Add support to lower "FREEZE a half(f16)" instruction on Hexagon. --- llvm/lib/Target/Hexagon/HexagonISelLowering.h | 2 + llvm/test/CodeGen/Hexagon/fp16-promote.ll | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100755 llvm/test/CodeGen/Hexagon/fp16-promote.ll diff --git a/llvm/lib/Target/Hexagon/HexagonISelLowering.h b/llvm/lib/Target/Hexagon/HexagonISelLowering.h index 3fd961f5a7462..4774eba6f4e03 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelLowering.h +++ b/llvm/lib/Target/Hexagon/HexagonISelLowering.h @@ -363,6 +363,8 @@ class HexagonTargetLowering : public TargetLowering { return AtomicExpansionKind::LLSC; } + bool softPromoteHalfType() const override { return true; } + private: void initializeHVXLowering(); unsigned getPreferredHvxVectorAction(MVT VecTy) const; diff --git a/llvm/test/CodeGen/Hexagon/fp16-promote.ll b/llvm/test/CodeGen/Hexagon/fp16-promote.ll new file mode 100755 index 0000000000000..ce5ae51955877 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/fp16-promote.ll @@ -0,0 +1,48 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -march=hexagon < %s | FileCheck %s + +define half @freeze_half_undef() nounwind { +; CHECK-LABEL: freeze_half_undef: +; CHECK: // %bb.0: +; CHECK-NEXT: { +; CHECK-NEXT: call __truncsfhf2 +; CHECK-NEXT: r0 = #0 +; CHECK-NEXT: allocframe(#0) +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: call __extendhfsf2 +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: call __truncsfhf2 +; CHECK-NEXT: r0 = sfadd(r0,r0) +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: r31:30 = dealloc_return(r30):raw +; CHECK-NEXT: } + %y1 = freeze half undef + %t1 = fadd half %y1, %y1 + ret half %t1 +} + +define half @freeze_half_poison(half %maybe.poison) { +; CHECK-LABEL: freeze_half_poison: +; CHECK: .cfi_startproc +; CHECK-NEXT: // %bb.0: +; CHECK-NEXT: .cfi_def_cfa r30, 8 +; CHECK-NEXT: .cfi_offset r31, -4 +; CHECK-NEXT: .cfi_offset r30, -8 +; CHECK-NEXT: { +; CHECK-NEXT: call __extendhfsf2 +; CHECK-NEXT: allocframe(r29,#0):raw +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: call __truncsfhf2 +; CHECK-NEXT: r0 = sfadd(r0,r0) +; CHECK-NEXT: } +; CHECK-NEXT: { +; CHECK-NEXT: r31:30 = dealloc_return(r30):raw +; CHECK-NEXT: } + %y1 = freeze half %maybe.poison + %t1 = fadd half %y1, %y1 + ret half %t1 +}