diff options
| author | Chris Lattner <sabre@nondot.org> | 2012-03-13 18:07:41 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2012-03-13 18:07:41 +0000 | 
| commit | 87fa77bd8a53d338df10f37718d4e7bcc9b74550 (patch) | |
| tree | 963032b86811910018a8d9a072fee2998205d105 /llvm/lib/Transforms | |
| parent | eab06fa3c9928345615cb261a9d70e86b262fd46 (diff) | |
| download | bcm5719-llvm-87fa77bd8a53d338df10f37718d4e7bcc9b74550.tar.gz bcm5719-llvm-87fa77bd8a53d338df10f37718d4e7bcc9b74550.zip | |
enhance jump threading to preserve TBAA information when PRE'ing loads,
fixing rdar://11039258, an issue that came up when inspecting clang's 
bootstrapped codegen.
llvm-svn: 152635
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/JumpThreading.cpp | 13 | 
1 files changed, 12 insertions, 1 deletions
| diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp index 4ef5298dc0c..429b61b6e50 100644 --- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -857,6 +857,9 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst *LI) {    if (BBIt != LoadBB->begin())      return false; +  // If all of the loads and stores that feed the value have the same TBAA tag, +  // then we can propagate it onto any newly inserted loads. +  MDNode *TBAATag = LI->getMetadata(LLVMContext::MD_tbaa);     SmallPtrSet<BasicBlock*, 8> PredsScanned;    typedef SmallVector<std::pair<BasicBlock*, Value*>, 8> AvailablePredsTy; @@ -875,11 +878,16 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst *LI) {      // Scan the predecessor to see if the value is available in the pred.      BBIt = PredBB->end(); -    Value *PredAvailable = FindAvailableLoadedValue(LoadedPtr, PredBB, BBIt, 6); +    MDNode *ThisTBAATag = 0; +    Value *PredAvailable = FindAvailableLoadedValue(LoadedPtr, PredBB, BBIt, 6, +                                                    0, &ThisTBAATag);      if (!PredAvailable) {        OneUnavailablePred = PredBB;        continue;      } +     +    // If tbaa tags disagree or are not present, forget about them. +    if (TBAATag != ThisTBAATag) TBAATag = 0;      // If so, this load is partially redundant.  Remember this info so that we      // can create a PHI node. @@ -939,6 +947,9 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst *LI) {                                   LI->getAlignment(),                                   UnavailablePred->getTerminator());      NewVal->setDebugLoc(LI->getDebugLoc()); +    if (TBAATag) +      NewVal->setMetadata(LLVMContext::MD_tbaa, TBAATag); +          AvailablePreds.push_back(std::make_pair(UnavailablePred, NewVal));    } | 

