Chromium Code Reviews| Index: src/IceSwitchLowering.h |
| diff --git a/src/IceSwitchLowering.h b/src/IceSwitchLowering.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7d33af02b14f86d58c6a1de68f79524db32f46d4 |
| --- /dev/null |
| +++ b/src/IceSwitchLowering.h |
| @@ -0,0 +1,75 @@ |
| +//===---- subzero/src/IceSwitchLowering.h - Switch lowering ----*- C++ -*--===// |
| +// |
| +// The LLVM Compiler Infrastructure |
| +// |
| +// This file is distributed under the University of Illinois Open Source |
| +// License. See LICENSE.TXT for details. |
| +// |
| +//===----------------------------------------------------------------------===// |
| +/// |
| +/// \file |
| +/// \brief The file contains helpers for switch lowering. |
| +//===----------------------------------------------------------------------===// |
| + |
| +#ifndef SUBZERO_SRC_ICESWITCHLOWERING_H |
| +#define SUBZERO_SRC_ICESWITCHLOWERING_H |
| + |
| +#include "IceCfgNode.h" |
| +#include "IceInst.h" |
| + |
| +namespace Ice { |
| + |
| +class CaseCluster; |
| + |
| +typedef std::vector<CaseCluster, CfgLocalAllocator<CaseCluster>> |
| + CaseClusterArray; |
| + |
| +/// A cluster of cases can be tested by a common method during switch lowering. |
| +class CaseCluster { |
| + CaseCluster() = delete; |
|
Jim Stichnoth
2015/07/17 15:33:47
Also delete default copy ctor and assignment opera
ascull
2015/07/17 18:21:29
Done.
|
| + |
| +public: |
| + enum CaseClusterKind { |
| + Range, /// Numerically adjacent case values with same target. |
| + JumpTable, /// Different targets and possibly sparse. |
| + }; |
| + |
| + /// Create a cluster of a single case represented by a unitary range. |
| + CaseCluster(uint64_t Value, CfgNode *Label) |
| + : Kind(Range), Low(Value), High(Value), Label(Label) {} |
| + /// Create a case consisting of a jump table. |
| + CaseCluster(uint64_t Low, uint64_t High, InstJumpTable *JT) |
| + : Kind(JumpTable), Low(Low), High(High), JT(JT) {} |
| + |
| + CaseClusterKind getKind() const { return Kind; } |
| + uint64_t getLow() const { return Low; } |
| + uint64_t getHigh() const { return High; } |
| + CfgNode *getLabel() const { |
| + assert(Kind == Range); |
| + return Label; |
| + } |
| + InstJumpTable *getJumpTable() const { |
| + assert(Kind == JumpTable); |
| + return JT; |
| + } |
| + |
| + /// Discover cases which can be clustered together and return the clusters |
| + /// ordered by case value. |
| + static CaseClusterArray clusterizeSwitch(Cfg *Func, const InstSwitch *Inst); |
| + |
| +private: |
| + CaseClusterKind Kind; |
| + uint64_t Low; |
| + uint64_t High; |
| + union { |
| + CfgNode *Label; /// Target for a range. |
| + InstJumpTable *JT; /// Jump table targets. |
| + }; |
| + |
| + /// Try and append a cluster returning whether or not it was successful. |
| + bool tryAppend(const CaseCluster &x); |
|
Jim Stichnoth
2015/07/17 15:33:47
change x to New, like the method definition
ascull
2015/07/17 18:21:29
Done.
|
| +}; |
| + |
| +} // end of namespace Ice |
| + |
| +#endif // SUBZERO_SRC_ICESWITCHLOWERING_H |