[LLVMdev] llvm cse optimization
Nick Lewycky
nicholas at mxc.ca
Wed Apr 16 01:21:16 PDT 2014
xiaoyong liu wrote:
> Here, The function ’select_value’, which is an external function, only
> write to the first parameter and other parameters are readonly and no
> global value writing.
> As what I know, we didn't have an attribute for this case to indict only
> writing to the first actual parameter.
> We should mark the first parameter as Mod, others as Ref and let cse
> work for readonly arguments.
>
> Pls kindly let me know If you know any way to mark the function to ONLY
> kill the first parameter for the general optimization.
We don't.
Part of the problem is that such an annotation wouldn't be useful very
often. Often you have a function which doesn't write to any globals but
may write to any memory "reachable" through any number of indirect loads
starting with a pointer argument, and that reachability is complex
enough to be equivalent to "all memory".
If you want to work on this, I think that a function attribute which
states "only writes things reachable through arguments" is the place to
start, then we can see how often we can prove that this is less than
everything. A starting point for that is showing that it doesn't write
to an internal global variable whose address is never taken.
Nick
>
> thanks
> xiaoyong
>
> Subject: Re: [LLVMdev] llvm cse optimization
> From: nrotem at apple.com
> Date: Fri, 11 Apr 2014 10:25:57 -0700
> CC: llvmdev at cs.uiuc.edu
> To: xiaoyongliu at outlook.com
>
>
> On Apr 11, 2014, at 10:13 AM, xiaoyong liu <xiaoyongliu at outlook.com
> <mailto:xiaoyongliu at outlook.com>> wrote:
>
> I'm working on the across the subprogram call optimization, and
> let's say the following llvm IR,
>
> @ng0 = internal global [2 x i32] [i32 2, i32 0], align 4
>
> %t7 = alloca [16 x i8], align 16
> %add.ptr = getelementptr inbounds i8* %t1, i64 40
> %call = call i8* @handle_value(i8* %add.ptr, i32 3) #3
> %arraydecay = getelementptr inbounds [8 x i8]* %t3, i64 0, i64 0
> %arraydecay1 = getelementptr inbounds [16 x i8]* %t4, i64 0, i64 0
> call void @select_value(i8* %arraydecay, i32 1, i32 1, i8* %call,
> i8* %arraydecay1, i8* null, i32 1, i32 2, i32 1, i8* bitcast ([2 x
> i32]* @ng0 to i8*), i32 32, i32 1) #3
> %call3 = call i8* @handle_value(i8* %add.ptr, i32 3) #3
>
> ; Function Attrs: nounwind readonly
> declare i8* @handle_value(i8* nocapture, i32) #1
> ; Function Attrs: nounwind
> declare void @select_value(i8*, i32, i32, i8* nocapture readonly,
> i8* nocapture readonly, i8*, i32, i32, i32, i8*, i32, i32) #2
> //select value will only write to the first parameter, other
> parameter is readonly
>
>
> The function ’select_value’ is not marked as *not* having side effects.
> They compiler has to assume that it could write to memory or print to
> the screen so it can’t merge them.
>
>
> For the above case, the second handle_value function call should be
> replaced with %call with cse or gvn optimization.
>
> Is anything I can do to optimize this case?
>
> thanks
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu
> <mailto:LLVMdev at cs.uiuc.edu>http://llvm.cs.uiuc.edu
> <http://llvm.cs.uiuc.edu/>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list