| Index: src/IceInst.h | 
| diff --git a/src/IceInst.h b/src/IceInst.h | 
| index 2d6d0548ef26c5d21fe1282c7dfadcf25f7d9956..72422c97b2e7af2ef2b0e8275b253888be0f35fa 100644 | 
| --- a/src/IceInst.h | 
| +++ b/src/IceInst.h | 
| @@ -59,11 +59,13 @@ public: | 
| Select, | 
| Store, | 
| Switch, | 
| -    FakeDef,  // not part of LLVM/PNaCl bitcode | 
| -    FakeUse,  // not part of LLVM/PNaCl bitcode | 
| -    FakeKill, // not part of LLVM/PNaCl bitcode | 
| -    Target    // target-specific low-level ICE | 
| -              // Anything >= Target is an InstTarget subclass. | 
| +    BundleLock,   // not part of LLVM/PNaCl bitcode | 
| +    BundleUnlock, // not part of LLVM/PNaCl bitcode | 
| +    FakeDef,      // not part of LLVM/PNaCl bitcode | 
| +    FakeUse,      // not part of LLVM/PNaCl bitcode | 
| +    FakeKill,     // not part of LLVM/PNaCl bitcode | 
| +    Target        // target-specific low-level ICE | 
| +                  // Anything >= Target is an InstTarget subclass. | 
| }; | 
| InstKind getKind() const { return Kind; } | 
|  | 
| @@ -743,6 +745,53 @@ private: | 
| ~InstUnreachable() override {} | 
| }; | 
|  | 
| +// BundleLock instruction.  There are no operands.  Contains an option | 
| +// indicating whether align_to_end is specified. | 
| +class InstBundleLock : public InstHighLevel { | 
| +  InstBundleLock(const InstBundleLock &) = delete; | 
| +  InstBundleLock &operator=(const InstBundleLock &) = delete; | 
| + | 
| +public: | 
| +  enum Option { Opt_None, Opt_AlignToEnd }; | 
| +  static InstBundleLock *create(Cfg *Func, Option BundleOption) { | 
| +    return new (Func->allocate<InstBundleLock>()) | 
| +        InstBundleLock(Func, BundleOption); | 
| +  } | 
| +  void emit(const Cfg *Func) const override; | 
| +  void emitIAS(const Cfg * /* Func */) const override {} | 
| +  void dump(const Cfg *Func) const override; | 
| +  Option getOption() const { return BundleOption; } | 
| +  static bool classof(const Inst *Inst) { | 
| +    return Inst->getKind() == BundleLock; | 
| +  } | 
| + | 
| +private: | 
| +  Option BundleOption; | 
| +  InstBundleLock(Cfg *Func, Option BundleOption); | 
| +  ~InstBundleLock() override {} | 
| +}; | 
| + | 
| +// BundleUnlock instruction.  There are no operands. | 
| +class InstBundleUnlock : public InstHighLevel { | 
| +  InstBundleUnlock(const InstBundleUnlock &) = delete; | 
| +  InstBundleUnlock &operator=(const InstBundleUnlock &) = delete; | 
| + | 
| +public: | 
| +  static InstBundleUnlock *create(Cfg *Func) { | 
| +    return new (Func->allocate<InstBundleUnlock>()) InstBundleUnlock(Func); | 
| +  } | 
| +  void emit(const Cfg *Func) const override; | 
| +  void emitIAS(const Cfg * /* Func */) const override {} | 
| +  void dump(const Cfg *Func) const override; | 
| +  static bool classof(const Inst *Inst) { | 
| +    return Inst->getKind() == BundleUnlock; | 
| +  } | 
| + | 
| +private: | 
| +  explicit InstBundleUnlock(Cfg *Func); | 
| +  ~InstBundleUnlock() override {} | 
| +}; | 
| + | 
| // FakeDef instruction.  This creates a fake definition of a variable, | 
| // which is how we represent the case when an instruction produces | 
| // multiple results.  This doesn't happen with high-level ICE | 
|  |