|
29 | 29 | #include "llvm/IR/IntrinsicsAMDGPU.h" |
30 | 30 | #include "llvm/IR/PatternMatch.h" |
31 | 31 | #include "llvm/InitializePasses.h" |
| 32 | +#include "llvm/IR/ValueHandle.h" |
32 | 33 | #include "llvm/Pass.h" |
33 | 34 | #include "llvm/Support/KnownBits.h" |
34 | 35 | #include "llvm/Support/KnownFPClass.h" |
@@ -107,7 +108,7 @@ class AMDGPUCodeGenPrepareImpl |
107 | 108 | bool FlowChanged = false; |
108 | 109 | mutable Function *SqrtF32 = nullptr; |
109 | 110 | mutable Function *LdexpF32 = nullptr; |
110 | | - mutable SetVector<Value *> DeadVals; |
| 111 | + mutable SmallVector<WeakVH> DeadVals; |
111 | 112 |
|
112 | 113 | DenseMap<const PHINode *, bool> BreakPhiNodesCache; |
113 | 114 |
|
@@ -285,15 +286,14 @@ bool AMDGPUCodeGenPrepareImpl::run() { |
285 | 286 |
|
286 | 287 | for (BasicBlock &BB : reverse(F)) { |
287 | 288 | for (Instruction &I : make_early_inc_range(reverse(BB))) { |
288 | | - if (!DeadVals.contains(&I)) |
| 289 | + if (!isInstructionTriviallyDead(&I, TLI)) |
289 | 290 | MadeChange |= visit(I); |
290 | 291 | } |
291 | 292 | } |
292 | 293 |
|
293 | 294 | while (!DeadVals.empty()) { |
294 | | - RecursivelyDeleteTriviallyDeadInstructions( |
295 | | - DeadVals.pop_back_val(), TLI, /*MSSAU*/ nullptr, |
296 | | - [&](Value *V) { DeadVals.remove(V); }); |
| 295 | + if (auto *I = dyn_cast_or_null<Instruction>(DeadVals.pop_back_val())) |
| 296 | + RecursivelyDeleteTriviallyDeadInstructions(I, TLI); |
297 | 297 | } |
298 | 298 |
|
299 | 299 | return MadeChange; |
@@ -415,7 +415,7 @@ bool AMDGPUCodeGenPrepareImpl::replaceMulWithMul24(BinaryOperator &I) const { |
415 | 415 | Value *NewVal = insertValues(Builder, Ty, ResultVals); |
416 | 416 | NewVal->takeName(&I); |
417 | 417 | I.replaceAllUsesWith(NewVal); |
418 | | - DeadVals.insert(&I); |
| 418 | + DeadVals.push_back(&I); |
419 | 419 |
|
420 | 420 | return true; |
421 | 421 | } |
@@ -489,10 +489,10 @@ bool AMDGPUCodeGenPrepareImpl::foldBinOpIntoSelect(BinaryOperator &BO) const { |
489 | 489 | FoldedT, FoldedF); |
490 | 490 | NewSelect->takeName(&BO); |
491 | 491 | BO.replaceAllUsesWith(NewSelect); |
492 | | - DeadVals.insert(&BO); |
| 492 | + DeadVals.push_back(&BO); |
493 | 493 | if (CastOp) |
494 | | - DeadVals.insert(CastOp); |
495 | | - DeadVals.insert(Sel); |
| 494 | + DeadVals.push_back(CastOp); |
| 495 | + DeadVals.push_back(Sel); |
496 | 496 | return true; |
497 | 497 | } |
498 | 498 |
|
@@ -888,7 +888,7 @@ bool AMDGPUCodeGenPrepareImpl::visitFDiv(BinaryOperator &FDiv) { |
888 | 888 | if (NewVal) { |
889 | 889 | FDiv.replaceAllUsesWith(NewVal); |
890 | 890 | NewVal->takeName(&FDiv); |
891 | | - DeadVals.insert(&FDiv); |
| 891 | + DeadVals.push_back(&FDiv); |
892 | 892 | } |
893 | 893 |
|
894 | 894 | return true; |
@@ -1299,7 +1299,7 @@ static bool tryNarrowMathIfNoOverflow(Instruction *I, |
1299 | 1299 | const SITargetLowering *TLI, |
1300 | 1300 | const TargetTransformInfo &TTI, |
1301 | 1301 | const DataLayout &DL, |
1302 | | - SetVector<Value *> &DeadVals) { |
| 1302 | + SmallVector<WeakVH> &DeadVals) { |
1303 | 1303 | unsigned Opc = I->getOpcode(); |
1304 | 1304 | Type *OldType = I->getType(); |
1305 | 1305 |
|
@@ -1354,7 +1354,7 @@ static bool tryNarrowMathIfNoOverflow(Instruction *I, |
1354 | 1354 |
|
1355 | 1355 | Value *Zext = Builder.CreateZExt(Arith, OldType); |
1356 | 1356 | I->replaceAllUsesWith(Zext); |
1357 | | - DeadVals.insert(I); |
| 1357 | + DeadVals.push_back(I); |
1358 | 1358 | return true; |
1359 | 1359 | } |
1360 | 1360 |
|
@@ -1430,7 +1430,7 @@ bool AMDGPUCodeGenPrepareImpl::visitBinaryOperator(BinaryOperator &I) { |
1430 | 1430 |
|
1431 | 1431 | if (NewDiv) { |
1432 | 1432 | I.replaceAllUsesWith(NewDiv); |
1433 | | - DeadVals.insert(&I); |
| 1433 | + DeadVals.push_back(&I); |
1434 | 1434 | Changed = true; |
1435 | 1435 | } |
1436 | 1436 | } |
@@ -1486,7 +1486,7 @@ bool AMDGPUCodeGenPrepareImpl::visitLoadInst(LoadInst &I) { |
1486 | 1486 | Value *ValTrunc = Builder.CreateTrunc(WidenLoad, IntNTy); |
1487 | 1487 | Value *ValOrig = Builder.CreateBitCast(ValTrunc, I.getType()); |
1488 | 1488 | I.replaceAllUsesWith(ValOrig); |
1489 | | - DeadVals.insert(&I); |
| 1489 | + DeadVals.push_back(&I); |
1490 | 1490 | return true; |
1491 | 1491 | } |
1492 | 1492 |
|
@@ -1528,7 +1528,7 @@ bool AMDGPUCodeGenPrepareImpl::visitSelectInst(SelectInst &I) { |
1528 | 1528 |
|
1529 | 1529 | Fract->takeName(&I); |
1530 | 1530 | I.replaceAllUsesWith(Fract); |
1531 | | - DeadVals.insert(&I); |
| 1531 | + DeadVals.push_back(&I); |
1532 | 1532 | return true; |
1533 | 1533 | } |
1534 | 1534 |
|
@@ -1816,7 +1816,7 @@ bool AMDGPUCodeGenPrepareImpl::visitPHINode(PHINode &I) { |
1816 | 1816 | } |
1817 | 1817 |
|
1818 | 1818 | I.replaceAllUsesWith(Vec); |
1819 | | - DeadVals.insert(&I); |
| 1819 | + DeadVals.push_back(&I); |
1820 | 1820 | return true; |
1821 | 1821 | } |
1822 | 1822 |
|
@@ -1897,7 +1897,7 @@ bool AMDGPUCodeGenPrepareImpl::visitAddrSpaceCastInst(AddrSpaceCastInst &I) { |
1897 | 1897 | auto *Intrin = B.CreateIntrinsic( |
1898 | 1898 | I.getType(), Intrinsic::amdgcn_addrspacecast_nonnull, {I.getOperand(0)}); |
1899 | 1899 | I.replaceAllUsesWith(Intrin); |
1900 | | - DeadVals.insert(&I); |
| 1900 | + DeadVals.push_back(&I); |
1901 | 1901 | return true; |
1902 | 1902 | } |
1903 | 1903 |
|
@@ -1994,7 +1994,7 @@ bool AMDGPUCodeGenPrepareImpl::visitFMinLike(IntrinsicInst &I) { |
1994 | 1994 | Value *Fract = applyFractPat(Builder, FractArg); |
1995 | 1995 | Fract->takeName(&I); |
1996 | 1996 | I.replaceAllUsesWith(Fract); |
1997 | | - DeadVals.insert(&I); |
| 1997 | + DeadVals.push_back(&I); |
1998 | 1998 | return true; |
1999 | 1999 | } |
2000 | 2000 |
|
@@ -2041,7 +2041,7 @@ bool AMDGPUCodeGenPrepareImpl::visitSqrt(IntrinsicInst &Sqrt) { |
2041 | 2041 | Value *NewSqrt = insertValues(Builder, Sqrt.getType(), ResultVals); |
2042 | 2042 | NewSqrt->takeName(&Sqrt); |
2043 | 2043 | Sqrt.replaceAllUsesWith(NewSqrt); |
2044 | | - DeadVals.insert(&Sqrt); |
| 2044 | + DeadVals.push_back(&Sqrt); |
2045 | 2045 | return true; |
2046 | 2046 | } |
2047 | 2047 |
|
|
0 commit comments