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