diff options
| author | Serge Pavlov <sepavloff@gmail.com> | 2022-11-15 12:02:06 +0700 |
|---|---|---|
| committer | Serge Pavlov <sepavloff@gmail.com> | 2022-11-15 15:48:05 +0700 |
| commit | ec893da99080366fed2e4f13a7f0d4d92cf20e9f (patch) | |
| tree | bb19d405162b406406405d548730ed53e05959ce /llvm | |
| parent | b97911c37b84b3591875de813941616c278c429b (diff) | |
| download | llvm-ec893da99080366fed2e4f13a7f0d4d92cf20e9f.zip llvm-ec893da99080366fed2e4f13a7f0d4d92cf20e9f.tar.gz llvm-ec893da99080366fed2e4f13a7f0d4d92cf20e9f.tar.bz2 | |
[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
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/docs/GlobalISel/GenericOpcode.rst | 3 | ||||
| -rw-r--r-- | llvm/include/llvm/Target/GenericOpcodes.td | 2 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MachineVerifier.cpp | 10 | ||||
| -rw-r--r-- | llvm/test/MachineVerifier/test_g_is_fpclass.mir | 17 |
4 files changed, 9 insertions, 23 deletions
diff --git a/llvm/docs/GlobalISel/GenericOpcode.rst b/llvm/docs/GlobalISel/GenericOpcode.rst index 3c07a85..1061ba1 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 5cd7b7b..81fcc21 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 d31d6d3..63c6a15 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 a749a79..cfd49ba 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 *** ... |
