It's not necessary to do rounding for alloca operations when the requested
alignment is equal to the stack alignment.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40004 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/PhysRegTracker.h b/lib/CodeGen/PhysRegTracker.h
new file mode 100644
index 0000000..f5a2402
--- /dev/null
+++ b/lib/CodeGen/PhysRegTracker.h
@@ -0,0 +1,73 @@
+//===-- llvm/CodeGen/PhysRegTracker.h - Physical Register Tracker -*- C++ -*-=//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements a physical register tracker. The tracker
+// tracks physical register usage through addRegUse and
+// delRegUse. isRegAvail checks if a physical register is available or
+// not taking into consideration register aliases.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CODEGEN_PHYSREGTRACKER_H
+#define LLVM_CODEGEN_PHYSREGTRACKER_H
+
+#include "llvm/Target/MRegisterInfo.h"
+
+namespace llvm {
+
+    class PhysRegTracker {
+        const MRegisterInfo* mri_;
+        std::vector<unsigned> regUse_;
+
+    public:
+        PhysRegTracker(const MRegisterInfo& mri)
+            : mri_(&mri),
+              regUse_(mri_->getNumRegs(), 0) {
+        }
+
+        PhysRegTracker(const PhysRegTracker& rhs)
+            : mri_(rhs.mri_),
+              regUse_(rhs.regUse_) {
+        }
+
+        const PhysRegTracker& operator=(const PhysRegTracker& rhs) {
+            mri_ = rhs.mri_;
+            regUse_ = rhs.regUse_;
+            return *this;
+        }
+
+        void addRegUse(unsigned physReg) {
+            assert(MRegisterInfo::isPhysicalRegister(physReg) &&
+                   "should be physical register!");
+            ++regUse_[physReg];
+            for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as)
+                ++regUse_[*as];
+        }
+
+        void delRegUse(unsigned physReg) {
+            assert(MRegisterInfo::isPhysicalRegister(physReg) &&
+                   "should be physical register!");
+            assert(regUse_[physReg] != 0);
+            --regUse_[physReg];
+            for (const unsigned* as = mri_->getAliasSet(physReg); *as; ++as) {
+                assert(regUse_[*as] != 0);
+                --regUse_[*as];
+            }
+        }
+
+        bool isRegAvail(unsigned physReg) const {
+            assert(MRegisterInfo::isPhysicalRegister(physReg) &&
+                   "should be physical register!");
+            return regUse_[physReg] == 0;
+        }
+    };
+
+} // End llvm namespace
+
+#endif