[llvm] ec893da - [GlobalISel] Remove semantic operand of G_IS_FPCLASS

Serge Pavlov via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 15 00:49:18 PST 2022


Author: Serge Pavlov
Date: 2022-11-15T15:48:05+07:00
New Revision: ec893da99080366fed2e4f13a7f0d4d92cf20e9f

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

LOG: [GlobalISel] Remove semantic operand of G_IS_FPCLASS

Instruction G_IS_FPCLASS had an operand that represented floating-point
semantics of its first operand. It allowed types that have the same length,
like `bfloat16` and `half`, to be distinguished. Unfortunately, it is
not sufficient, as other operation still cannot distinguish such types.
Solution of this problem must be more general, so now this operand is removed.

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

Added: 
    

Modified: 
    llvm/docs/GlobalISel/GenericOpcode.rst
    llvm/include/llvm/Target/GenericOpcodes.td
    llvm/lib/CodeGen/MachineVerifier.cpp
    llvm/test/MachineVerifier/test_g_is_fpclass.mir

Removed: 
    


################################################################################
diff  --git a/llvm/docs/GlobalISel/GenericOpcode.rst b/llvm/docs/GlobalISel/GenericOpcode.rst
index 3c07a85b94965..1061ba1255f41 100644
--- a/llvm/docs/GlobalISel/GenericOpcode.rst
+++ b/llvm/docs/GlobalISel/GenericOpcode.rst
@@ -484,8 +484,7 @@ G_IS_FPCLASS
 ^^^^^^^^^^^^
 
 Tests if the first operand, which must be floating-point scalar or vector, has
-floating-point class specified by the second operand. The third operand
-specifies floating-point semantics of the tested value. Returns non-zero (true)
+floating-point class specified by the second operand. Returns non-zero (true)
 or zero (false). It's target specific whether a true value is 1, ~0U, or some
 other non-zero value. If the first operand is a vector, the returned value is a
 vector of the same length.

diff  --git a/llvm/include/llvm/Target/GenericOpcodes.td b/llvm/include/llvm/Target/GenericOpcodes.td
index 5cd7b7bf78a71..81fcc21f70a3a 100644
--- a/llvm/include/llvm/Target/GenericOpcodes.td
+++ b/llvm/include/llvm/Target/GenericOpcodes.td
@@ -748,7 +748,7 @@ def G_FCANONICALIZE : GenericInstruction {
 // Generic opcode equivalent to the llvm.is_fpclass intrinsic.
 def G_IS_FPCLASS: GenericInstruction {
   let OutOperandList = (outs type0:$dst);
-  let InOperandList = (ins type1:$src, unknown:$test, unknown:$fpsem);
+  let InOperandList = (ins type1:$src, unknown:$test);
   let hasSideEffects = false;
 }
 

diff  --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
index d31d6d3a4d02c..63c6a15bbfabd 100644
--- a/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -1714,16 +1714,6 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
       report("Incorrect floating-point class set (operand 2)", MI);
       break;
     }
-    const MachineOperand &SemanticsMO = MI->getOperand(3);
-    if (!SemanticsMO.isImm()) {
-      report("floating-point semantics (operand 3) must be an immediate", MI);
-      break;
-    }
-    int64_t Semantics = SemanticsMO.getImm();
-    if (Semantics < 0 || Semantics > APFloat::S_MaxSemantics) {
-      report("Incorrect floating-point semantics (operand 3)", MI);
-      break;
-    }
     break;
   }
   case TargetOpcode::G_ASSERT_ALIGN: {

diff  --git a/llvm/test/MachineVerifier/test_g_is_fpclass.mir b/llvm/test/MachineVerifier/test_g_is_fpclass.mir
index a749a7923d684..cfd49ba3fc996 100644
--- a/llvm/test/MachineVerifier/test_g_is_fpclass.mir
+++ b/llvm/test/MachineVerifier/test_g_is_fpclass.mir
@@ -15,26 +15,23 @@ body:             |
     %ptr:_(p0) = COPY $x0
     %vector:_(<4 x s32>) = COPY $q0
 
-    %val1:_(s1) = G_IS_FPCLASS %s32, 1
+    %val1:_(s1) = G_IS_FPCLASS %s32
     ; CHECK: *** Bad machine code: Too few operands ***
-    ; CHECK: 4 operands expected, but 3 given.
+    ; CHECK: 3 operands expected, but 2 given.
 
-    %val2:_(p0) = G_IS_FPCLASS %s32, 3, 2
+    %val2:_(p0) = G_IS_FPCLASS %s32, 3
     ; CHECK: *** Bad machine code: Destination must be a scalar or vector of scalars ***
 
-    %val3:_(s1) = G_IS_FPCLASS %s32, 1, 66
-    ; CHECK: *** Bad machine code: Incorrect floating-point semantics (operand 3) ***
-
-    %val4:_(s1) = G_IS_FPCLASS %s32, 7777, 2
+    %val4:_(s1) = G_IS_FPCLASS %s32, 7777
     ; CHECK: *** Bad machine code: Incorrect floating-point class set (operand 2) ***
 
-    %val5:_(s1) = G_IS_FPCLASS %ptr:_(p0), 3, 2
+    %val5:_(s1) = G_IS_FPCLASS %ptr:_(p0), 3
     ; CHECK: *** Bad machine code: Source must be a scalar or vector of scalars ***
 
-    %var6:_(s1) = G_IS_FPCLASS %vector:_(<4 x s32>), 1, 2
+    %var6:_(s1) = G_IS_FPCLASS %vector:_(<4 x s32>), 1
     ; CHECK: *** Bad machine code: operand types must be all-vector or all-scalar ***
 
-    %var7:_(<2 x s1>) = G_IS_FPCLASS %vector:_(<4 x s32>), 1, 2
+    %var7:_(<2 x s1>) = G_IS_FPCLASS %vector:_(<4 x s32>), 1
     ; CHECK: *** Bad machine code: operand types must preserve number of vector elements ***
 
 ...


        


More information about the llvm-commits mailing list