diff options
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/CodeGenPrepare.cpp | 17 | 
1 files changed, 14 insertions, 3 deletions
| diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index dfbfae85a86..fa5cc4dc969 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -1721,11 +1721,22 @@ bool CodeGenPrepare::optimizeCallInst(CallInst *CI, bool &ModifiedDT) {        return true;      }      case Intrinsic::launder_invariant_group: -    case Intrinsic::strip_invariant_group: -      II->replaceAllUsesWith(II->getArgOperand(0)); +    case Intrinsic::strip_invariant_group: { +      Value *ArgVal = II->getArgOperand(0); +      auto it = LargeOffsetGEPMap.find(II); +      if (it != LargeOffsetGEPMap.end()) { +          // Merge entries in LargeOffsetGEPMap to reflect the RAUW. +          // Make sure not to have to deal with iterator invalidation +          // after possibly adding ArgVal to LargeOffsetGEPMap. +          auto GEPs = std::move(it->second); +          LargeOffsetGEPMap[ArgVal].append(GEPs.begin(), GEPs.end()); +          LargeOffsetGEPMap.erase(II); +      } + +      II->replaceAllUsesWith(ArgVal);        II->eraseFromParent();        return true; - +    }      case Intrinsic::cttz:      case Intrinsic::ctlz:        // If counting zeros is expensive, try to avoid it. | 

