]> granicus.if.org Git - llvm/commitdiff
GlobalISel: Disallow vectors for G_CONSTANT/G_FCONSTANT
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 22 Jan 2019 18:53:41 +0000 (18:53 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 22 Jan 2019 18:53:41 +0000 (18:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351853 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/GenericOpcodes.td
lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
lib/CodeGen/MachineVerifier.cpp
test/CodeGen/AMDGPU/GlobalISel/legalize-select.mir
test/Verifier/test_g_constant.mir [new file with mode: 0644]
test/Verifier/test_g_fconstant.mir [new file with mode: 0644]

index 0903c482a0ffd2bc18c5bc551492942c1fa9e576..669a07b6511dc16dc7f5b327cbebff58c45ce85b 100644 (file)
@@ -92,12 +92,14 @@ def G_BITCAST : GenericInstruction {
   let hasSideEffects = 0;
 }
 
+// Only supports scalar result types
 def G_CONSTANT : GenericInstruction {
   let OutOperandList = (outs type0:$dst);
   let InOperandList = (ins unknown:$imm);
   let hasSideEffects = 0;
 }
 
+// Only supports scalar result types
 def G_FCONSTANT : GenericInstruction {
   let OutOperandList = (outs type0:$dst);
   let InOperandList = (ins unknown:$imm);
index c964e98f578af9332ca63fea6537cb4c89f22cef..6248a49317c352b58205ce6f18fc4e4c1d994c1d 100644 (file)
@@ -243,10 +243,8 @@ MachineInstrBuilder MachineIRBuilder::buildConstant(const DstOp &Res,
                                                     const ConstantInt &Val) {
   LLT Ty = Res.getLLTTy(*getMRI());
 
-  assert((Ty.isScalar() || Ty.isPointer()) && "invalid operand type");
-
   const ConstantInt *NewVal = &Val;
-  if (Ty.getSizeInBits() != Val.getBitWidth())
+  if (Ty.getScalarSizeInBits() != Val.getBitWidth())
     NewVal = ConstantInt::get(getMF().getFunction().getContext(),
                               Val.getValue().sextOrTrunc(Ty.getSizeInBits()));
 
@@ -266,7 +264,7 @@ MachineInstrBuilder MachineIRBuilder::buildConstant(const DstOp &Res,
 
 MachineInstrBuilder MachineIRBuilder::buildFConstant(const DstOp &Res,
                                                      const ConstantFP &Val) {
-  assert(Res.getLLTTy(*getMRI()).isScalar() && "invalid operand type");
+  assert(!Res.getLLTTy(*getMRI()).isPointer() && "invalid operand type");
 
   auto MIB = buildInstr(TargetOpcode::G_FCONSTANT);
   Res.addDefToMIB(*getMRI(), MIB);
index b7e0f5754062d97aa4cb2776bf1048747b06fcfd..ad7825ba3eb4faf90150c9328fd7ab44f72ee65f 100644 (file)
@@ -990,6 +990,16 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {
   switch(MI->getOpcode()) {
   default:
     break;
+  case TargetOpcode::G_CONSTANT:
+  case TargetOpcode::G_FCONSTANT: {
+    if (MI->getNumOperands() < MCID.getNumOperands())
+      break;
+
+    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
+    if (DstTy.isVector())
+      report("Instruction cannot use a vector result type", MI);
+    break;
+  }
   case TargetOpcode::G_LOAD:
   case TargetOpcode::G_STORE:
     // Generic loads and stores must have a single MachineMemOperand
index 1422ed2a4c9ee78ea65ae5957245d35d93339f56..480309d27411c51cbab9d579252bf069011e26a6 100644 (file)
@@ -53,23 +53,23 @@ body: |
 name: test_select_v2s32
 body: |
   bb.0:
-    liveins: $vgpr0
+    liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4
     ; CHECK-LABEL: name: test_select_v2s32
-    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
-    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[C]](s32), [[COPY]]
-    ; CHECK: [[C1:%[0-9]+]]:_(<2 x s32>) = G_CONSTANT i32 1
-    ; CHECK: [[C2:%[0-9]+]]:_(<2 x s32>) = G_CONSTANT i32 2
-    ; CHECK: [[SELECT:%[0-9]+]]:_(<2 x s32>) = G_SELECT [[ICMP]](s1), [[C1]], [[C2]]
+    ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr1_vgpr2
+    ; CHECK: [[COPY2:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr3_vgpr4
+    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
+    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[C]]
+    ; CHECK: [[SELECT:%[0-9]+]]:_(<2 x s32>) = G_SELECT [[ICMP]](s1), [[COPY1]], [[COPY2]]
     ; CHECK: $vgpr0_vgpr1 = COPY [[SELECT]](<2 x s32>)
-    %0:_(s32) = G_CONSTANT i32 0
-    %1:_(s32) = COPY $vgpr0
+    %0:_(s32) = COPY $vgpr0
+    %1:_(<2 x s32>) = COPY $vgpr1_vgpr2
+    %2:_(<2 x s32>) = COPY $vgpr3_vgpr4
+    %4:_(s32) = G_CONSTANT i32 0
 
-    %2:_(s1) = G_ICMP intpred(ne), %0, %1
-    %3:_(<2 x s32>) = G_CONSTANT i32 1
-    %4:_(<2 x s32>) = G_CONSTANT i32 2
-    %5:_(<2 x s32>) = G_SELECT %2, %3, %4
-    $vgpr0_vgpr1 = COPY %5
+    %5:_(s1) = G_ICMP intpred(ne), %0, %4
+    %6:_(<2 x s32>) = G_SELECT %5, %1, %2
+    $vgpr0_vgpr1 = COPY %6
 
 ...
 
@@ -160,22 +160,22 @@ body: |
 name: test_select_v2s16
 body: |
   bb.0:
-    liveins: $vgpr0
+    liveins: $vgpr0, $vgpr1, $vgpr2
     ; CHECK-LABEL: name: test_select_v2s16
+    ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
+    ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr1
+    ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
-    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
-    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[C]](s32), [[COPY]]
-    ; CHECK: [[C1:%[0-9]+]]:_(<2 x s16>) = G_CONSTANT i32 1
-    ; CHECK: [[C2:%[0-9]+]]:_(<2 x s16>) = G_CONSTANT i32 2
-    ; CHECK: [[SELECT:%[0-9]+]]:_(<2 x s16>) = G_SELECT [[ICMP]](s1), [[C1]], [[C2]]
+    ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[COPY2]](s32), [[C]]
+    ; CHECK: [[SELECT:%[0-9]+]]:_(<2 x s16>) = G_SELECT [[ICMP]](s1), [[COPY]], [[COPY1]]
     ; CHECK: $vgpr0 = COPY [[SELECT]](<2 x s16>)
-    %0:_(s32) = G_CONSTANT i32 0
-    %1:_(s32) = COPY $vgpr0
+    %0:_(<2 x s16>) = COPY $vgpr0
+    %1:_(<2 x s16>) = COPY $vgpr1
+    %2:_(s32) = COPY $vgpr2
+    %3:_(s32) = G_CONSTANT i32 0
 
-    %2:_(s1) = G_ICMP intpred(ne), %0, %1
-    %3:_(<2 x s16>) = G_CONSTANT i32 1
-    %4:_(<2 x s16>) = G_CONSTANT i32 2
-    %5:_(<2 x s16>) = G_SELECT %2, %3, %4
+    %4:_(s1) = G_ICMP intpred(ne), %2, %3
+    %5:_(<2 x s16>) = G_SELECT %4, %0, %1
     $vgpr0 = COPY %5
 
 ...
diff --git a/test/Verifier/test_g_constant.mir b/test/Verifier/test_g_constant.mir
new file mode 100644 (file)
index 0000000..2fa8d03
--- /dev/null
@@ -0,0 +1,18 @@
+#RUN: not llc -o - -global-isel -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s
+# REQUIRES: global-isel, aarch64-registered-target
+
+---
+name:            test_constant
+legalized:       true
+regBankSelected: false
+selected:        false
+tracksRegLiveness: true
+liveins:
+body:             |
+  bb.0:
+    ; CHECK: Bad machine code: Instruction cannot use a vector result type
+    %0:_(<2 x s32>) = G_CONSTANT i32 0
+
+    ; CHECK: Bad machine code: Too few operands
+    %1:_(s32) = G_CONSTANT
+...
diff --git a/test/Verifier/test_g_fconstant.mir b/test/Verifier/test_g_fconstant.mir
new file mode 100644 (file)
index 0000000..fecc47d
--- /dev/null
@@ -0,0 +1,15 @@
+#RUN: not llc -o - -global-isel -run-pass=none -verify-machineinstrs %s 2>&1 | FileCheck %s
+# REQUIRES: global-isel, aarch64-registered-target
+
+---
+name:            test_fconstant_vector
+legalized:       true
+regBankSelected: false
+selected:        false
+tracksRegLiveness: true
+liveins:
+body:             |
+  bb.0:
+    ; CHECK: Bad machine code: Instruction cannot use a vector result type
+    %0:_(<2 x s32>) = G_FCONSTANT float 0.0
+...