@@ -180,42 +180,59 @@ bool TapirToTargetImpl::processSimpleABI(Function &F, BasicBlock *TFEntry) {
180180 SmallVector<CallInst *, 8 > TaskFrameAddrCalls;
181181 SmallVector<CallInst *, 8 > TapirRTCalls;
182182 SmallVector<CallBase *, 8 > ReducerOperations;
183+ SmallVector<CallInst *, 8 > TapirFrameCalls;
184+
183185 for (BasicBlock &BB : F) {
184186 for (Instruction &I : BB) {
185- // Record calls to get Tapir-loop grainsizes.
186- if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I))
187- if (Intrinsic::tapir_loop_grainsize == II->getIntrinsicID ())
187+
188+ // Record sync instructions in this function.
189+ if (SyncInst *SI = dyn_cast<SyncInst>(&I)) {
190+ Syncs.push_back (SI);
191+ continue ;
192+ }
193+
194+ if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I)) {
195+ switch (II->getIntrinsicID ()) {
196+ case Intrinsic::tapir_loop_grainsize:
188197 GrainsizeCalls.push_back (II);
198+ break ;
189199
190- // Record calls to task_frameaddr intrinsics.
191- if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I))
192- if (Intrinsic::task_frameaddress == II->getIntrinsicID ())
200+ case Intrinsic::task_frameaddress:
193201 TaskFrameAddrCalls.push_back (II);
202+ break ;
194203
195- // Record calls to tapir_runtime_start intrinsics. We rely on analyzing
196- // uses of these intrinsic calls to find calls to tapir_runtime_end.
197- if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I))
198- if ( Intrinsic::tapir_runtime_start == II-> getIntrinsicID ())
204+ // Record calls to tapir_runtime_start intrinsics.
205+ // We rely on analyzing uses of these intrinsic calls
206+ // to find calls to tapir_runtime_end.
207+ case Intrinsic::tapir_runtime_start:
199208 TapirRTCalls.push_back (II);
200-
201- // Record sync instructions in this function.
202- if (SyncInst *SI = dyn_cast<SyncInst>(&I))
203- Syncs.push_back (SI);
204-
205- if (!dyn_cast<CallBase>(&I))
209+ break ;
210+
211+ case Intrinsic::tapir_frame:
212+ TapirFrameCalls.push_back (II);
213+ break ;
214+
215+ case Intrinsic::hyper_lookup:
216+ case Intrinsic::reducer_register:
217+ case Intrinsic::reducer_unregister:
218+ ReducerOperations.push_back (cast<CallInst>(&I));
219+ break ;
220+ }
206221 continue ;
207-
208- if (isTapirIntrinsic (Intrinsic::hyper_lookup, &I, nullptr ) ||
209- isTapirIntrinsic (Intrinsic::reducer_register, &I, nullptr ) ||
210- isTapirIntrinsic (Intrinsic::reducer_unregister, &I, nullptr ))
211- ReducerOperations.push_back (cast<CallInst>(&I));
222+ }
212223 }
213224 }
214225
215226 // Lower simple Tapir instructions in this function. Collect the set of
216227 // helper functions generated by this process.
217228 bool Changed = false ;
218229
230+ while (!TapirFrameCalls.empty ()) {
231+ CallInst *CI = TapirFrameCalls.pop_back_val ();
232+ Target->lowerFrameCall (CI, GetDT (F));
233+ Changed = true ;
234+ }
235+
219236 // Lower calls to get Tapir-loop grainsizes.
220237 while (!GrainsizeCalls.empty ()) {
221238 CallInst *GrainsizeCall = GrainsizeCalls.pop_back_val ();
0 commit comments