[PATCH] D61321: [globalisel] Allow SrcOp to convert an APInt and render it as an immediate operand (MO.isImm() == true)

Daniel Sanders via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 30 09:43:40 PDT 2019


dsanders created this revision.
dsanders added reviewers: bogner, aditya_nandakumar, volkan, aemerson, paquette, arsenm, rovka.
Herald added subscribers: Petar.Avramovic, kristof.beyls, wdng.
Herald added a project: LLVM.

This makes the copy-constructor and copy-assignment-operator non-trivial
which requires them to both be implemented. The copy-assignment-operator
is only required because of the unexpected use of some SrcOp variables when
it was only intended to be a means of factoring out the common conversions.

This is tested by D61289 <https://reviews.llvm.org/D61289> but has been pulled into a separate patch at
a reviewers request.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D61321

Files:
  llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h


Index: llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
===================================================================
--- llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
+++ llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
@@ -121,14 +121,41 @@
     MachineInstrBuilder SrcMIB;
     unsigned Reg;
     CmpInst::Predicate Pred;
+    APInt Imm;
   };
 
 public:
-  enum class SrcType { Ty_Reg, Ty_MIB, Ty_Predicate };
+  enum class SrcType { Ty_Reg, Ty_MIB, Ty_Predicate, Ty_Imm };
   SrcOp(unsigned R) : Reg(R), Ty(SrcType::Ty_Reg) {}
   SrcOp(const MachineOperand &Op) : Reg(Op.getReg()), Ty(SrcType::Ty_Reg) {}
   SrcOp(const MachineInstrBuilder &MIB) : SrcMIB(MIB), Ty(SrcType::Ty_MIB) {}
   SrcOp(const CmpInst::Predicate P) : Pred(P), Ty(SrcType::Ty_Predicate) {}
+  SrcOp(const APInt &V) : Imm(V), Ty(SrcType::Ty_Imm) {}
+  SrcOp(const SrcOp &Other) {
+    // copy-and-swap is apparently preferred but doesn't actually help me reduce
+    // the code duplication in this case as the swap ends up requiring the
+    // duplicate code instead;
+    operator=(Other);
+  }
+  ~SrcOp() {}
+  SrcOp& operator=(const SrcOp &Other) {
+    Ty = Other.Ty;
+    switch (Ty) {
+    case SrcType::Ty_Predicate:
+      Pred = Other.Pred;
+      break;
+    case SrcType::Ty_Reg:
+      Reg = Other.Reg;
+      break;
+    case SrcType::Ty_MIB:
+      SrcMIB = Other.SrcMIB;
+      break;
+    case SrcType::Ty_Imm:
+      Imm = Other.Imm;
+      break;
+    }
+    return *this;
+  }
 
   void addSrcToMIB(MachineInstrBuilder &MIB) const {
     switch (Ty) {
@@ -141,12 +168,16 @@
     case SrcType::Ty_MIB:
       MIB.addUse(SrcMIB->getOperand(0).getReg());
       break;
+    case SrcType::Ty_Imm:
+      MIB.addImm(Imm.getSExtValue());
+      break;
     }
   }
 
   LLT getLLTTy(const MachineRegisterInfo &MRI) const {
     switch (Ty) {
     case SrcType::Ty_Predicate:
+    case SrcType::Ty_Imm:
       llvm_unreachable("Not a register operand");
     case SrcType::Ty_Reg:
       return MRI.getType(Reg);
@@ -159,6 +190,7 @@
   unsigned getReg() const {
     switch (Ty) {
     case SrcType::Ty_Predicate:
+    case SrcType::Ty_Imm:
       llvm_unreachable("Not a register operand");
     case SrcType::Ty_Reg:
       return Reg;
@@ -177,6 +209,15 @@
     }
   }
 
+  APInt getImm() const {
+    switch (Ty) {
+    case SrcType::Ty_Imm:
+      return Imm;
+    default:
+      llvm_unreachable("Not an immediate");
+    }
+  }
+
   SrcType getSrcOpKind() const { return Ty; }
 
 private:


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61321.197359.patch
Type: text/x-patch
Size: 2515 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190430/008888d8/attachment.bin>


More information about the llvm-commits mailing list