@@ -273,8 +273,8 @@ simplifyAMDGCNImageIntrinsic(const GCNSubtarget *ST,
273
273
274
274
// Only perform D16 folding if every user of the image sample is
275
275
// an ExtractElementInst immediately followed by an FPTrunc to half.
276
- SmallVector<ExtractElementInst *, 4 > Extracts;
277
- SmallVector<FPTruncInst *, 4 > Truncs ;
276
+ SmallVector<std::pair< ExtractElementInst *, FPTruncInst *>, 4 >
277
+ ExtractTruncPairs ;
278
278
279
279
for (User *U : II.users ()) {
280
280
auto *Ext = dyn_cast<ExtractElementInst>(U);
@@ -285,11 +285,10 @@ simplifyAMDGCNImageIntrinsic(const GCNSubtarget *ST,
285
285
if (!Tr || !Tr->getType ()->isHalfTy ())
286
286
return std::nullopt;
287
287
288
- Extracts.push_back (Ext);
289
- Truncs.push_back (Tr);
288
+ ExtractTruncPairs.emplace_back (Ext, Tr);
290
289
}
291
290
292
- if (Extracts .empty ())
291
+ if (ExtractTruncPairs .empty ())
293
292
return std::nullopt;
294
293
295
294
auto *VecTy = cast<VectorType>(II.getType ());
@@ -309,7 +308,7 @@ simplifyAMDGCNImageIntrinsic(const GCNSubtarget *ST,
309
308
II.setCalledFunction (HalfDecl);
310
309
311
310
IRBuilder<> Builder (II.getContext ());
312
- for (auto [Ext, Tr] : zip (Extracts, Truncs) ) {
311
+ for (auto & [Ext, Tr] : ExtractTruncPairs ) {
313
312
Value *Idx = Ext->getIndexOperand ();
314
313
315
314
Builder.SetInsertPoint (Tr);
@@ -320,10 +319,10 @@ simplifyAMDGCNImageIntrinsic(const GCNSubtarget *ST,
320
319
Tr->replaceAllUsesWith (HalfExtract);
321
320
}
322
321
323
- for (FPTruncInst *T : Truncs)
324
- IC.eraseInstFromFunction (*T );
325
- for (ExtractElementInst *E : Extracts)
326
- IC. eraseInstFromFunction (*E);
322
+ for (auto &[Ext, Tr] : ExtractTruncPairs) {
323
+ IC.eraseInstFromFunction (*Tr );
324
+ IC. eraseInstFromFunction (*Ext);
325
+ }
327
326
328
327
return &II;
329
328
}
0 commit comments