[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
This commit is contained in:
parent
b97911c37b
commit
ec893da990
|
@ -484,8 +484,7 @@ G_IS_FPCLASS
|
||||||
^^^^^^^^^^^^
|
^^^^^^^^^^^^
|
||||||
|
|
||||||
Tests if the first operand, which must be floating-point scalar or vector, has
|
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
|
floating-point class specified by the second operand. Returns non-zero (true)
|
||||||
specifies floating-point semantics of the tested value. Returns non-zero (true)
|
|
||||||
or zero (false). It's target specific whether a true value is 1, ~0U, or some
|
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
|
other non-zero value. If the first operand is a vector, the returned value is a
|
||||||
vector of the same length.
|
vector of the same length.
|
||||||
|
|
|
@ -748,7 +748,7 @@ def G_FCANONICALIZE : GenericInstruction {
|
||||||
// Generic opcode equivalent to the llvm.is_fpclass intrinsic.
|
// Generic opcode equivalent to the llvm.is_fpclass intrinsic.
|
||||||
def G_IS_FPCLASS: GenericInstruction {
|
def G_IS_FPCLASS: GenericInstruction {
|
||||||
let OutOperandList = (outs type0:$dst);
|
let OutOperandList = (outs type0:$dst);
|
||||||
let InOperandList = (ins type1:$src, unknown:$test, unknown:$fpsem);
|
let InOperandList = (ins type1:$src, unknown:$test);
|
||||||
let hasSideEffects = false;
|
let hasSideEffects = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1714,16 +1714,6 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
|
||||||
report("Incorrect floating-point class set (operand 2)", MI);
|
report("Incorrect floating-point class set (operand 2)", MI);
|
||||||
break;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case TargetOpcode::G_ASSERT_ALIGN: {
|
case TargetOpcode::G_ASSERT_ALIGN: {
|
||||||
|
|
|
@ -15,26 +15,23 @@ body: |
|
||||||
%ptr:_(p0) = COPY $x0
|
%ptr:_(p0) = COPY $x0
|
||||||
%vector:_(<4 x s32>) = COPY $q0
|
%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: *** 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 ***
|
; CHECK: *** Bad machine code: Destination must be a scalar or vector of scalars ***
|
||||||
|
|
||||||
%val3:_(s1) = G_IS_FPCLASS %s32, 1, 66
|
%val4:_(s1) = G_IS_FPCLASS %s32, 7777
|
||||||
; CHECK: *** Bad machine code: Incorrect floating-point semantics (operand 3) ***
|
|
||||||
|
|
||||||
%val4:_(s1) = G_IS_FPCLASS %s32, 7777, 2
|
|
||||||
; CHECK: *** Bad machine code: Incorrect floating-point class set (operand 2) ***
|
; 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 ***
|
; 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 ***
|
; 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 ***
|
; CHECK: *** Bad machine code: operand types must preserve number of vector elements ***
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
Loading…
Reference in New Issue