[llvm] r254950 - [EarlyCSE] Simplify and invert ParseMemoryInst [NFCI]

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 7 13:40:58 PST 2015


Cancel that.  I made a silly mistake.  I was only building x86. Will 
revert and then investigate and reapply.

Philip

On 12/07/2015 01:35 PM, Philip Reames via llvm-commits wrote:
> Not on my platform.  Can you copy the error message so I can 
> investigate?  Or point to a buildbot?
>
> On 12/07/2015 01:34 PM, Rafael EspĂ­ndola wrote:
>> Transforms/EarlyCSE/AArch64/intrinsics.ll is now faling
>>
>> On 7 December 2015 at 16:27, Philip Reames via llvm-commits
>> <llvm-commits at lists.llvm.org> wrote:
>>> Author: reames
>>> Date: Mon Dec  7 15:27:15 2015
>>> New Revision: 254950
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=254950&view=rev
>>> Log:
>>> [EarlyCSE] Simplify and invert ParseMemoryInst [NFCI]
>>>
>>> Restructure ParseMemoryInst - which was introduced to abstract over 
>>> target specific load and stores instructions - to just query the 
>>> underlying instructions. In theory, this could be slightly slower 
>>> than caching the results, but in practice, it's very unlikely to be 
>>> measurable.
>>>
>>> The simple query scheme makes it far easier to understand, and much 
>>> easier to extend with new queries. Given I'm about to need to add 
>>> new query types, doing the cleanup first seemed worthwhile.
>>>
>>> Do we still believe the target specific intrinsic handling is 
>>> worthwhile in EarlyCSE? It adds quite a bit of complexity and makes 
>>> the code harder to read. Being able to delete the abstraction 
>>> entirely would be wonderful.
>>>
>>>
>>>
>>> Modified:
>>>      llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp
>>>
>>> Modified: llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp?rev=254950&r1=254949&r2=254950&view=diff
>>> ============================================================================== 
>>>
>>> --- llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp Mon Dec  7 
>>> 15:27:15 2015
>>> @@ -388,57 +388,58 @@ private:
>>>     class ParseMemoryInst {
>>>     public:
>>>       ParseMemoryInst(Instruction *Inst, const TargetTransformInfo 
>>> &TTI)
>>> -      : Load(false), Store(false), IsSimple(true), 
>>> MayReadFromMemory(false),
>>> -        MayWriteToMemory(false), MatchingId(-1), Ptr(nullptr) {
>>> -      MayReadFromMemory = Inst->mayReadFromMemory();
>>> -      MayWriteToMemory = Inst->mayWriteToMemory();
>>> -      if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst)) {
>>> -        MemIntrinsicInfo Info;
>>> -        if (!TTI.getTgtMemIntrinsic(II, Info))
>>> -          return;
>>> -        if (Info.NumMemRefs == 1) {
>>> -          Store = Info.WriteMem;
>>> -          Load = Info.ReadMem;
>>> -          MatchingId = Info.MatchingId;
>>> -          MayReadFromMemory = Info.ReadMem;
>>> -          MayWriteToMemory = Info.WriteMem;
>>> -          IsSimple = Info.IsSimple;
>>> -          Ptr = Info.PtrVal;
>>> -        }
>>> -      } else if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
>>> -        Load = true;
>>> -        IsSimple = LI->isSimple();
>>> -        Ptr = LI->getPointerOperand();
>>> +      : IsTargetMemInst(false), Inst(Inst) {
>>> +      if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst))
>>> +        if (TTI.getTgtMemIntrinsic(II, Info) && Info.NumMemRefs == 1)
>>> +          IsTargetMemInst = true;
>>> +    }
>>> +    bool isLoad() const {
>>> +      if (IsTargetMemInst) return Info.ReadMem;
>>> +      return isa<LoadInst>(Inst);
>>> +    }
>>> +    bool isStore() const {
>>> +      if (IsTargetMemInst) return Info.WriteMem;
>>> +      return isa<StoreInst>(Inst);
>>> +    }
>>> +    bool isSimple() const {
>>> +      if (IsTargetMemInst) return Info.IsSimple;
>>> +      if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
>>> +        return LI->isSimple();
>>>         } else if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
>>> -        Store = true;
>>> -        IsSimple = SI->isSimple();
>>> -        Ptr = SI->getPointerOperand();
>>> +        return SI->isSimple();
>>>         }
>>> +      return Inst->isAtomic();
>>>       }
>>> -    bool isLoad() const { return Load; }
>>> -    bool isStore() const { return Store; }
>>> -    bool isSimple() const { return IsSimple; }
>>>       bool isMatchingMemLoc(const ParseMemoryInst &Inst) const {
>>> -      return Ptr == Inst.Ptr && MatchingId == Inst.MatchingId;
>>> +      return (getPointerOperand() == Inst.getPointerOperand() &&
>>> +              getMatchingId() == Inst.getMatchingId());
>>>       }
>>> -    bool isValid() const { return Ptr != nullptr; }
>>> -    int getMatchingId() const { return MatchingId; }
>>> -    Value *getPtr() const { return Ptr; }
>>> -    bool mayReadFromMemory() const { return MayReadFromMemory; }
>>> -    bool mayWriteToMemory() const { return MayWriteToMemory; }
>>> +    bool isValid() const { return getPointerOperand() != nullptr; }
>>>
>>> -  private:
>>> -    bool Load;
>>> -    bool Store;
>>> -    bool IsSimple;
>>> -    bool MayReadFromMemory;
>>> -    bool MayWriteToMemory;
>>>       // For regular (non-intrinsic) loads/stores, this is set to 
>>> -1. For
>>>       // intrinsic loads/stores, the id is retrieved from the 
>>> corresponding
>>>       // field in the MemIntrinsicInfo structure.  That field contains
>>>       // non-negative values only.
>>> -    int MatchingId;
>>> -    Value *Ptr;
>>> +    int getMatchingId() const {
>>> +      if (IsTargetMemInst) return Info.MatchingId;
>>> +      return -1;
>>> +    }
>>> +    Value *getPointerOperand() const {
>>> +      if (IsTargetMemInst) return Info.PtrVal;
>>> +      if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
>>> +        return LI->getPointerOperand();
>>> +      } else if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
>>> +        return SI->getPointerOperand();
>>> +      }
>>> +      return nullptr;
>>> +    }
>>> +    bool mayReadFromMemory() const { return 
>>> Inst->mayReadFromMemory(); }
>>> +    bool mayWriteToMemory() const { return Inst->mayWriteToMemory(); }
>>> +
>>> +  private:
>>> +    bool IsTargetMemInst;
>>> +    MemIntrinsicInfo Info;
>>> +    Instruction *Inst;
>>>     };
>>>
>>>     bool processNode(DomTreeNode *Node);
>>> @@ -565,7 +566,7 @@ bool EarlyCSE::processNode(DomTreeNode *
>>>
>>>         // If we have an available version of this load, and if it 
>>> is the right
>>>         // generation, replace this instruction.
>>> -      LoadValue InVal = AvailableLoads.lookup(MemInst.getPtr());
>>> +      LoadValue InVal = 
>>> AvailableLoads.lookup(MemInst.getPointerOperand());
>>>         if (InVal.Data != nullptr && InVal.Generation == 
>>> CurrentGeneration &&
>>>             InVal.MatchingId == MemInst.getMatchingId()) {
>>>           Value *Op = getOrCreateResult(InVal.Data, Inst->getType());
>>> @@ -583,7 +584,7 @@ bool EarlyCSE::processNode(DomTreeNode *
>>>
>>>         // Otherwise, remember that we have this instruction.
>>>         AvailableLoads.insert(
>>> -          MemInst.getPtr(),
>>> +          MemInst.getPointerOperand(),
>>>             LoadValue(Inst, CurrentGeneration, 
>>> MemInst.getMatchingId()));
>>>         LastStore = nullptr;
>>>         continue;
>>> @@ -659,7 +660,7 @@ bool EarlyCSE::processNode(DomTreeNode *
>>>           // to non-volatile loads, so we don't have to check for 
>>> volatility of
>>>           // the store.
>>>           AvailableLoads.insert(
>>> -            MemInst.getPtr(),
>>> +            MemInst.getPointerOperand(),
>>>               LoadValue(Inst, CurrentGeneration, 
>>> MemInst.getMatchingId()));
>>>
>>>           // Remember that this was the last normal store we saw for 
>>> DSE.
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list