[llvm-dev] invariant.load metadata semantics

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Thu Aug 25 13:17:36 PDT 2016


----- Original Message -----

> From: "Hal Finkel" <hfinkel at anl.gov>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "llvm-dev" <llvm-dev at lists.llvm.org>, "Geoff Berry"
> <gberry at codeaurora.org>
> Sent: Thursday, August 25, 2016 3:12:08 PM
> Subject: Re: [llvm-dev] invariant.load metadata semantics

> ----- Original Message -----

> > From: "Hal Finkel via llvm-dev" <llvm-dev at lists.llvm.org>
> 
> > To: "Geoff Berry" <gberry at codeaurora.org>
> 
> > Cc: "llvm-dev" <llvm-dev at lists.llvm.org>
> 
> > Sent: Thursday, August 25, 2016 3:05:48 PM
> 
> > Subject: Re: [llvm-dev] invariant.load metadata semantics
> 

> > ----- Original Message -----
> 

> > > From: "Geoff Berry via llvm-dev" <llvm-dev at lists.llvm.org>
> > 
> 
> > > To: "llvm-dev" <llvm-dev at lists.llvm.org>
> > 
> 
> > > Sent: Thursday, August 25, 2016 2:23:01 PM
> > 
> 
> > > Subject: [llvm-dev] invariant.load metadata semantics
> > 
> 

> > > I'm working on enhancing EarlyCSE to use MemorySSA and have come
> > > across the following issue due to differences in EarlyCSE and
> > > MemorySSA's handling of !invariant.load. EarlyCSE will *not*
> > > currently optimize the following code by replacing %x2 with %x
> > > and
> > > removing the second load:
> > 
> 

> > > > B1:
> > > 
> > 
> 

> > > > %x = load %p
> > > 
> > 
> 
> > > > clobber()
> > > 
> > 
> 
> > > > ...
> > > 
> > 
> 

> > > > B2: // dominated by B1
> > > 
> > 
> 

> > > > %x2 = load %p !invariant.load
> > > 
> > 
> 

> > > Sanjoy (who added the !invariant.load support to EarlyCSE) and I
> > > discussed this, and I believe we are both in agreement that this
> > > optimization should be legal. I'd like to make sure there is
> > > agreement on this and possibly clarify the LangRef wording on
> > > !invariant.load to make the legality of this transformation more
> > > clear.
> > 
> 

> > > Sanjoy suggested the following:
> > 
> 

> > > > Instead of "The existence of the !invariant.load metadata on
> > > > the
> > > > instruction tells the optimizer and code generator that the
> > > > address
> > > > operand to this load points to memory which can be assumed
> > > > unchanged." we say "It is undefined behavior to invariant_load
> > > > from
> > > > a location that has been changed since it became
> > > > dereferenceable".
> > > > In the current langref, I find "The existence" somewhat
> > > > confusing,
> > > > since it seems to imply that adding dead code can change the
> > > > behavior of the program.
> > > 
> > 
> 

> > > > I don't want to specify the semantics in a way that:
> > > 
> > 
> 

> > > > int* ptr = ...
> > > 
> > 
> 
> > > > int k0 = *ptr; // normal load
> > > 
> > 
> 
> > > > clobber();
> > > 
> > 
> 
> > > > int k1 = *ptr; // normal load
> > > 
> > 
> 

> > > > has a different meaning than
> > > 
> > 
> 

> > > > int* ptr = ...
> > > 
> > 
> 
> > > > int k0 = *ptr; // normal load
> > > 
> > 
> 
> > > > clobber();
> > > 
> > 
> 
> > > > int k1 = *ptr; // normal load
> > > 
> > 
> 
> > > > if (<always false>) {
> > > 
> > 
> 
> > > > int k2 = *ptr; // !invariant load
> > > 
> > 
> 
> > > > }
> > > 
> > 
> 

> > > > That is, adding dead code should not change the behavior of the
> > > 
> > 
> 
> > > > program -- the code guarded by (<always false>) should be able
> > > > to
> > > > have
> > > 
> > 
> 
> > > > any amount of junk without breaking the program, since it does
> > > > not
> > > 
> > 
> 
> > > > actually execute.
> > > 
> > 
> 

> > I agree.
> 

> > Regarding the proposed text, I find the "since it became
> > dereferenceable" phrase ambiguous. Further, I think we can say
> > something stronger: Storing into a location previously loaded using
> > a load tagged with !invariant.load is undefined behavior.
> 

> Alternatively, we might phrase this as: The optimizer may assume that
> all values loaded from a location, where any of the loads are tagged
> with !invariant.load, are identical.

> This has the benefit of covering the fact that no outside entity
> (i.e. the operating system) changes the value, and that we can
> change it, but only to the same value it had before (if we'll later
> be able to observe the difference).

Some questions: Do we allow stores to these locations at all? Only if the value is the same? Must any change be observable to be a problem? Do atomic loads of invariant locations really need to be atomic? 

-Hal 

> -Hal

> > -Hal
> 

> > > Does this seem like a clearer wording of the intended semantics?
> > 
> 
> > > --
> > 
> 
> > > Geoff Berry
> > 
> 
> > > Employee of Qualcomm Datacenter Technologies, Inc.
> > 
> 
> > > Qualcomm Datacenter Technologies, Inc. as an affiliate of
> > > Qualcomm
> > > Technologies, Inc.  Qualcomm Technologies, Inc. is a member of
> > > the
> > > Code Aurora Forum, a Linux Foundation Collaborative Project.
> > 
> 
> > > _______________________________________________
> > 
> 
> > > LLVM Developers mailing list
> > 
> 
> > > llvm-dev at lists.llvm.org
> > 
> 
> > > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> > 
> 

> > --
> 

> > Hal Finkel
> 
> > Assistant Computational Scientist
> 
> > Leadership Computing Facility
> 
> > Argonne National Laboratory
> 

> > _______________________________________________
> 
> > LLVM Developers mailing list
> 
> > llvm-dev at lists.llvm.org
> 
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> 

> --

> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory

-- 

Hal Finkel 
Assistant Computational Scientist 
Leadership Computing Facility 
Argonne National Laboratory 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160825/fef90cd2/attachment.html>


More information about the llvm-dev mailing list