[llvm] [RISCV] Fix incorrect codegen for Zfa with negated forms of constants in the lookup table (PR #68026)

Alex Bradbury via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 2 12:57:07 PDT 2023


https://github.com/asb created https://github.com/llvm/llvm-project/pull/68026

The logic in `RISCVLoadFPImm::getLoadFPImm` recognises that the only supported negative value is -1.0, but due to a typo returns `false` otherwise (entry 0, which is -1.0) rather than returning -1 (indicating no match found).

>From a4c4f29576baddb82582d4dc1cc2c15e6394c572 Mon Sep 17 00:00:00 2001
From: Alex Bradbury <asb at igalia.com>
Date: Mon, 2 Oct 2023 20:53:02 +0100
Subject: [PATCH] [RISCV] Fix incorrect codegen for Zfa with negated forms of
 constants in the lookup table

The logic in `RISCVLoadFPImm::getLoadFPImm` recognises that the only
supported negative value is -1.0, but due to a typo returns `false`
otherwise (entry 0, which is -1.0) rather than returning -1 (indicating
no match found).
---
 llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp | 2 +-
 llvm/test/CodeGen/RISCV/double-zfa.ll                | 4 ++--
 llvm/test/CodeGen/RISCV/float-zfa.ll                 | 4 ++--
 llvm/test/CodeGen/RISCV/half-zfa-fli.ll              | 4 ++--
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp
index 0a42c6faee29008..d71efc11e6a9fcf 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.cpp
@@ -273,7 +273,7 @@ int RISCVLoadFPImm::getLoadFPImm(APFloat FPImm) {
   if (Sign) {
     if (Entry == 16)
       return 0;
-    return false;
+    return -1;
   }
 
   return Entry;
diff --git a/llvm/test/CodeGen/RISCV/double-zfa.ll b/llvm/test/CodeGen/RISCV/double-zfa.ll
index 00481fb367136f0..d81b7ddafd81851 100644
--- a/llvm/test/CodeGen/RISCV/double-zfa.ll
+++ b/llvm/test/CodeGen/RISCV/double-zfa.ll
@@ -143,11 +143,11 @@ define double @loadfpimm16() {
 
 ; Ensure fli isn't incorrectly used for negated versions of numbers in the fli
 ; table.
-; FIXME: Codegen is incorrect.
 define double @loadfpimm17() {
 ; CHECK-LABEL: loadfpimm17:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    fli.d fa0, -1.0
+; CHECK-NEXT:    lui a0, %hi(.LCPI15_0)
+; CHECK-NEXT:    fld fa0, %lo(.LCPI15_0)(a0)
 ; CHECK-NEXT:    ret
   ret double -2.0
 }
diff --git a/llvm/test/CodeGen/RISCV/float-zfa.ll b/llvm/test/CodeGen/RISCV/float-zfa.ll
index e41aa631d38a6ee..3b9043b0afe24b6 100644
--- a/llvm/test/CodeGen/RISCV/float-zfa.ll
+++ b/llvm/test/CodeGen/RISCV/float-zfa.ll
@@ -97,11 +97,11 @@ define float @loadfpimm11() {
 
 ; Ensure fli isn't incorrectly used for negated versions of numbers in the fli
 ; table.
-; FIXME: Codegen is incorrect.
 define float @loadfpimm12() {
 ; CHECK-LABEL: loadfpimm12:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    fli.s fa0, -1.0
+; CHECK-NEXT:    lui a0, 786432
+; CHECK-NEXT:    fmv.w.x fa0, a0
 ; CHECK-NEXT:    ret
   ret float -2.0
 }
diff --git a/llvm/test/CodeGen/RISCV/half-zfa-fli.ll b/llvm/test/CodeGen/RISCV/half-zfa-fli.ll
index 90d5bb4b53ba46d..cab15e58b0bb823 100644
--- a/llvm/test/CodeGen/RISCV/half-zfa-fli.ll
+++ b/llvm/test/CodeGen/RISCV/half-zfa-fli.ll
@@ -197,11 +197,11 @@ define half @loadfpimm13() {
 
 ; Ensure fli isn't incorrectly used for negated versions of numbers in the fli
 ; table.
-; FIXME: Codegen is incorrect when Zfa is enabled.
 define half @loadfpimm14() {
 ; CHECK-LABEL: loadfpimm14:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    fli.h fa0, -1.0
+; CHECK-NEXT:    lui a0, 1048572
+; CHECK-NEXT:    fmv.h.x fa0, a0
 ; CHECK-NEXT:    ret
 ;
 ; ZFHMIN-LABEL: loadfpimm14:



More information about the llvm-commits mailing list