<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Thanks Hal.<div class=""><br class=""></div><div class="">—Juergen</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Oct 28, 2015, at 3:18 PM, Hal Finkel <<a href="mailto:hfinkel@anl.gov" class="">hfinkel@anl.gov</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">----- Original Message -----</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">From: "Juergen Ributzka" <<a href="mailto:juergen@apple.com" class="">juergen@apple.com</a>><br class="">To: "Hal Finkel" <<a href="mailto:hfinkel@anl.gov" class="">hfinkel@anl.gov</a>><br class="">Cc: <a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">Sent: Wednesday, October 28, 2015 4:56:59 PM<br class="">Subject: Re: [llvm] r251451 - [AliasSetTracker] Use mod/ref information for UnknownInstr<br class=""><br class="">Hi Hal,<br class=""><br class=""><br class="">looks like this change broke the stage2 compiler:<br class=""><a href="http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto/6989/" class="">http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto/6989/</a><br class=""><br class=""><br class="">Could you please revert the patch?<br class=""><br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Reverted in r251562.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">-Hal</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="">Thanks<br class=""><br class=""><br class="">Cheers,<br class="">Juergen<br class=""><br class=""><br class=""><br class=""><br class=""><br class=""><br class=""><br class="">On Oct 27, 2015, at 1:37 PM, Hal Finkel via llvm-commits <<br class=""><a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a> > wrote:<br class=""><br class=""><br class="">Author: hfinkel<br class="">Date: Tue Oct 27 15:37:04 2015<br class="">New Revision: 251451<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=251451&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=251451&view=rev</a><br class="">Log:<br class="">[AliasSetTracker] Use mod/ref information for UnknownInstr<br class=""><br class="">AliasSetTracker does not need to convert the access mode to<br class="">ModRefAccess if the<br class="">new visited UnknownInst has only 'REF' modrefinfo to existing<br class="">pointers in the<br class="">sets.<br class=""><br class="">Patch by Andrew Zhogin!<br class=""><br class="">Added:<br class="">llvm/trunk/test/Transforms/LICM/licm_call_referenced_ptr.ll<br class="">Modified:<br class="">llvm/trunk/include/llvm/Analysis/AliasSetTracker.h<br class="">llvm/trunk/lib/Analysis/AliasSetTracker.cpp<br class=""><br class="">Modified: llvm/trunk/include/llvm/Analysis/AliasSetTracker.h<br class="">URL:<br class=""><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasSetTracker.h?rev=251451&r1=251450&r2=251451&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasSetTracker.h?rev=251451&r1=251450&r2=251451&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/Analysis/AliasSetTracker.h (original)<br class="">+++ llvm/trunk/include/llvm/Analysis/AliasSetTracker.h Tue Oct 27<br class="">15:37:04 2015<br class="">@@ -124,12 +124,7 @@ class AliasSet : public ilist_node<Alias<br class="">/// memory (and not any particular access), whether it modifies or<br class="">references<br class="">/// the memory, or whether it does both. The lattice goes from<br class="">"NoAccess" to<br class="">/// either RefAccess or ModAccess, then to ModRefAccess as necessary.<br class="">- enum AccessLattice {<br class="">- NoAccess = 0,<br class="">- RefAccess = 1,<br class="">- ModAccess = 2,<br class="">- ModRefAccess = RefAccess | ModAccess<br class="">- };<br class="">+ typedef ModRefInfo AccessLattice;<br class="">unsigned Access : 2;<br class=""><br class="">/// The kind of alias relationship between pointers of the set.<br class="">@@ -160,8 +155,8 @@ class AliasSet : public ilist_node<Alias<br class=""><br class="">public:<br class="">/// Accessors...<br class="">- bool isRef() const { return Access & RefAccess; }<br class="">- bool isMod() const { return Access & ModAccess; }<br class="">+ bool isRef() const { return Access & MRI_Ref; }<br class="">+ bool isMod() const { return Access & MRI_Mod; }<br class="">bool isMustAlias() const { return Alias == SetMustAlias; }<br class="">bool isMayAlias() const { return Alias == SetMayAlias; }<br class=""><br class="">@@ -226,7 +221,7 @@ private:<br class="">friend struct ilist_sentinel_traits<AliasSet>;<br class="">AliasSet()<br class="">: PtrList(nullptr), PtrListEnd(&PtrList), Forward(nullptr),<br class="">RefCount(0),<br class="">- Access(NoAccess), Alias(SetMustAlias), Volatile(false) {<br class="">+ Access(MRI_NoModRef), Alias(SetMustAlias), Volatile(false) {<br class="">}<br class=""><br class="">AliasSet(const AliasSet &AS) = delete;<br class="">@@ -254,9 +249,9 @@ private:<br class="">void removeFromTracker(AliasSetTracker &AST);<br class=""><br class="">void addPointer(AliasSetTracker &AST, PointerRec &Entry, uint64_t<br class="">Size,<br class="">- const AAMDNodes &AAInfo,<br class="">+ const AAMDNodes &AAInfo, ModRefInfo MR,<br class="">bool KnownMustAlias = false);<br class="">- void addUnknownInst(Instruction *I, AliasAnalysis &AA);<br class="">+ void addUnknownInst(Instruction *I, AliasAnalysis &AA, ModRefInfo<br class="">MR);<br class="">void removeUnknownInst(AliasSetTracker &AST, Instruction *I) {<br class="">bool WasEmpty = UnknownInsts.empty();<br class="">for (size_t i = 0, e = UnknownInsts.size(); i != e; ++i)<br class="">@@ -273,10 +268,18 @@ private:<br class="">public:<br class="">/// aliasesPointer - Return true if the specified pointer "may" (or<br class="">must)<br class="">/// alias one of the members in the set.<br class="">- ///<br class="">+ /// MRcommon - if Ptr is aliased by existing UnknownInsts,<br class="">+ /// then not-null MRcommon will be set to the worst ModRefInfo met<br class="">+ ///<br class="">bool aliasesPointer(const Value *Ptr, uint64_t Size, const AAMDNodes<br class="">&AAInfo,<br class="">- AliasAnalysis &AA) const;<br class="">- bool aliasesUnknownInst(const Instruction *Inst, AliasAnalysis &AA)<br class="">const;<br class="">+ AliasAnalysis &AA, ModRefInfo* MRcommon = nullptr) const;<br class="">+ /// aliasesUnknownInst - Return true if the specified UnknownInst<br class="">+ /// has not-null ModRefInfo (not MRI_NoModRef) with some<br class="">+ /// pointer or UnknownInst already existing in AliasSet<br class="">+ /// MRcommon - not-null MRcommon will be set to the worst<br class="">ModRefInfo met<br class="">+ ///<br class="">+ bool aliasesUnknownInst(const Instruction *Inst, AliasAnalysis &AA,<br class="">+ ModRefInfo* MRcommon = nullptr) const;<br class="">};<br class=""><br class="">inline raw_ostream& operator<<(raw_ostream &OS, const AliasSet &AS) {<br class="">@@ -434,9 +437,11 @@ private:<br class="">return AS;<br class="">}<br class="">AliasSet *findAliasSetForPointer(const Value *Ptr, uint64_t Size,<br class="">- const AAMDNodes &AAInfo);<br class="">+ const AAMDNodes &AAInfo,<br class="">+ ModRefInfo* MRcommonPtr = nullptr);<br class=""><br class="">- AliasSet *findAliasSetForUnknownInst(Instruction *Inst);<br class="">+ AliasSet *findAliasSetForUnknownInst(Instruction *Inst,<br class="">+ ModRefInfo* MRcommonPtr = nullptr);<br class="">};<br class=""><br class="">inline raw_ostream& operator<<(raw_ostream &OS, const AliasSetTracker<br class="">&AST) {<br class=""><br class="">Modified: llvm/trunk/lib/Analysis/AliasSetTracker.cpp<br class="">URL:<br class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasSetTracker.cpp?rev=251451&r1=251450&r2=251451&view=diff<br class="">==============================================================================<br class="">--- llvm/trunk/lib/Analysis/AliasSetTracker.cpp (original)<br class="">+++ llvm/trunk/lib/Analysis/AliasSetTracker.cpp Tue Oct 27 15:37:04<br class="">2015<br class="">@@ -95,7 +95,7 @@ void AliasSet::removeFromTracker(AliasSe<br class=""><br class="">void AliasSet::addPointer(AliasSetTracker &AST, PointerRec &Entry,<br class="">uint64_t Size, const AAMDNodes &AAInfo,<br class="">- bool KnownMustAlias) {<br class="">+ ModRefInfo MR, bool KnownMustAlias) {<br class="">assert(!Entry.hasAliasSet() && "Entry already in set!");<br class=""><br class="">// Check to see if we have to downgrade to _may_ alias.<br class="">@@ -112,6 +112,9 @@ void AliasSet::addPointer(AliasSetTracke<br class="">assert(Result != NoAlias && "Cannot be part of must set!");<br class="">}<br class=""><br class="">+ // upgrading access if existing UnknownInst has ModRef with new<br class="">pointer<br class="">+ Access |= MR;<br class="">+<br class="">Entry.setAliasSet(this);<br class="">Entry.updateSizeAndAAInfo(Size, AAInfo);<br class=""><br class="">@@ -123,20 +126,34 @@ void AliasSet::addPointer(AliasSetTracke<br class="">addRef(); // Entry points to alias set.<br class="">}<br class=""><br class="">-void AliasSet::addUnknownInst(Instruction *I, AliasAnalysis &AA) {<br class="">+void AliasSet::addUnknownInst(Instruction *I, AliasAnalysis &AA,<br class="">+ ModRefInfo MR) {<br class="">if (UnknownInsts.empty())<br class="">addRef();<br class="">UnknownInsts.emplace_back(I);<br class=""><br class="">if (!I->mayWriteToMemory()) {<br class="">Alias = SetMayAlias;<br class="">- Access |= RefAccess;<br class="">+ Access |= MRI_Ref;<br class="">return;<br class="">}<br class=""><br class="">- // FIXME: This should use mod/ref information to make this not suck<br class="">so bad<br class="">Alias = SetMayAlias;<br class="">- Access = ModRefAccess;<br class="">+ Access |= MR;<br class="">+}<br class="">+<br class="">+namespace {<br class="">+ /// returns true if there is no request of worst ModRefInfo<br class="">+ /// (MRcommonPtr is null)<br class="">+ /// or when achieved maximum ModRefInfo (MRI_ModRef).<br class="">+ bool processMR(ModRefInfo MR, ModRefInfo* MRcommonPtr, ModRefInfo&<br class="">MRcommon) {<br class="">+ MRcommon = ModRefInfo(MRcommon | MR);<br class="">+ return !MRcommonPtr || (MRcommon == MRI_ModRef);<br class="">+ }<br class="">+ bool fillExitMR(ModRefInfo* MRcommonPtr, ModRefInfo& MRcommon) {<br class="">+ if (MRcommonPtr) *MRcommonPtr = MRcommon;<br class="">+ return MRcommon != MRI_NoModRef;<br class="">+ }<br class="">}<br class=""><br class="">/// aliasesPointer - Return true if the specified pointer "may" (or<br class="">must)<br class="">@@ -144,7 +161,8 @@ void AliasSet::addUnknownInst(Instructio<br class="">///<br class="">bool AliasSet::aliasesPointer(const Value *Ptr, uint64_t Size,<br class="">const AAMDNodes &AAInfo,<br class="">- AliasAnalysis &AA) const {<br class="">+ AliasAnalysis &AA,<br class="">+ ModRefInfo* MRcommonPtr) const {<br class="">if (Alias == SetMustAlias) {<br class="">assert(UnknownInsts.empty() && "Illegal must alias set!");<br class=""><br class="">@@ -164,35 +182,44 @@ bool AliasSet::aliasesPointer(const Valu<br class="">MemoryLocation(I.getPointer(), I.getSize(), I.getAAInfo())))<br class="">return true;<br class=""><br class="">+ // to gather worst ModRefInfo<br class="">+ ModRefInfo MRcommon = MRI_NoModRef;<br class="">+<br class="">// Check the unknown instructions...<br class="">if (!UnknownInsts.empty()) {<br class="">for (unsigned i = 0, e = UnknownInsts.size(); i != e; ++i)<br class="">- if (AA.getModRefInfo(UnknownInsts[i],<br class="">- MemoryLocation(Ptr, Size, AAInfo)) != MRI_NoModRef)<br class="">- return true;<br class="">+ if (processMR(AA.getModRefInfo(UnknownInsts[i],<br class="">+ MemoryLocation(Ptr, Size, AAInfo)), MRcommonPtr, MRcommon))<br class="">+ return fillExitMR(MRcommonPtr, MRcommon);<br class="">}<br class=""><br class="">- return false;<br class="">+ return fillExitMR(MRcommonPtr, MRcommon);<br class="">}<br class=""><br class="">bool AliasSet::aliasesUnknownInst(const Instruction *Inst,<br class="">- AliasAnalysis &AA) const {<br class="">+ AliasAnalysis &AA,<br class="">+ ModRefInfo* MRcommonPtr) const {<br class="">if (!Inst->mayReadOrWriteMemory())<br class="">return false;<br class=""><br class="">+ // to gather worst ModRefInfo<br class="">+ ModRefInfo MRcommon = MRI_NoModRef;<br class="">+<br class="">for (unsigned i = 0, e = UnknownInsts.size(); i != e; ++i) {<br class="">ImmutableCallSite C1(getUnknownInst(i)), C2(Inst);<br class="">- if (!C1 || !C2 || AA.getModRefInfo(C1, C2) != MRI_NoModRef ||<br class="">- AA.getModRefInfo(C2, C1) != MRI_NoModRef)<br class="">- return true;<br class="">+ if (!C1 || !C2 ||<br class="">+ processMR(AA.getModRefInfo(C1, C2), MRcommonPtr, MRcommon) ||<br class="">+ processMR(AA.getModRefInfo(C2, C1), MRcommonPtr, MRcommon))<br class="">+ return fillExitMR(MRcommonPtr, MRcommon);<br class="">}<br class=""><br class="">- for (iterator I = begin(), E = end(); I != E; ++I)<br class="">- if (AA.getModRefInfo(Inst, MemoryLocation(I.getPointer(),<br class="">I.getSize(),<br class="">- I.getAAInfo())) != MRI_NoModRef)<br class="">- return true;<br class="">-<br class="">- return false;<br class="">+ for (iterator I = begin(), E = end(); I != E; ++I) {<br class="">+ ModRefInfo MR = AA.getModRefInfo(<br class="">+ Inst, MemoryLocation(I.getPointer(), I.getSize(), I.getAAInfo()));<br class="">+ if (processMR(MR, MRcommonPtr, MRcommon))<br class="">+ return fillExitMR(MRcommonPtr, MRcommon);<br class="">+ }<br class="">+ return fillExitMR(MRcommonPtr, MRcommon);<br class="">}<br class=""><br class="">void AliasSetTracker::clear() {<br class="">@@ -214,11 +241,15 @@ void AliasSetTracker::clear() {<br class="">///<br class="">AliasSet *AliasSetTracker::findAliasSetForPointer(const Value *Ptr,<br class="">uint64_t Size,<br class="">- const AAMDNodes &AAInfo) {<br class="">+ const AAMDNodes &AAInfo,<br class="">+ ModRefInfo* MRcommonPtr) {<br class="">AliasSet *FoundSet = nullptr;<br class="">for (iterator I = begin(), E = end(); I != E;) {<br class="">iterator Cur = I++;<br class="">- if (Cur->Forward || !Cur->aliasesPointer(Ptr, Size, AAInfo, AA))<br class="">continue;<br class="">+ ModRefInfo MR = MRI_NoModRef;<br class="">+ if (Cur->Forward || !Cur->aliasesPointer(Ptr, Size, AAInfo, AA,<br class="">&MR))<br class="">+ continue;<br class="">+ *MRcommonPtr = ModRefInfo(*MRcommonPtr | MR);<br class=""><br class="">if (!FoundSet) { // If this is the first alias set ptr can go into.<br class="">FoundSet = &*Cur; // Remember it.<br class="">@@ -248,12 +279,15 @@ bool AliasSetTracker::containsUnknown(co<br class="">return false;<br class="">}<br class=""><br class="">-AliasSet *AliasSetTracker::findAliasSetForUnknownInst(Instruction<br class="">*Inst) {<br class="">+AliasSet *AliasSetTracker::findAliasSetForUnknownInst(Instruction<br class="">*Inst,<br class="">+ ModRefInfo* MRcommonPtr) {<br class="">AliasSet *FoundSet = nullptr;<br class="">for (iterator I = begin(), E = end(); I != E;) {<br class="">iterator Cur = I++;<br class="">- if (Cur->Forward || !Cur->aliasesUnknownInst(Inst, AA))<br class="">+ ModRefInfo MR = MRI_NoModRef;<br class="">+ if (Cur->Forward || !Cur->aliasesUnknownInst(Inst, AA, &MR))<br class="">continue;<br class="">+ *MRcommonPtr = ModRefInfo(*MRcommonPtr | MR);<br class="">if (!FoundSet) // If this is the first alias set ptr can go into.<br class="">FoundSet = &*Cur; // Remember it.<br class="">else if (!Cur->Forward) // Otherwise, we must merge the sets.<br class="">@@ -279,22 +313,23 @@ AliasSet &AliasSetTracker::getAliasSetFo<br class="">return *Entry.getAliasSet(*this)->getForwardedTarget(*this);<br class="">}<br class=""><br class="">- if (AliasSet *AS = findAliasSetForPointer(Pointer, Size, AAInfo)) {<br class="">+ ModRefInfo MR = MRI_NoModRef;<br class="">+ if (AliasSet *AS = findAliasSetForPointer(Pointer, Size, AAInfo,<br class="">&MR)) {<br class="">// Add it to the alias set it aliases.<br class="">- AS->addPointer(*this, Entry, Size, AAInfo);<br class="">+ AS->addPointer(*this, Entry, Size, AAInfo, MR);<br class="">return *AS;<br class="">}<br class=""><br class="">if (New) *New = true;<br class="">// Otherwise create a new alias set to hold the loaded pointer.<br class="">AliasSets.push_back(new AliasSet());<br class="">- AliasSets.back().addPointer(*this, Entry, Size, AAInfo);<br class="">+ AliasSets.back().addPointer(*this, Entry, Size, AAInfo,<br class="">MRI_NoModRef);<br class="">return AliasSets.back();<br class="">}<br class=""><br class="">bool AliasSetTracker::add(Value *Ptr, uint64_t Size, const AAMDNodes<br class="">&AAInfo) {<br class="">bool NewPtr;<br class="">- addPointer(Ptr, Size, AAInfo, AliasSet::NoAccess, NewPtr);<br class="">+ addPointer(Ptr, Size, AAInfo, MRI_NoModRef, NewPtr);<br class="">return NewPtr;<br class="">}<br class=""><br class="">@@ -305,7 +340,7 @@ bool AliasSetTracker::add(LoadInst *LI)<br class="">AAMDNodes AAInfo;<br class="">LI->getAAMetadata(AAInfo);<br class=""><br class="">- AliasSet::AccessLattice Access = AliasSet::RefAccess;<br class="">+ AliasSet::AccessLattice Access = MRI_Ref;<br class="">bool NewPtr;<br class="">const DataLayout &DL = LI->getModule()->getDataLayout();<br class="">AliasSet &AS = addPointer(LI->getOperand(0),<br class="">@@ -321,7 +356,7 @@ bool AliasSetTracker::add(StoreInst *SI)<br class="">AAMDNodes AAInfo;<br class="">SI->getAAMetadata(AAInfo);<br class=""><br class="">- AliasSet::AccessLattice Access = AliasSet::ModAccess;<br class="">+ AliasSet::AccessLattice Access = MRI_Mod;<br class="">bool NewPtr;<br class="">const DataLayout &DL = SI->getModule()->getDataLayout();<br class="">Value *Val = SI->getOperand(0);<br class="">@@ -338,7 +373,7 @@ bool AliasSetTracker::add(VAArgInst *VAA<br class=""><br class="">bool NewPtr;<br class="">addPointer(VAAI->getOperand(0), MemoryLocation::UnknownSize, AAInfo,<br class="">- AliasSet::ModRefAccess, NewPtr);<br class="">+ MRI_ModRef, NewPtr);<br class="">return NewPtr;<br class="">}<br class=""><br class="">@@ -349,14 +384,15 @@ bool AliasSetTracker::addUnknown(Instruc<br class="">if (!Inst->mayReadOrWriteMemory())<br class="">return true; // doesn't alias anything<br class=""><br class="">- AliasSet *AS = findAliasSetForUnknownInst(Inst);<br class="">+ ModRefInfo MR = MRI_NoModRef;<br class="">+ AliasSet *AS = findAliasSetForUnknownInst(Inst, &MR);<br class="">if (AS) {<br class="">- AS->addUnknownInst(Inst, AA);<br class="">+ AS->addUnknownInst(Inst, AA, MR);<br class="">return false;<br class="">}<br class="">AliasSets.push_back(new AliasSet());<br class="">AS = &AliasSets.back();<br class="">- AS->addUnknownInst(Inst, AA);<br class="">+ AS->addUnknownInst(Inst, AA, MR);<br class="">return true;<br class="">}<br class=""><br class="">@@ -556,7 +592,7 @@ void AliasSetTracker::copyValue(Value *F<br class="">I = PointerMap.find_as(From);<br class="">AliasSet *AS = I->second->getAliasSet(*this);<br class="">AS->addPointer(*this, Entry, I->second->getSize(),<br class="">- I->second->getAAInfo(),<br class="">+ I->second->getAAInfo(), MRI_NoModRef,<br class="">true);<br class="">}<br class=""><br class="">@@ -570,10 +606,10 @@ void AliasSet::print(raw_ostream &OS) co<br class="">OS << " AliasSet[" << (const void*)this << ", " << RefCount << "] ";<br class="">OS << (Alias == SetMustAlias ? "must" : "may") << " alias, ";<br class="">switch (Access) {<br class="">- case NoAccess: OS << "No access "; break;<br class="">- case RefAccess: OS << "Ref "; break;<br class="">- case ModAccess: OS << "Mod "; break;<br class="">- case ModRefAccess: OS << "Mod/Ref "; break;<br class="">+ case MRI_NoModRef: OS << "No access "; break;<br class="">+ case MRI_Ref: OS << "Ref "; break;<br class="">+ case MRI_Mod: OS << "Mod "; break;<br class="">+ case MRI_ModRef: OS << "Mod/Ref "; break;<br class="">default: llvm_unreachable("Bad value for Access!");<br class="">}<br class="">if (isVolatile()) OS << "[volatile] ";<br class=""><br class="">Added: llvm/trunk/test/Transforms/LICM/licm_call_referenced_ptr.ll<br class="">URL:<br class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LICM/licm_call_referenced_ptr.ll?rev=251451&view=auto<br class="">==============================================================================<br class="">--- llvm/trunk/test/Transforms/LICM/licm_call_referenced_ptr.ll<br class="">(added)<br class="">+++ llvm/trunk/test/Transforms/LICM/licm_call_referenced_ptr.ll Tue<br class="">Oct 27 15:37:04 2015<br class="">@@ -0,0 +1,40 @@<br class="">+; RUN: opt < %s -basicaa -licm -S | FileCheck %s<br class="">+<br class="">+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8*<br class="">nocapture, i64, i32, i1) nounwind<br class="">+<br class="">+define i8 @"main"() {<br class="">+entry:<br class="">+ %A = alloca [64 x i8]<br class="">+ %B = alloca [4 x i8]<br class="">+ %A0 = getelementptr [64 x i8], [64 x i8]* %A, i32 0, i32 0<br class="">+ %B0 = getelementptr [4 x i8], [4 x i8]* %B, i32 0, i32 0<br class="">+ %B1 = getelementptr [4 x i8], [4 x i8]* %B, i32 0, i32 1<br class="">+ %B2 = getelementptr [4 x i8], [4 x i8]* %B, i32 0, i32 2<br class="">+ %B3 = getelementptr [4 x i8], [4 x i8]* %B, i32 0, i32 3<br class="">+ store i8 0, i8* %A0<br class="">+ store i8 32, i8* %B0<br class="">+ store i8 73, i8* %B1<br class="">+ store i8 74, i8* %B2<br class="">+ store i8 75, i8* %B3<br class="">+ br label %loop_begin<br class="">+<br class="">+loop_begin:<br class="">+; CHECK: loop_begin:<br class="">+; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %A0, i8* %B0,<br class="">i64 4, i32 4, i1 false)<br class="">+<br class="">+ %b_val = load i8, i8* %B0<br class="">+<br class="">+ ; *B is invariant in loop and limit_val must be hoisted<br class="">+ %limit_val_1 = mul i8 %b_val, 3<br class="">+ %limit_val = add i8 %limit_val_1, 67<br class="">+<br class="">+ call void @llvm.memcpy.p0i8.p0i8.i64(i8* %A0, i8* %B0, i64 4, i32<br class="">4, i1 false)<br class="">+<br class="">+ %exitcond = icmp ugt i8 164, %limit_val<br class="">+ br i1 %exitcond, label %after_loop, label %loop_begin<br class="">+<br class="">+after_loop:<br class="">+ %b_val_result = load i8, i8* %B0<br class="">+ ret i8 %b_val_result<br class="">+}<br class="">+<br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class="">llvm-commits@lists.llvm.org<br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits<br class=""><br class=""><br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">--<span class="Apple-converted-space"> </span></span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Hal Finkel</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Assistant Computational Scientist</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Leadership Computing Facility</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Argonne National Laboratory</span></div></blockquote></div><br class=""></div></body></html>