[LLVMdev] optimization whith call of Intrinsics

Julien Schmitt jschmitt at dibcom.fr
Thu Dec 4 07:38:43 PST 2008


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











-- 








More information about the llvm-dev mailing list