Amr Yehia
2009-May-29 10:30 UTC
[LLVMdev] difference between alias set tracker and alias analysis evaluator
Hi all, I have a problem with alias aliasing results returned by the alias set tracker and the alias analysis evaluator. so i call opt tool to run my module with the following options "-anders-aa -aa-eval -print-alias-sets -print-all-alias-modref-info" i use 2 classes to print alias analysis, the AliasSetTracket and AliasAnalysisEvaluator. but they give different results. here is a sample program: int main(){ int a[5]; struct { char id[10]; int line; } sym; sym.line =a[1] + 10; a[3] = 3; sym.id[5] = a[3]; return 0; } and here is the ll file define i32 @main() nounwind { entry: %retval = alloca i32 ; <i32*> [#uses=2] %sym = alloca %struct..0anon ; <%struct..0anon*> [#uses=2] %a = alloca [5 x i32] ; <[5 x i32]*> [#uses=3] %0 = alloca i32 ; <i32*> [#uses=2] %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] %1 = getelementptr [5 x i32]* %a, i32 0, i64 1 ; <i32*> [#uses=1] %2 = load i32* %1, align 4 ; <i32> [#uses=1] %3 = add i32 %2, 10 ; <i32> [#uses=1] %4 = getelementptr %struct..0anon* %sym, i32 0, i32 1 ; <i32*> [#uses=1] store i32 %3, i32* %4, align 4 %5 = getelementptr [5 x i32]* %a, i32 0, i64 3 ; <i32*> [#uses=1] store i32 3, i32* %5, align 4 %6 = getelementptr [5 x i32]* %a, i32 0, i64 3 ; <i32*> [#uses=1] %7 = load i32* %6, align 4 ; <i32> [#uses=1] %8 = trunc i32 %7 to i8 ; <i8> [#uses=1] %9 = getelementptr %struct..0anon* %sym, i32 0, i32 0 ; <[10 x i8]*> [#uses=1] %10 = getelementptr [10 x i8]* %9, i32 0, i64 5 ; <i8*> [#uses=1] store i8 %8, i8* %10, align 1 store i32 0, i32* %0, align 4 %11 = load i32* %0, align 4 ; <i32> [#uses=1] store i32 %11, i32* %retval, align 4 br label %return return: ; preds = %entry %retval1 = load i32* %retval ; <i32> [#uses=1] ret i32 %retval1 } the AliasSetTracker gives the following result: Alias Set Tracker: 6 alias sets for 7 pointer values. AliasSet[0x2ce5d30,1] must alias, Ref Pointers: (i32* %1, 4) AliasSet[0x2ce5ab0,1] must alias, Mod Pointers: (i32* %4, 4) AliasSet[0x2ce59c0,2] must alias, Mod/Ref Pointers: (i32* %5, 4), (i32* %6, 4) AliasSet[0x2ce5910,1] must alias, Mod Pointers: (i8* %10, 1) AliasSet[0x2ce5820,1] must alias, Mod/Ref Pointers: (i32* %0, 4) AliasSet[0x2ce4f00,1] must alias, Mod/Ref Pointers: (i32* %retval, 4) the alias analysis evaluator gives the following results (i removed all the NoAlias results) MayAlias: [5 x i32]* %a, i32* %1 MayAlias: %struct..0anon* %sym, i32* %4 MayAlias: [5 x i32]* %a, i32* %5 MayAlias: [5 x i32]* %a, i32* %6 MustAlias: i32* %5, i32* %6 MustAlias: %struct..0anon* %sym, [10 x i8]* %9 MayAlias: %struct..0anon* %sym, i8* %10 MayAlias: [10 x i8]* %9, i8* %10 so my questions finally are: - why is there is a difference between the 2 results, - how can i get the alias set tracker to give me all the aliasing results returned by alias analysis evaluator thank you