Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Side by Side Diff: src/IceInst.h

Issue 1897243002: Subzero. Rematerializes shufflevector instructions. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addresses comments. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceDefs.h ('k') | src/IceInst.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceInst.h - High-level instructions ----------*- C++ -*-===// 1 //===- subzero/src/IceInst.h - High-level instructions ----------*- C++ -*-===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
11 /// \brief Declares the Inst class and its target-independent subclasses. 11 /// \brief Declares the Inst class and its target-independent subclasses.
12 /// 12 ///
13 /// These represent the high-level Vanilla ICE instructions and map roughly 1:1 13 /// These represent the high-level Vanilla ICE instructions and map roughly 1:1
14 /// to LLVM instructions. 14 /// to LLVM instructions.
15 /// 15 ///
16 //===----------------------------------------------------------------------===// 16 //===----------------------------------------------------------------------===//
17 17
18 #ifndef SUBZERO_SRC_ICEINST_H 18 #ifndef SUBZERO_SRC_ICEINST_H
19 #define SUBZERO_SRC_ICEINST_H 19 #define SUBZERO_SRC_ICEINST_H
20 20
21 #include "IceCfg.h" 21 #include "IceCfg.h"
22 #include "IceDefs.h" 22 #include "IceDefs.h"
23 #include "IceInst.def" 23 #include "IceInst.def"
24 #include "IceIntrinsics.h" 24 #include "IceIntrinsics.h"
25 #include "IceOperand.h"
25 #include "IceSwitchLowering.h" 26 #include "IceSwitchLowering.h"
26 #include "IceTypes.h" 27 #include "IceTypes.h"
27 28
28 // TODO: The Cfg structure, and instructions in particular, need to be 29 // TODO: The Cfg structure, and instructions in particular, need to be
29 // validated for things like valid operand types, valid branch targets, proper 30 // validated for things like valid operand types, valid branch targets, proper
30 // ordering of Phi and non-Phi instructions, etc. Most of the validity checking 31 // ordering of Phi and non-Phi instructions, etc. Most of the validity checking
31 // will be done in the bitcode reader. We need a list of everything that should 32 // will be done in the bitcode reader. We need a list of everything that should
32 // be validated, and tests for each. 33 // be validated, and tests for each.
33 34
34 namespace Ice { 35 namespace Ice {
(...skipping 19 matching lines...) Expand all
54 Fcmp, 55 Fcmp,
55 Icmp, 56 Icmp,
56 IntrinsicCall, 57 IntrinsicCall,
57 InsertElement, 58 InsertElement,
58 Load, 59 Load,
59 Phi, 60 Phi,
60 Ret, 61 Ret,
61 Select, 62 Select,
62 Store, 63 Store,
63 Switch, 64 Switch,
64 Assign, // not part of LLVM/PNaCl bitcode 65 Assign, // not part of LLVM/PNaCl bitcode
65 Breakpoint, // not part of LLVM/PNaCl bitcode 66 Breakpoint, // not part of LLVM/PNaCl bitcode
66 BundleLock, // not part of LLVM/PNaCl bitcode 67 BundleLock, // not part of LLVM/PNaCl bitcode
67 BundleUnlock, // not part of LLVM/PNaCl bitcode 68 BundleUnlock, // not part of LLVM/PNaCl bitcode
68 FakeDef, // not part of LLVM/PNaCl bitcode 69 FakeDef, // not part of LLVM/PNaCl bitcode
69 FakeUse, // not part of LLVM/PNaCl bitcode 70 FakeUse, // not part of LLVM/PNaCl bitcode
70 FakeKill, // not part of LLVM/PNaCl bitcode 71 FakeKill, // not part of LLVM/PNaCl bitcode
71 JumpTable, // not part of LLVM/PNaCl bitcode 72 JumpTable, // not part of LLVM/PNaCl bitcode
73 ShuffleVector, // not part of LLVM/PNaCl bitcode
72 // Anything >= Target is an InstTarget subclass. Note that the value-spaces 74 // Anything >= Target is an InstTarget subclass. Note that the value-spaces
73 // are shared across targets. To avoid confusion over the definition of 75 // are shared across targets. To avoid confusion over the definition of
74 // shared values, an object specific to one target should never be passed 76 // shared values, an object specific to one target should never be passed
75 // to a different target. 77 // to a different target.
76 Target, 78 Target,
77 Target_Max = std::numeric_limits<uint8_t>::max(), 79 Target_Max = std::numeric_limits<uint8_t>::max(),
78 }; 80 };
79 static_assert(Target <= Target_Max, "Must not be above max."); 81 static_assert(Target <= Target_Max, "Must not be above max.");
80 InstKind getKind() const { return Kind; } 82 InstKind getKind() const { return Kind; }
81 virtual const char *getInstName() const; 83 virtual const char *getInstName() const;
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 return Instr->getKind() == FakeKill; 912 return Instr->getKind() == FakeKill;
911 } 913 }
912 914
913 private: 915 private:
914 InstFakeKill(Cfg *Func, const Inst *Linked); 916 InstFakeKill(Cfg *Func, const Inst *Linked);
915 917
916 /// This instruction is ignored if Linked->isDeleted() is true. 918 /// This instruction is ignored if Linked->isDeleted() is true.
917 const Inst *Linked; 919 const Inst *Linked;
918 }; 920 };
919 921
922 /// ShuffleVector instruction. This represents a shuffle operation on vector
923 /// types. This instruction is not part of the PNaCl bitcode: it is generated
924 /// by Subzero when it matches the pattern used by pnacl-clang when compiling
925 /// to bitcode.
926 class InstShuffleVector : public InstHighLevel {
927 InstShuffleVector() = delete;
928 InstShuffleVector(const InstShuffleVector &) = delete;
929 InstShuffleVector &operator=(const InstShuffleVector &) = delete;
930
931 public:
932 static InstShuffleVector *create(Cfg *Func, Variable *Dest, Variable *Src0,
933 Variable *Src1) {
934 return new (Func->allocate<InstShuffleVector>())
935 InstShuffleVector(Func, Dest, Src0, Src1);
936 }
937
938 SizeT getNumIndexes() const { return NumIndexes; }
939
940 void addIndex(ConstantInteger32 *Index) {
941 assert(CurrentIndex < NumIndexes);
942 Indexes[CurrentIndex++] = Index;
943 }
944
945 ConstantInteger32 *getIndex(SizeT Pos) const {
946 assert(Pos < NumIndexes);
947 return Indexes[Pos];
948 }
949
950 void dump(const Cfg *Func) const override;
951 static bool classof(const Inst *Instr) {
952 return Instr->getKind() == ShuffleVector;
953 }
954
955 private:
956 InstShuffleVector(Cfg *Func, Variable *Dest, Variable *Src0, Variable *Src1);
957
958 void destroy(Cfg *Func) override {
959 Func->deallocateArrayOf<ConstantInteger32 *>(Indexes);
960 Inst::destroy(Func);
961 }
962
963 ConstantInteger32 **Indexes;
964 SizeT CurrentIndex = 0;
965 const SizeT NumIndexes;
966 };
967
920 /// JumpTable instruction. This represents a jump table that will be stored in 968 /// JumpTable instruction. This represents a jump table that will be stored in
921 /// the .rodata section. This is used to track and repoint the target CfgNodes 969 /// the .rodata section. This is used to track and repoint the target CfgNodes
922 /// which may change, for example due to splitting for phi lowering. 970 /// which may change, for example due to splitting for phi lowering.
923 class InstJumpTable : public InstHighLevel { 971 class InstJumpTable : public InstHighLevel {
924 InstJumpTable() = delete; 972 InstJumpTable() = delete;
925 InstJumpTable(const InstJumpTable &) = delete; 973 InstJumpTable(const InstJumpTable &) = delete;
926 InstJumpTable &operator=(const InstJumpTable &) = delete; 974 InstJumpTable &operator=(const InstJumpTable &) = delete;
927 975
928 public: 976 public:
929 static InstJumpTable *create(Cfg *Func, SizeT NumTargets, CfgNode *Default) { 977 static InstJumpTable *create(Cfg *Func, SizeT NumTargets, CfgNode *Default) {
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 static void noteHead(Ice::Inst *, Ice::Inst *) {} 1087 static void noteHead(Ice::Inst *, Ice::Inst *) {}
1040 void deleteNode(Ice::Inst *) {} 1088 void deleteNode(Ice::Inst *) {}
1041 1089
1042 private: 1090 private:
1043 mutable ilist_half_node<Ice::Inst> Sentinel; 1091 mutable ilist_half_node<Ice::Inst> Sentinel;
1044 }; 1092 };
1045 1093
1046 } // end of namespace llvm 1094 } // end of namespace llvm
1047 1095
1048 #endif // SUBZERO_SRC_ICEINST_H 1096 #endif // SUBZERO_SRC_ICEINST_H
OLDNEW
« no previous file with comments | « src/IceDefs.h ('k') | src/IceInst.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698