Require non-NULL register masks.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 2 Feb 2012 23:52:57 +0000 (23:52 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 2 Feb 2012 23:52:57 +0000 (23:52 +0000)
It doesn't seem worthwhile to give meaning to a NULL register mask
pointer. It complicates all the code using register mask operands.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149646 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineOperand.h
include/llvm/Target/TargetRegisterInfo.h
lib/CodeGen/DeadMachineInstructionElim.cpp
lib/CodeGen/MachineInstr.cpp
lib/CodeGen/MachineLICM.cpp
lib/Target/X86/X86ISelLowering.cpp

index 6a2e38dd84ee3b65b5943f751ffc1718bf09bdf0..59da26c71cc858e257bc4ec4a2ff7b2f9697cf87 100644 (file)
@@ -446,12 +446,11 @@ public:
     assert(isRegMask() && "Wrong MachineOperand accessor");
     // See TargetRegisterInfo.h.
     assert(PhysReg < (1u << 30) && "Not a physical register");
-    return !Contents.RegMask ||
-           !(Contents.RegMask[PhysReg / 32] & (1u << PhysReg % 32));
+    return !(Contents.RegMask[PhysReg / 32] & (1u << PhysReg % 32));
   }
 
   /// getRegMask - Returns a bit mask of registers preserved by this RegMask
-  /// operand.  A NULL pointer means that all registers are clobbered.
+  /// operand.
   const uint32_t *getRegMask() const {
     assert(isRegMask() && "Wrong MachineOperand accessor");
     return Contents.RegMask;
@@ -616,6 +615,7 @@ public:
   /// Any physreg with a 0 bit in the mask is clobbered by the instruction.
   ///
   static MachineOperand CreateRegMask(const uint32_t *Mask) {
+    assert(Mask && "Missing register mask");
     MachineOperand Op(MachineOperand::MO_RegisterMask);
     Op.Contents.RegMask = Mask;
     return Op;
index 36ac5df12019ac659e6d0a7476520d3b58d29dc4..711129f833ede4dde94b449ba5c995c8b6598219 100644 (file)
@@ -376,7 +376,10 @@ public:
   ///
   /// Bits are numbered from the LSB, so the bit for physical register Reg can
   /// be found as (Mask[Reg / 32] >> Reg % 32) & 1.
-  /// NULL pointer is equivalent to an all-zero mask.
+  ///
+  /// A NULL pointer means that no register mask will be used, and call
+  /// instructions should use implicit-def operands to indicate call clobbered
+  /// registers.
   ///
   virtual const uint32_t *getCallPreservedMask(CallingConv::ID) const {
     // The default mask clobbers everything.  All targets should override.
index aeb0b3ed0222fdc2abfd594d10d987afce817457..020b64d883cb265b55ba5c98a796aac354cd0778 100644 (file)
@@ -175,10 +175,7 @@ bool DeadMachineInstructionElim::runOnMachineFunction(MachineFunction &MF) {
           }
         } else if (MO.isRegMask()) {
           // Register mask of preserved registers. All clobbers are dead.
-          if (const uint32_t *Mask = MO.getRegMask())
-            LivePhysRegs.clearBitsNotInMask(Mask);
-          else
-            LivePhysRegs.reset();
+          LivePhysRegs.clearBitsNotInMask(MO.getRegMask());
           LivePhysRegs |= ReservedRegs;
         }
       }
index c281cd1149bb9be2de124debfcc0dcf064fa12d1..7cf282c25c28c65a3dc5e2c81057a04656e0f955 100644 (file)
@@ -327,7 +327,7 @@ void MachineOperand::print(raw_ostream &OS, const TargetMachine *TM) const {
     OS << '>';
     break;
   case MachineOperand::MO_RegisterMask:
-    OS << (getRegMask() ? "<regmask>" : "<regmask:null>");
+    OS << "<regmask>";
     break;
   case MachineOperand::MO_Metadata:
     OS << '<';
index 49a109e252c30774004caaab5488f6147f8ccf37..9b058c3416284d52efe4ba0b689063ef72bbb4d4 100644 (file)
@@ -417,10 +417,7 @@ void MachineLICM::ProcessMI(MachineInstr *MI,
     // We can't hoist an instruction defining a physreg that is clobbered in
     // the loop.
     if (MO.isRegMask()) {
-      if (const uint32_t *Mask = MO.getRegMask())
-        PhysRegClobbers.setBitsNotInMask(Mask);
-      else
-        PhysRegClobbers.set();
+      PhysRegClobbers.setBitsNotInMask(MO.getRegMask());
       continue;
     }
 
index 5d99a1c7d8ba7f2eb2d2018ab9ab20b87322cc4c..05c0ebd5ca1af90a4a3434e0ff583608e6155b33 100644 (file)
@@ -2515,8 +2515,8 @@ X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
   // registers.
   if (UseRegMask) {
     const TargetRegisterInfo *TRI = getTargetMachine().getRegisterInfo();
-    const uint32_t *Mask = TRI->getCallPreservedMask(CallConv);
-    Ops.push_back(DAG.getRegisterMask(Mask));
+    if (const uint32_t *Mask = TRI->getCallPreservedMask(CallConv))
+      Ops.push_back(DAG.getRegisterMask(Mask));
   }
 
   if (InFlag.getNode())