LLVM: lib/Target/SPIRV/SPIRVRegularizer.cpp Source File (original) (raw)
46 false)
47
48
49
50
51
52
53
54
55
56void SPIRVRegularizer::runLowerConstExpr(Function &F) {
58 std::list<Instruction *> WorkList;
60 WorkList.push_back(&II);
61
62 auto FBegin = F.begin();
63 while (!WorkList.empty()) {
64 Instruction *II = WorkList.front();
65
66 auto LowerOp = [&II, &FBegin, &F](Value *V) -> Value * {
67 if (isa(V))
68 return V;
69 auto *CE = cast(V);
70 LLVM_DEBUG(dbgs() << "[lowerConstantExpressions] " << *CE);
71 auto ReplInst = CE->getAsInstruction();
72 auto InsPoint = II->getParent() == &*FBegin ? II : &FBegin->back();
73 ReplInst->insertBefore(InsPoint->getIterator());
74 LLVM_DEBUG(dbgs() << " -> " << *ReplInst << '\n');
75 std::vector<Instruction *> Users;
76
77 for (auto U : CE->users()) {
78 LLVM_DEBUG(dbgs() << "[lowerConstantExpressions] Use: " << *U << '\n');
79 auto InstUser = dyn_cast(U);
80
81 if (InstUser && InstUser->getParent()->getParent() == &F)
82 Users.push_back(InstUser);
83 }
84 for (auto &User : Users) {
85 if (ReplInst->getParent() == User->getParent() &&
86 User->comesBefore(ReplInst))
87 ReplInst->moveBefore(User->getIterator());
88 User->replaceUsesOfWith(CE, ReplInst);
89 }
90 return ReplInst;
91 };
92
93 WorkList.pop_front();
94 auto LowerConstantVec = [&II, &LowerOp, &WorkList,
96 unsigned NumOfOp) -> Value * {
97 if (std::all_of(Vec->op_begin(), Vec->op_end(), [](Value *V) {
98 return isa(V) || isa(V);
99 })) {
100
101
102 std::list<Value *> OpList;
104 std::back_inserter(OpList),
105 [LowerOp](Value *V) { return LowerOp(V); });
106 Value *Repl = nullptr;
107 unsigned Idx = 0;
110 PhiII ? &PhiII->getIncomingBlock(NumOfOp)->back() : II;
111 std::list<Instruction *> ReplList;
112 for (auto V : OpList) {
114 ReplList.push_back(Inst);
119 }
120 WorkList.splice(WorkList.begin(), ReplList);
121 return Repl;
122 }
123 return nullptr;
124 };
125 for (unsigned OI = 0, OE = II->getNumOperands(); OI != OE; ++OI) {
126 auto *Op = II->getOperand(OI);
128 Value *ReplInst = LowerConstantVec(Vec, OI);
129 if (ReplInst)
130 II->replaceUsesOfWith(Op, ReplInst);
135 if (!ConstMD)
136 continue;
137 Constant *C = ConstMD->getValue();
138 Value *ReplInst = nullptr;
140 ReplInst = LowerConstantVec(Vec, OI);
142 ReplInst = LowerOp(CE);
143 if (!ReplInst)
144 continue;
147 II->setOperand(OI, RepMDVal);
149 }
150 }
151 }
152}
160 return new SPIRVRegularizer();
161}