[LLVMdev] optimization whith call of Intrinsics
Eli Friedman
eli.friedman at gmail.com
Thu Dec 4 08:46:20 PST 2008
On Thu, Dec 4, 2008 at 7:38 AM, Julien Schmitt <jschmitt at dibcom.fr> wrote:
> Dear LLVMer ;
>
> i'm trying to use LLVM for a specific target, using different memory banks.
> I have written the frontend to generate a valid IR and want to use the
> existing passes (as defined in tool opt) to optimize the code.
>
> The target has specific instructions, so following advices given in
> documentation, I created an intrinsic function, with attribute
> [IntrReadArgMem].
>
> My test case is very simple : I repeat twice a set of instructions and
> would like that the optimizer delete the second one;
> the set is
> { INSTR 1 : store of data in bank 1;
> INSTR 2 : call of intrinsic (read only)
> INSTR 3 : store of data in bank 2; }
>
> When calling the intrinsic function, the optimizer doesn't work well.
> (If I delete INSTR2 and INSTR3, optimization is good)
> If I use only one memory bank, the problem is the same. It seems that
> the call of intrinsics is not well supported by existing optimization
> passes.
> Does anybody have an idea about this problem ? ( just below, the IR
> generated by LLVM after optimization)
> Thanks.
>
> Julien
>
>
>
> ; ModuleID = 'TheModule'
> @MemSys = global i16 0 ; <i16*> [#uses=2]
> @MemSysSigA = global i16 3 addrspace(2) ; <i16 addrspace(2)*>
> [#uses=2]
> @reg_ai_beg = global i16 405 addrspace(1) ; <i16 addrspace(1)*>
> [#uses=2]
>
> define void @OFUNC(i16* %N0, i16* %N1) nounwind {
> entry:
> store i16 1, i16 addrspace(1)* @reg_ai_beg
> %outLLVMInt = tail call i16 @llvm.octo.su.opa.rd(i16* @MemSys)
> ; <i16> [#uses=1]
> store i16 %outLLVMInt, i16 addrspace(2)* @MemSysSigA
> store i16 1, i16 addrspace(1)* @reg_ai_beg
> %outLLVMInt5 = tail call i16 @llvm.octo.su.opa.rd(i16* @MemSys)
> ; <i16> [#uses=1]
> store i16 %outLLVMInt5, i16 addrspace(2)* @MemSysSigA
> ret void
> }
>
> declare i16 @llvm.octo.su.opa.rd(i16*) nounwind readonly
Dead store elimination is that pass that could do the optimizations in
question. The second store to @reg_ai_beg should be eliminated; I'm
not really surprised that it doesn't implement this particular case,
though. For the stores to @MemSysSigA, LLVM doesn't know that
llvm.octo.su.opa.rd doesn't read @MemSysSigA, so neither store can be
eliminated.
You should be able to solve both these problems by writing a special
alias analysis pass that knows about the behavior of
llvm.octo.su.opa.rd. See http://llvm.org/docs/AliasAnalysis.html for
details.
-Eli
More information about the llvm-dev
mailing list