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}