Lines Matching refs:I

74   void processInstrAfterVisit(Instruction *I);
75 void insertAssignPtrTypeIntrs(Instruction *I);
76 void insertAssignTypeIntrs(Instruction *I);
77 void insertPtrCastInstr(Instruction *I);
88 Instruction *visitInstruction(Instruction &I) { return &I; } in visitInstruction() argument
89 Instruction *visitSwitchInst(SwitchInst &I);
90 Instruction *visitGetElementPtrInst(GetElementPtrInst &I);
91 Instruction *visitBitCastInst(BitCastInst &I);
92 Instruction *visitInsertElementInst(InsertElementInst &I);
93 Instruction *visitExtractElementInst(ExtractElementInst &I);
94 Instruction *visitInsertValueInst(InsertValueInst &I);
95 Instruction *visitExtractValueInst(ExtractValueInst &I);
96 Instruction *visitLoadInst(LoadInst &I);
97 Instruction *visitStoreInst(StoreInst &I);
98 Instruction *visitAllocaInst(AllocaInst &I);
99 Instruction *visitAtomicCmpXchgInst(AtomicCmpXchgInst &I);
100 Instruction *visitUnreachableInst(UnreachableInst &I);
110 static inline bool isAssignTypeInstr(const Instruction *I) { in isAssignTypeInstr() argument
111 return isa<IntrinsicInst>(I) && in isAssignTypeInstr()
112 cast<IntrinsicInst>(I)->getIntrinsicID() == Intrinsic::spv_assign_type; in isAssignTypeInstr()
115 static bool isMemInstrToReplace(Instruction *I) { in isMemInstrToReplace() argument
116 return isa<StoreInst>(I) || isa<LoadInst>(I) || isa<InsertValueInst>(I) || in isMemInstrToReplace()
117 isa<ExtractValueInst>(I) || isa<AtomicCmpXchgInst>(I); in isMemInstrToReplace()
125 static void setInsertPointSkippingPhis(IRBuilder<> &B, Instruction *I) { in setInsertPointSkippingPhis() argument
126 if (isa<PHINode>(I)) in setInsertPointSkippingPhis()
127 B.SetInsertPoint(I->getParent(), I->getParent()->getFirstInsertionPt()); in setInsertPointSkippingPhis()
129 B.SetInsertPoint(I); in setInsertPointSkippingPhis()
132 static bool requireAssignPtrType(Instruction *I) { in requireAssignPtrType() argument
133 if (isa<AllocaInst>(I) || isa<GetElementPtrInst>(I)) in requireAssignPtrType()
139 static bool requireAssignType(Instruction *I) { in requireAssignType() argument
140 IntrinsicInst *Intr = dyn_cast<IntrinsicInst>(I); in requireAssignType()
172 for (auto &I : instructions(F)) in preprocessUndefs() local
173 Worklist.push(&I); in preprocessUndefs()
176 Instruction *I = Worklist.front(); in preprocessUndefs() local
179 for (auto &Op : I->operands()) { in preprocessUndefs()
184 IRB->SetInsertPoint(I); in preprocessUndefs()
187 I->replaceUsesOfWith(Op, IntrUndef); in preprocessUndefs()
195 for (auto &I : instructions(F)) in preprocessCompositeConstants() local
196 Worklist.push(&I); in preprocessCompositeConstants()
199 auto *I = Worklist.front(); in preprocessCompositeConstants() local
200 assert(I); in preprocessCompositeConstants()
202 for (const auto &Op : I->operands()) { in preprocessCompositeConstants()
203 auto BuildCompositeIntrinsic = [&KeepInst, &Worklist, &I, &Op, in preprocessCompositeConstants()
206 IRB->SetInsertPoint(I); in preprocessCompositeConstants()
210 I->replaceUsesOfWith(Op, CCI); in preprocessCompositeConstants()
235 Instruction *SPIRVEmitIntrinsics::visitSwitchInst(SwitchInst &I) { in visitSwitchInst() argument
237 for (auto &Op : I.operands()) in visitSwitchInst()
240 IRB->SetInsertPoint(&I); in visitSwitchInst()
241 IRB->CreateIntrinsic(Intrinsic::spv_switch, {I.getOperand(0)->getType()}, in visitSwitchInst()
243 return &I; in visitSwitchInst()
246 Instruction *SPIRVEmitIntrinsics::visitGetElementPtrInst(GetElementPtrInst &I) { in visitGetElementPtrInst() argument
247 SmallVector<Type *, 2> Types = {I.getType(), I.getOperand(0)->getType()}; in visitGetElementPtrInst()
249 Args.push_back(IRB->getInt1(I.isInBounds())); in visitGetElementPtrInst()
250 for (auto &Op : I.operands()) in visitGetElementPtrInst()
253 I.replaceAllUsesWith(NewI); in visitGetElementPtrInst()
254 I.eraseFromParent(); in visitGetElementPtrInst()
258 Instruction *SPIRVEmitIntrinsics::visitBitCastInst(BitCastInst &I) { in visitBitCastInst() argument
259 Value *Source = I.getOperand(0); in visitBitCastInst()
265 if (I.getType()->isPointerTy()) { in visitBitCastInst()
266 I.replaceAllUsesWith(Source); in visitBitCastInst()
267 I.eraseFromParent(); in visitBitCastInst()
271 SmallVector<Type *, 2> Types = {I.getType(), Source->getType()}; in visitBitCastInst()
272 SmallVector<Value *> Args(I.op_begin(), I.op_end()); in visitBitCastInst()
274 std::string InstName = I.hasName() ? I.getName().str() : ""; in visitBitCastInst()
275 I.replaceAllUsesWith(NewI); in visitBitCastInst()
276 I.eraseFromParent(); in visitBitCastInst()
281 void SPIRVEmitIntrinsics::insertPtrCastInstr(Instruction *I) { in insertPtrCastInstr() argument
285 if (StoreInst *SI = dyn_cast<StoreInst>(I)) { in insertPtrCastInstr()
289 } else if (LoadInst *LI = dyn_cast<LoadInst>(I)) { in insertPtrCastInstr()
293 } else if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(I)) { in insertPtrCastInstr()
322 setInsertPointSkippingPhis(*IRB, I); in insertPtrCastInstr()
358 if (II->getParent() != I->getParent()) in insertPtrCastInstr()
361 I->setOperand(OperandToReplace, II); in insertPtrCastInstr()
383 I->setOperand(OperandToReplace, PtrCastI); in insertPtrCastInstr()
388 Instruction *SPIRVEmitIntrinsics::visitInsertElementInst(InsertElementInst &I) { in visitInsertElementInst() argument
389 SmallVector<Type *, 4> Types = {I.getType(), I.getOperand(0)->getType(), in visitInsertElementInst()
390 I.getOperand(1)->getType(), in visitInsertElementInst()
391 I.getOperand(2)->getType()}; in visitInsertElementInst()
392 SmallVector<Value *> Args(I.op_begin(), I.op_end()); in visitInsertElementInst()
394 std::string InstName = I.hasName() ? I.getName().str() : ""; in visitInsertElementInst()
395 I.replaceAllUsesWith(NewI); in visitInsertElementInst()
396 I.eraseFromParent(); in visitInsertElementInst()
402 SPIRVEmitIntrinsics::visitExtractElementInst(ExtractElementInst &I) { in visitExtractElementInst() argument
403 SmallVector<Type *, 3> Types = {I.getType(), I.getVectorOperandType(), in visitExtractElementInst()
404 I.getIndexOperand()->getType()}; in visitExtractElementInst()
405 SmallVector<Value *, 2> Args = {I.getVectorOperand(), I.getIndexOperand()}; in visitExtractElementInst()
407 std::string InstName = I.hasName() ? I.getName().str() : ""; in visitExtractElementInst()
408 I.replaceAllUsesWith(NewI); in visitExtractElementInst()
409 I.eraseFromParent(); in visitExtractElementInst()
414 Instruction *SPIRVEmitIntrinsics::visitInsertValueInst(InsertValueInst &I) { in visitInsertValueInst() argument
415 SmallVector<Type *, 1> Types = {I.getInsertedValueOperand()->getType()}; in visitInsertValueInst()
417 for (auto &Op : I.operands()) in visitInsertValueInst()
422 for (auto &Op : I.indices()) in visitInsertValueInst()
426 replaceMemInstrUses(&I, NewI); in visitInsertValueInst()
430 Instruction *SPIRVEmitIntrinsics::visitExtractValueInst(ExtractValueInst &I) { in visitExtractValueInst() argument
432 for (auto &Op : I.operands()) in visitExtractValueInst()
434 for (auto &Op : I.indices()) in visitExtractValueInst()
437 IRB->CreateIntrinsic(Intrinsic::spv_extractv, {I.getType()}, {Args}); in visitExtractValueInst()
438 I.replaceAllUsesWith(NewI); in visitExtractValueInst()
439 I.eraseFromParent(); in visitExtractValueInst()
443 Instruction *SPIRVEmitIntrinsics::visitLoadInst(LoadInst &I) { in visitLoadInst() argument
444 if (!I.getType()->isAggregateType()) in visitLoadInst()
445 return &I; in visitLoadInst()
449 TLI->getLoadMemOperandFlags(I, F->getParent()->getDataLayout()); in visitLoadInst()
451 IRB->CreateIntrinsic(Intrinsic::spv_load, {I.getOperand(0)->getType()}, in visitLoadInst()
452 {I.getPointerOperand(), IRB->getInt16(Flags), in visitLoadInst()
453 IRB->getInt8(I.getAlign().value())}); in visitLoadInst()
454 replaceMemInstrUses(&I, NewI); in visitLoadInst()
458 Instruction *SPIRVEmitIntrinsics::visitStoreInst(StoreInst &I) { in visitStoreInst() argument
459 if (!AggrStores.contains(&I)) in visitStoreInst()
460 return &I; in visitStoreInst()
464 TLI->getStoreMemOperandFlags(I, F->getParent()->getDataLayout()); in visitStoreInst()
465 auto *PtrOp = I.getPointerOperand(); in visitStoreInst()
467 Intrinsic::spv_store, {I.getValueOperand()->getType(), PtrOp->getType()}, in visitStoreInst()
468 {I.getValueOperand(), PtrOp, IRB->getInt16(Flags), in visitStoreInst()
469 IRB->getInt8(I.getAlign().value())}); in visitStoreInst()
470 I.eraseFromParent(); in visitStoreInst()
474 Instruction *SPIRVEmitIntrinsics::visitAllocaInst(AllocaInst &I) { in visitAllocaInst() argument
476 Type *PtrTy = I.getType(); in visitAllocaInst()
478 std::string InstName = I.hasName() ? I.getName().str() : ""; in visitAllocaInst()
479 I.replaceAllUsesWith(NewI); in visitAllocaInst()
480 I.eraseFromParent(); in visitAllocaInst()
485 Instruction *SPIRVEmitIntrinsics::visitAtomicCmpXchgInst(AtomicCmpXchgInst &I) { in visitAtomicCmpXchgInst() argument
486 assert(I.getType()->isAggregateType() && "Aggregate result is expected"); in visitAtomicCmpXchgInst()
488 for (auto &Op : I.operands()) in visitAtomicCmpXchgInst()
490 Args.push_back(IRB->getInt32(I.getSyncScopeID())); in visitAtomicCmpXchgInst()
492 static_cast<uint32_t>(getMemSemantics(I.getSuccessOrdering())))); in visitAtomicCmpXchgInst()
494 static_cast<uint32_t>(getMemSemantics(I.getFailureOrdering())))); in visitAtomicCmpXchgInst()
496 {I.getPointerOperand()->getType()}, {Args}); in visitAtomicCmpXchgInst()
497 replaceMemInstrUses(&I, NewI); in visitAtomicCmpXchgInst()
501 Instruction *SPIRVEmitIntrinsics::visitUnreachableInst(UnreachableInst &I) { in visitUnreachableInst() argument
502 IRB->SetInsertPoint(&I); in visitUnreachableInst()
504 return &I; in visitUnreachableInst()
524 void SPIRVEmitIntrinsics::insertAssignPtrTypeIntrs(Instruction *I) { in insertAssignPtrTypeIntrs() argument
525 if (I->getType()->isVoidTy() || !requireAssignPtrType(I)) in insertAssignPtrTypeIntrs()
528 setInsertPointSkippingPhis(*IRB, I->getNextNode()); in insertAssignPtrTypeIntrs()
532 if (auto *AI = dyn_cast<AllocaInst>(I)) { in insertAssignPtrTypeIntrs()
535 } else if (auto *GEP = dyn_cast<GetElementPtrInst>(I)) { in insertAssignPtrTypeIntrs()
542 buildIntrWithMD(Intrinsic::spv_assign_ptr_type, {I->getType()}, EltTyConst, I, in insertAssignPtrTypeIntrs()
546 void SPIRVEmitIntrinsics::insertAssignTypeIntrs(Instruction *I) { in insertAssignTypeIntrs() argument
547 Type *Ty = I->getType(); in insertAssignTypeIntrs()
548 if (!Ty->isVoidTy() && requireAssignType(I) && !requireAssignPtrType(I)) { in insertAssignTypeIntrs()
549 setInsertPointSkippingPhis(*IRB, I->getNextNode()); in insertAssignTypeIntrs()
551 if (auto *II = dyn_cast<IntrinsicInst>(I)) { in insertAssignTypeIntrs()
560 buildIntrWithMD(Intrinsic::spv_assign_type, {Ty}, Const, I, {}); in insertAssignTypeIntrs()
562 for (const auto &Op : I->operands()) { in insertAssignTypeIntrs()
566 setInsertPointSkippingPhis(*IRB, I); in insertAssignTypeIntrs()
577 void SPIRVEmitIntrinsics::processInstrAfterVisit(Instruction *I) { in processInstrAfterVisit() argument
578 auto *II = dyn_cast<IntrinsicInst>(I); in processInstrAfterVisit()
581 IRB->SetInsertPoint(I->getNextNode()); in processInstrAfterVisit()
583 auto t = AggrConsts.find(I); in processInstrAfterVisit()
586 t->second, I, {}); in processInstrAfterVisit()
587 I->replaceAllUsesWith(NewOp); in processInstrAfterVisit()
588 NewOp->setArgOperand(0, I); in processInstrAfterVisit()
590 for (const auto &Op : I->operands()) { in processInstrAfterVisit()
592 isa<PHINode>(I) || isa<SwitchInst>(I)) in processInstrAfterVisit()
599 IRB->SetInsertPoint(I); in processInstrAfterVisit()
602 I->setOperand(OpNo, NewOp); in processInstrAfterVisit()
605 if (I->hasName()) { in processInstrAfterVisit()
606 setInsertPointSkippingPhis(*IRB, I->getNextNode()); in processInstrAfterVisit()
607 std::vector<Value *> Args = {I}; in processInstrAfterVisit()
608 addStringImm(I->getName(), *IRB, Args); in processInstrAfterVisit()
609 IRB->CreateIntrinsic(Intrinsic::spv_assign_name, {I->getType()}, Args); in processInstrAfterVisit()
623 for (auto &I : instructions(Func)) { in runOnFunction() local
624 StoreInst *SI = dyn_cast<StoreInst>(&I); in runOnFunction()
629 AggrStores.insert(&I); in runOnFunction()
639 for (auto &I : instructions(Func)) in runOnFunction() local
640 Worklist.push_back(&I); in runOnFunction()
642 for (auto &I : Worklist) { in runOnFunction() local
643 insertAssignPtrTypeIntrs(I); in runOnFunction()
644 insertAssignTypeIntrs(I); in runOnFunction()
645 insertPtrCastInstr(I); in runOnFunction()
648 for (auto *I : Worklist) { in runOnFunction() local
650 if (!I->getType()->isVoidTy() || isa<StoreInst>(I)) in runOnFunction()
651 IRB->SetInsertPoint(I->getNextNode()); in runOnFunction()
654 I = visit(*I); in runOnFunction()
655 if (!I) in runOnFunction()
657 processInstrAfterVisit(I); in runOnFunction()