[LLVMdev] __main() function and AliasSet
Nai Xia
nelson.xia at gmail.com
Sat May 13 21:41:09 PDT 2006
In a code segment of my pass plugin, I try to gather AliasSets for all StoreInst, LoadInst and CallInst instructions in a function.
Some behaviors of the pass puzzled me.
Below is the *.ll of the test program which I run the pass on,
it was get with "llvm-gcc -Wl,--disable-opt" from a rather simple *.c program.
----------------------------------
; ModuleID = 'ptralias.bc'
target endian = little
target pointersize = 32
target triple = "i686-pc-linux-gnu"
deplibs = [ "c", "crtend" ]
%.str_1 = internal constant [25 x sbyte] c"ptra=0x ptrb=0x ptrc=0x\0A\00" ; <[25 x sbyte]*> [#uses=1]
%ptr = weak global void ()* null ; <void ()**> [#uses=0]
implementation ; Functions:
declare int %printf(sbyte*, ...)
void %foo1() {
ret void
}
void %foo2() {
ret void
}
int %main(int %argc, sbyte** %argv) {
entry:
%data_b = alloca int ; <int*> [#uses=2]
%data_c = alloca int ; <int*> [#uses=1]
%data_d = alloca int ; <int*> [#uses=3]
%data_e = alloca int ; <int*> [#uses=2]
%data_f = alloca int ; <int*> [#uses=2]
call void %__main( )
store int 2, int* %data_b
store int 3, int* %data_c
store int 4, int* %data_d
store int 5, int* %data_e
store int 6, int* %data_f
switch int %argc, label %switchexit [
int 3, label %label.3
int 2, label %then.2
int 1, label %label.1
int 0, label %endif.2
]
label.1: ; preds = %entry
br label %switchexit
label.3: ; preds = %entry
br label %then.2
switchexit: ; preds = %label.1, %entry
%ptr_b.0 = phi int* [ %data_d, %label.1 ], [ null, %entry ] ; <int*> [#uses=1]
br label %endif.2
then.2: ; preds = %label.3, %entry
%ptr_a.1.0 = phi int* [ %data_f, %label.3 ], [ %data_e, %entry ] ; <int*> [#uses=1]
store int 0, int* %ptr_a.1.0
br label %then.3
endif.2: ; preds = %switchexit, %entry
%ptr_b.0.1 = phi int* [ %ptr_b.0, %switchexit ], [ %data_b, %entry ] ; <int*> [#uses=2]
%tmp.12 = seteq int* %ptr_b.0.1, null ; <bool> [#uses=1]
br bool %tmp.12, label %then.4, label %then.3
then.3: ; preds = %endif.2, %then.2
%ptr_b.0.2 = phi int* [ %data_d, %then.2 ], [ %ptr_b.0.1, %endif.2 ] ; <int*> [#uses=1]
store int 0, int* %ptr_b.0.2
%tmp.1913 = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([25 x sbyte]* %.str_1, int 0, int 0) ) ; <int> [#uses=0]
ret int 0
then.4: ; preds = %endif.2
%tmp.19 = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([25 x sbyte]* %.str_1, int 0, int 0) ) ; <int> [#uses=0]
ret int 0
}
void %__main() {
entry:
ret void
}
----------------------------------
I think the right AliasSet information calculated for this program should be
Information for alias set0:
pointer0=data_b
pointer1=data_d
pointer2=ptr_b.0.2
Information for alias set1:
pointer0=data_c
Information for alias set2:
Information for alias set3:
pointer0=data_e
pointer1=data_f
pointer2=ptr_a.1.0
Information for alias set4:
Information for alias set5:
,where the empty AliasSets I think should be "Forwarded".
However, the result of the pass was:
Information for alias set0:
pointer0=data_b
pointer1=data_d
pointer2=data_e
pointer3=data_f
pointer4=ptr_a.1.0
pointer5=ptr_b.0.2
Information for alias set1:
pointer0=data_c
After I deleted "call void %__main( )" in %main(), the pass get the right answer.
So my question is:
1. What is the purpose for call to __main() ? __main() is just a empty function. My .c program only contains main().
2. My explanation for this behavior is that the CallSite of "call void %__main( )" alias some pointers in the program,
however, __main() is obviously empty, why should the AliasAnalysis think that it may/must Mod/Ref any stack location of main()?
btw: the AliasAnalysis pass I used is -steens-aa and it also the same with -anders-aa.
--
Regards,
Nai
More information about the llvm-dev
mailing list