[llvm-commits] [PATCH] Use GetUnderlyingObjects in misched
Andrew Trick
atrick at apple.com
Thu Dec 6 10:28:09 PST 2012
Hal,
I'm hoping to do some compile time measurements soon. I'll apply your patch and verify that it isn't a problem for the usual benchmarks. I agree that GetUnderlyingObjects should use its MaxLookup parameter correctly. That's a more general problem that doesn't need to hold up the patch.
As a side note, I recently improved getUnderlyingObjectFromInt() to handle the case in which the address offset comes from a phi.
While your waiting for my compile time results, can you address this comment:
---
What if you mark the results of GetUnderlyingObjects visited like this?
+ for (SmallVector<Value *, 4>::iterator I = Objs.begin(), IE = Objs.end();
+ I != IE; ++I) {
+ V = *I;
+ if (!Visited.insert(V))
+ continue;
Then do you still need this?
+ if (!Visited.count(O))
+ Working.push_back(O);
Or this?
+ bool Found = false;
+ for (SmallVectorImpl<Value *>::iterator J = Objects.begin(),
+ JE = Objects.end(); J != JE; ++J)
+ if (V == *J) {
+ Found = true;
+ break;
+ }
+
+ if (!Found)
-Andy
On Dec 6, 2012, at 9:40 AM, Hal Finkel <hfinkel at anl.gov> wrote:
> Sergei, thanks!
>
> Evan, Andy, the changes on my end also look small. I'd need to setup the benchmarks on a quieter machine to get real numbers, and I've not had a chance to do that yet. Do either of you object to committing this in the mean time?
>
> Also, if there is an unacceptably-large performance impact, I think that the correct way to address the problem would be with a follow-up patch to provide GetUnderlyingObjects with a recursion limit (in the current implementation, it passes its MaxLookup parameter to GetUnderlyingObject, but does not use it itself to limit the number of phis and selects it looks through).
>
> Thanks again,
> Hal
>
> ----- Original Message -----
>> From: "Sergei Larin" <slarin at codeaurora.org>
>> To: "Hal Finkel" <hfinkel at anl.gov>, "Evan Cheng" <evan.cheng at apple.com>
>> Cc: llvm-commits at cs.uiuc.edu
>> Sent: Monday, December 3, 2012 10:45:54 AM
>> Subject: RE: [llvm-commits] [PATCH] Use GetUnderlyingObjects in misched
>>
>> It was not much - I did not keep the exact numbers, but it was
>> somewhere under 1-2% for a pathological case.
>> I think the patch itself is very important and I want to see it in
>> the tree asap... even if it lengthens the analysis time a bit.
>> Thanks.
>>
>> Sergei
>>
>> ---
>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
>> hosted by The Linux Foundation
>>
>>
>>> -----Original Message-----
>>> From: Hal Finkel [mailto:hfinkel at anl.gov]
>>> Sent: Friday, November 30, 2012 10:31 PM
>>> To: Evan Cheng
>>> Cc: Sergei Larin; llvm-commits at cs.uiuc.edu
>>> Subject: Re: [llvm-commits] [PATCH] Use GetUnderlyingObjects in
>>> misched
>>>
>>> ----- Original Message -----
>>>> From: "Evan Cheng" <evan.cheng at apple.com>
>>>> To: "Hal Finkel" <hfinkel at anl.gov>
>>>> Cc: "Sergei Larin" <slarin at codeaurora.org>,
>>>> llvm-commits at cs.uiuc.edu
>>>> Sent: Sunday, November 25, 2012 1:50:31 PM
>>>> Subject: Re: [llvm-commits] [PATCH] Use GetUnderlyingObjects in
>>>> misched
>>>>
>>>> I'm also concerned about compile time impact. Do you have some
>>>> numbers?
>>>
>>> Not anything comprehensive, but I'll run some tests. We certainly
>>> may
>>> want to limit the recursion depth on targets that don't see any
>>> significant benefit.
>>>
>>> Sergei, can you quantify your observed compile-time effect?
>>>
>>> Thanks again,
>>> Hal
>>>
>>>>
>>>> Thanks,
>>>>
>>>> Evan
>>>>
>>>> On Nov 20, 2012, at 11:04 AM, Hal Finkel <hfinkel at anl.gov> wrote:
>>>>
>>>>> ----- Original Message -----
>>>>>> From: "Sergei Larin" <slarin at codeaurora.org>
>>>>>> To: "Hal Finkel" <hfinkel at anl.gov>
>>>>>> Cc: llvm-commits at cs.uiuc.edu, "Andrew Trick"
>>>>>> <atrick at apple.com>
>>>>>> Sent: Tuesday, November 20, 2012 12:25:35 PM
>>>>>> Subject: RE: [llvm-commits] [PATCH] Use GetUnderlyingObjects
>>>>>> in
>>>>>> misched
>>>>>>
>>>>>> Hal,
>>>>>>
>>>>>> I tried it with Hexagon and it seems to work fine. The only
>>>>>> (minor)
>>>>>> concern, it seems to affect my compile time, although very
>>>>>> slightly.
>>>>>> Thank you for allowing me time for review.
>>>>>
>>>>> Not a problem, thanks for reviewing!
>>>>>
>>>>> -Hal
>>>>>
>>>>>>
>>>>>> Sergei
>>>>>>
>>>>>> ---
>>>>>> Qualcomm Innovation Center, Inc. is a member of Code Aurora
>>>>>> Forum,
>>>>>> hosted by The Linux Foundation
>>>>>>
>>>>>>
>>>>>>> -----Original Message-----
>>>>>>> From: Hal Finkel [mailto:hfinkel at anl.gov]
>>>>>>> Sent: Monday, November 19, 2012 2:29 PM
>>>>>>> To: Sergei Larin
>>>>>>> Cc: llvm-commits at cs.uiuc.edu; Andrew Trick
>>>>>>> Subject: Re: [llvm-commits] [PATCH] Use GetUnderlyingObjects
>>>>>>> in
>>>>>>> misched
>>>>>>>
>>>>>>> ----- Original Message -----
>>>>>>>> From: "Sergei Larin" <slarin at codeaurora.org>
>>>>>>>> To: "Hal Finkel" <hfinkel at anl.gov>, "Andrew Trick"
>>>>>>>> <atrick at apple.com>
>>>>>>>> Cc: llvm-commits at cs.uiuc.edu
>>>>>>>> Sent: Monday, November 19, 2012 2:26:01 PM
>>>>>>>> Subject: RE: [llvm-commits] [PATCH] Use GetUnderlyingObjects
>>>>>>>> in
>>>>>>>> misched
>>>>>>>>
>>>>>>>> Hal,
>>>>>>>>
>>>>>>>> Please allow me some time to take a closer look at this. (A
>>>>>>>> day
>>>>>>>> probably).
>>>>>>>> Thanks.
>>>>>>>
>>>>>>> Great, thanks!
>>>>>>>
>>>>>>> -Hal
>>>>>>>
>>>>>>>>
>>>>>>>> Sergei
>>>>>>>>
>>>>>>>> ---
>>>>>>>> Qualcomm Innovation Center, Inc. is a member of Code Aurora
>>>>>>>> Forum, hosted by The Linux Foundation
>>>>>>>>
>>>>>>>>> -----Original Message-----
>>>>>>>>> From: llvm-commits-bounces at cs.uiuc.edu
>>>>>>>>> [mailto:llvm-commits-
>>>>>>>>> bounces at cs.uiuc.edu] On Behalf Of Hal Finkel
>>>>>>>>> Sent: Sunday, November 18, 2012 11:30 PM
>>>>>>>>> To: Andrew Trick
>>>>>>>>> Cc: llvm-commits at cs.uiuc.edu
>>>>>>>>> Subject: Re: [llvm-commits] [PATCH] Use
>>>>>>>>> GetUnderlyingObjects in
>>>>>>>>> misched
>>>>>>>>>
>>>>>>>>> ----- Original Message -----
>>>>>>>>>> From: "Andrew Trick" <atrick at apple.com>
>>>>>>>>>> To: "Hal Finkel" <hfinkel at anl.gov>
>>>>>>>>>> Cc: llvm-commits at cs.uiuc.edu
>>>>>>>>>> Sent: Sunday, November 18, 2012 3:08:11 AM
>>>>>>>>>> Subject: Re: [PATCH] Use GetUnderlyingObjects in misched
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Nov 17, 2012, at 1:59 AM, Hal Finkel <hfinkel at anl.gov>
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> Andy, et al.,
>>>>>>>>>>>
>>>>>>>>>>> misched currently uses GetUnderlyingObject in order to
>>>>>>>>>>> break
>>>>>>>>>>> false load/store dependencies, and the
>>>>>>>>>>> -enable-aa-sched-mi
>>>>>>>>>>> feature similarly relies on GetUnderlyingObject in order
>>>>>>>>>>> to
>>>>>>>>>>> ensure it is safe to use the aliasing analysis.
>>>>>>>>>>> Unfortunately,
>>>>>>>>>>> GetUnderlyingObject does not recurse through phi nodes,
>>>>>>>>>>> and
>>> so
>>>>>>>>>>> (especially due to LSR) all of these mechanisms fail for
>>>>>>>>>>> induction-variable-dependent loads and stores inside
>>>>>>>>>>> loops.
>>>>>>>>>>>
>>>>>>>>>>> The attached patch replaces uses of GetUnderlyingObject
>>>>>>>>>>> with
>>>>>>>>>>> GetUnderlyingObjects (which will recurse through phi and
>>>>>>>>>>> select
>>>>>>>>>>> instructions) in misched. On in-order cores with a long
>>>>>>>>>>> pipline depth (such as the PPC A2), this is extremely
>>>>>>>>>>> important (the loop
>>>>>>>>> in
>>>>>>>>>>> the attached test case, for example, shows a ~100%
>>>>>>>>>>> speedup).
>>>>>>>>>>> Please review.
>>>>>>>>>>
>>>>>>>>>> Thanks Hal. This does look like it fixes a serious
>>>>>>>>>> handicap.
>>>>>>>>>> A
>>>>>>> few
>>>>>>>>>> comments...
>>>>>>>>>>
>>>>>>>>>> +static void getUnderlyingObjects(const Value *V,
>>>>>>>>>> + SmallVectorImpl<Value *>
>>>>>>>>>> &Objects)
>>>>>>>>>> {
>>>>>>>>>> + SmallVector<const Value *, 4> Working(1, V);
>>>>>>>>>>
>>>>>>>>>> You also need a visited set (SmallPtrSet) for two reasons:
>>>>>>>>>> to
>>>>>>>>>> terminate phi-ptrint-intptr-phi cycles, and to avoid
>>>>>>>>>> exponential path exploration in long if-then-else chains.
>>>>>>>>>
>>>>>>>>> Good point, thanks!
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> + GetUnderlyingObjects(const_cast<Value *>(V), Objs);
>>>>>>>>>> +
>>>>>>>>>> + for (SmallVector<Value *, 4>::iterator I =
>>>>>>>>>> Objs.begin(),
>>>>>>>>>> IE
>>>>>>>>>> =
>>>>>>>>>> Objs.end();
>>>>>>>>>> + I != IE; ++I) {
>>>>>>>>>> + V = *I;
>>>>>>>>>>
>>>>>>>>>> You can check if V is visited here before doing anything
>>>>>>>>>> else.
>>>>>>>>>
>>>>>>>>> The result of getUnderlyingObjectFromInt should be checked
>>>>>>>>> (maybe that's what you meant).
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> + bool Found = false;
>>>>>>>>>> + for (SmallVectorImpl<Value *>::iterator J =
>>>>>>>>>> Objects.begin(),
>>>>>>>>>> + JE = Objects.end(); J != JE; ++J)
>>>>>>>>>> + if (V == *J) {
>>>>>>>>>> + Found = true;
>>>>>>>>>> + break;
>>>>>>>>>> + }
>>>>>>>>>> +
>>>>>>>>>> + if (!Found)
>>>>>>>>>>
>>>>>>>>>> Since only visited values are pushed, you should not need
>>>>>>>>>> this
>>>>>>>>>> loop.
>>>>>>>>>
>>>>>>>>> Collecting the underlying objects from different IntToPtr
>>>>>>>>> instructions could still yield duplicate underlying
>>>>>>>>> objects. On
>>>>>>>>> the other hand, is it important to insure that the values
>>>>>>>>> in
>>> the
>>>>>>>>> array are unique?
>>>>>>>>> (does
>>>>>>>>> the scheduler care about the insertion of duplicate edges?)
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> } else if (MI->mayStore()) {
>>>>>>>>>> - bool MayAlias = true;
>>>>>>>>>> - if (const Value *V =
>>>>>>>>>> getUnderlyingObjectForInstr(MI,
>>>>>>>>>> MFI,
>>>>>>>>>> MayAlias)) {
>>>>>>>>>> + SmallVector<std::pair<const Value *, bool>, 4>
>>>>>>>>>> Objs;
>>>>>>>>>> + getUnderlyingObjectsForInstr(MI, MFI, Objs);
>>>>>>>>>> +
>>>>>>>>>> + if (Objs.empty()) {
>>>>>>>>>> + // Treat all other stores conservatively.
>>>>>>>>>> + goto new_alias_chain;
>>>>>>>>>> + }
>>>>>>>>>> +
>>>>>>>>>> + for (SmallVector<std::pair<const Value *, bool>,
>>>>>>>>>> 4>::iterator
>>>>>>>>>> + K = Objs.begin(), KE = Objs.end(); K != KE;
>>>>>>>>>> ++K)
>>>>>>>>>> {
>>>>>>>>>>
>>>>>>>>>> For stores, we only need to add edges to pending loads,
>>>>>>>>>> the
>>>>>>>>>> AliasChain, and the BarrierChain once, not for every
>>>>>>>>>> identifiable object.
>>>>>>>>>
>>>>>>>>> Makes sense.
>>>>>>>>>
>>>>>>>>> I've attached an updated version.
>>>>>>>>>
>>>>>>>>> Thanks again,
>>>>>>>>> Hal
>>>>>>>>>
>>>>>>>>>> It looks like you do the right thing for loads already.
>>>>>>>>>>
>>>>>>>>>> -Andy
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Hal Finkel
>>>>>>>>> Postdoctoral Appointee
>>>>>>>>> Leadership Computing Facility
>>>>>>>>> Argonne National Laboratory
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Hal Finkel
>>>>>>> Postdoctoral Appointee
>>>>>>> Leadership Computing Facility
>>>>>>> Argonne National Laboratory
>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>>> Hal Finkel
>>>>> Postdoctoral Appointee
>>>>> Leadership Computing Facility
>>>>> Argonne National Laboratory
>>>>> _______________________________________________
>>>>> llvm-commits mailing list
>>>>> llvm-commits at cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>>
>>>>
>>>
>>> --
>>> Hal Finkel
>>> Postdoctoral Appointee
>>> Leadership Computing Facility
>>> Argonne National Laboratory
>>
>>
>
> --
> Hal Finkel
> Postdoctoral Appointee
> Leadership Computing Facility
> Argonne National Laboratory
More information about the llvm-commits
mailing list