================
@@ -424,6 +432,94 @@ void validateAccessChain(const SPIRVSubtarget &STI, 
MachineRegisterInfo *MRI,
   }
 }
 
+inline void validateVec1Ops(const SPIRVSubtarget &STI, MachineRegisterInfo 
*MRI,
+                            SPIRVGlobalRegistry &GR, MachineInstr &MI) {
+  // IRTranslator does not believe that rank-1 vectors exist, unlike upstream
+  // LLVM which happily creates <1 x T> vectors. This leads to operations over
+  // <1 x T> vectors getting translated as their scalar counterparts, which is
+  // wrong if we used SPV_EXT_long_vector we to preserve the actual 
vector-ness.
+  switch (MI.getOpcode()) {
+  case SPIRV::OpBitwiseAndS:
+  case SPIRV::OpBitwiseOrS:
+  case SPIRV::OpBitwiseXorS:
+  case SPIRV::OpFAddS:
+  case SPIRV::OpFDivS:
+  case SPIRV::OpFMulS:
+  case SPIRV::OpFNegate:
+  case SPIRV::OpFRemS:
+  case SPIRV::OpFSubS:
+  case SPIRV::OpIAddCarryS:
+  case SPIRV::OpIAddS:
+  case SPIRV::OpIMulS:
+  case SPIRV::OpISubBorrowS:
+  case SPIRV::OpISubS:
+  case SPIRV::OpSDivS:
+  case SPIRV::OpSRemS:
+  case SPIRV::OpShiftLeftLogicalS:
+  case SPIRV::OpShiftRightArithmeticS:
+  case SPIRV::OpShiftRightLogicalS:
+  case SPIRV::OpStrictFAddS:
+  case SPIRV::OpStrictFDivS:
+  case SPIRV::OpStrictFMulS:
+  case SPIRV::OpStrictFRemS:
+  case SPIRV::OpStrictFSubS:
+  case SPIRV::OpUDivS:
+  case SPIRV::OpUModS: {
+    SPIRVTypeInst ResTy = GR.getSPIRVTypeForVReg(MI.getOperand(1).getReg());
+
+    if (!isVectorType(ResTy))
+      return;
+
+    // Restore original Vec1 type.
+    Register NewResultReg = createVirtualRegister(ResTy, &GR, MRI, 
*MI.getMF());
+    MRI->replaceRegWith(MI.getOperand(0).getReg(), NewResultReg);
+    // Vector opcodes are always next after scalar (if this ceases to hold we
+    // will have to adapt).
+    MI.setDesc(STI.getInstrInfo()->get(MI.getOpcode() + 1));
+    // IRTranslator would've inserted COPYs from the vector into a scalar, 
which
+    // are spurious and have to be walked through.
+    for (unsigned I = 2; I != MI.getNumOperands(); ++I) {
+      MachineOperand &Op = MI.getOperand(I);
+      if (!Op.isReg())
+        continue;
+
+      SPIRVTypeInst OpTy = GR.getSPIRVTypeForVReg(Op.getReg());
+      if (OpTy == ResTy)
+        continue;
+
+      MachineInstr *OpDef = getDef(Op, MRI);
+      assert(OpDef &&
+             GR.getSPIRVTypeForVReg(OpDef->getOperand(0).getReg()) == ResTy &&
+             "Expected to find Result Type (Vec1)!");
+      MI.substituteRegister(Op.getReg(), OpDef->getOperand(0).getReg(), 0,
+                            *STI.getRegisterInfo());
+    }
+    break;
+  }
+  case TargetOpcode::COPY: {
+    Register ResVReg = MI.getOperand(0).getReg();
+    SPIRVTypeInst SrcTy = GR.getSPIRVTypeForVReg(MI.getOperand(1).getReg());
+    SPIRVTypeInst DstTy = GR.getSPIRVTypeForVReg(ResVReg);
+
+    if (!SrcTy || !DstTy || isVectorType(DstTy) || !isVectorType(SrcTy))
+      return;
+
+    Register ExtractReg = createVirtualRegister(DstTy, &GR, MRI, *MI.getMF());
+    BuildMI(*MI.getParent(), MI, MI.getDebugLoc(),
+            STI.getInstrInfo()->get(SPIRV::OpCompositeExtract))
+        .addDef(ExtractReg)
+        .addUse(GR.getSPIRVTypeID(DstTy))
+        .addUse(MI.getOperand(1).getReg())
+        .addImm(0);
+    for (auto &&U : MRI->use_instructions(ResVReg))
+      U.substituteRegister(ResVReg, ExtractReg, 0, *STI.getRegisterInfo());
----------------
jmmartinez wrote:

Should we erase the COPY ?

https://github.com/llvm/llvm-project/pull/210279
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to