[clang] 560065b - [clang][RISCV] Set HasLegalHalfType to true if zfh is enabled

Alex Bradbury via cfe-commits cfe-commits at lists.llvm.org
Fri May 5 05:56:45 PDT 2023


Author: Alex Bradbury
Date: 2023-05-05T13:55:43+01:00
New Revision: 560065b6ecd539862fbc61401b02a1d5faea1ad1

URL: https://github.com/llvm/llvm-project/commit/560065b6ecd539862fbc61401b02a1d5faea1ad1
DIFF: https://github.com/llvm/llvm-project/commit/560065b6ecd539862fbc61401b02a1d5faea1ad1.diff

LOG: [clang][RISCV] Set HasLegalHalfType to true if zfh is enabled

The desired semantics for HasLegalHalfType are slightly unclear in that
the comment for HasLegalHalfType says "True if the backend supports
operations on the half LLVM IR type." Which operations? We get very
limited scalar operations with zfhmin, more with zfh, and vector support
with zvfh. While the comment for hasLegalHalfType() says "Determine
whether _Float16 is supported on this target."

This patch sets HasLegalHalfType to true for zfh.

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

Added: 
    

Modified: 
    clang/lib/Basic/Targets/RISCV.cpp
    clang/test/CodeGen/RISCV/Float16-arith.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp
index 6720fcd567ac8..bb61d75372667 100644
--- a/clang/lib/Basic/Targets/RISCV.cpp
+++ b/clang/lib/Basic/Targets/RISCV.cpp
@@ -320,6 +320,9 @@ bool RISCVTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
   if (ABI.empty())
     ABI = ISAInfo->computeDefaultABI().str();
 
+  if (ISAInfo->hasExtension("zfh"))
+    HasLegalHalfType = true;
+
   return true;
 }
 

diff  --git a/clang/test/CodeGen/RISCV/Float16-arith.c b/clang/test/CodeGen/RISCV/Float16-arith.c
index 63097de2fabb4..8fb3c1b146179 100644
--- a/clang/test/CodeGen/RISCV/Float16-arith.c
+++ b/clang/test/CodeGen/RISCV/Float16-arith.c
@@ -11,8 +11,7 @@
 _Float16 x, y, z;
 
 // With no native half type support (no zfh), f16 will be promoted to f32.
-// With zfh, it shouldn't be (FIXME: set HasLegalHalfType = true in order to
-// get this behaviour for zfh).
+// With zfh, it shouldn't be.
 
 // NOZFH-LABEL: define dso_local void @f16_add
 // NOZFH-SAME: () #[[ATTR0:[0-9]+]] {
@@ -30,12 +29,9 @@ _Float16 x, y, z;
 // ZFH-SAME: () #[[ATTR0:[0-9]+]] {
 // ZFH-NEXT:  entry:
 // ZFH-NEXT:    [[TMP0:%.*]] = load half, ptr @y, align 2
-// ZFH-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float
 // ZFH-NEXT:    [[TMP1:%.*]] = load half, ptr @z, align 2
-// ZFH-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float
-// ZFH-NEXT:    [[ADD:%.*]] = fadd float [[EXT]], [[EXT1]]
-// ZFH-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD]] to half
-// ZFH-NEXT:    store half [[UNPROMOTION]], ptr @x, align 2
+// ZFH-NEXT:    [[ADD:%.*]] = fadd half [[TMP0]], [[TMP1]]
+// ZFH-NEXT:    store half [[ADD]], ptr @x, align 2
 // ZFH-NEXT:    ret void
 //
 void f16_add() {


        


More information about the cfe-commits mailing list