[llvm-commits] PATCH: Allow LICM to sink or lift loads from constant memory

Chris Lattner clattner at apple.com
Tue Jul 22 22:07:19 PDT 2008

On Jul 22, 2008, at 7:00 PM, Stefanus Du Toit wrote:

> Allow LICM to sink or lift loads from constant memory. Also add a test
> case for this.
> This allows instructions like loads from global variables declared to
> be constant to be moved out of loops.
Hi Stephanus,

<appologizes for the stream of consciousness email>

I don't think this is the right approach.  A better approach would be  
to modify the basicaa pass to say that nothing mod's a pointer that  
points into constant memory.  It already has some of the logic for  
this, but it must be missing a case.

To find out what is happening, use something like:

$ llvm-as < t.ll | opt -count-aa -licm -count-aa-print-all-queries |  
May alias:	[8B] float** @a, [4B] float* %arrayidx
May alias:	[8B] float** @a, [4B] float* %arrayidx
forcond:		; preds = %forbody, %entry
	%i.0 = phi i32 [ 0, %entry ], [ %inc, %forbody ]		; <i32> [#uses=4]
	%cmp = icmp ult i32 %i.0, %count		; <i1> [#uses=1]
	br i1 %cmp, label %forbody, label %afterfor

forbody:		; preds = %forcond
	%tmp3 = load float** @a		; <float*> [#uses=1]
	%arrayidx = getelementptr float* %tmp3, i32 %i.0		; <float*> [#uses=1]
	%tmp7 = uitofp i32 %i.0 to float		; <float> [#uses=1]
	store float %tmp7, float* %arrayidx
	%inc = add i32 %i.0, 1		; <i32> [#uses=1]
	br label %forcond

Okay, so this is actually a problem that happens because LICM itself  
is making equivalence sets based on pointers, so these things end up  
in the same set.  This we can see with:

$ llvm-as < t.ll | opt -print-alias-sets
Alias Set Tracker: 1 alias sets for 2 pointer values.
   AliasSet[0xc03a50,2] may alias, Mod/Ref   Pointers: (float** @a,  
8), (float* %arrayidx, 4)

Okay, given that, your patch is fine and I take back what I said  
above.   This is a problem specific to LICM so it is reasonable for  
the fix to be in LICM.  Patch applied:

Thanks! :)


More information about the llvm-commits mailing list