[llvm-dev] LLVM Alias Analysis (Load and store from same address is not showed up in same set)

Mustakimur Khandaker via llvm-dev llvm-dev at lists.llvm.org
Sun Apr 15 11:44:00 PDT 2018


Hi
I have this simple c code for which I would like to use for alias analysis.


#include <stdio.h>

#include <stdlib.h>


static int (*fp) (void);

void ind_call (int (*compr)(void)){

    fp = compr;

    fp();

}

int hello(void){

    return printf("hello world\n");

}

int main(){

    ind_call(hello);

    return 0;

}

So, I do the following:

bin/opt -basicaa -cfl-anders-aa -print-alias-sets bin/test/test.bc

I get the following result:

Alias sets for function 'ind_call':

Alias Set Tracker: 2 alias sets for 2 pointer values.

  AliasSet[0x91a5820, 1] must alias, Mod/Ref   Pointers: (i32 ()** %compr.addr, 8)

  AliasSet[0x91a58c0, 2] may alias, Mod/Ref   Pointers: (i32 ()** @fp, 8)

    1 Unknown instructions: i32 %call


Alias sets for function 'hello':

Alias Set Tracker: 1 alias sets for 0 pointer values.

  AliasSet[0x91a5910, 1] may alias, Mod/Ref

    1 Unknown instructions: i32 %call


Alias sets for function 'main':

Alias Set Tracker: 2 alias sets for 1 pointer values.

  AliasSet[0x91a5a50, 1] must alias, Mod       Pointers: (i32* %retval, 4)

  AliasSet[0x91a5aa0, 1] may alias, Mod/Ref

    1 Unknown instructions: void <badref>

My question is from c code when we can notice that fp and compr target to same address (because of fp = compr), why they are not in the same alias set. As you can see, for function ind_call, the alias set that contain fp is along, while from my understanding there should be another alias compr.

For better understanding, I also include the LLVM IR here (generated by LLVM-7.0):

; ModuleID = 'test.c'

source_filename = "test.c"

target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

target triple = "x86_64-unknown-linux-gnu"


@fp = internal global i32 ()* null, align 8

@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00", align 1


; Function Attrs: noinline nounwind optnone uwtable

define dso_local void @ind_call(i32 ()* %compr) #0 {

entry:

  %compr.addr = alloca i32 ()*, align 8

  store i32 ()* %compr, i32 ()** %compr.addr, align 8

  %0 = load i32 ()*, i32 ()** %compr.addr, align 8

  store i32 ()* %0, i32 ()** @fp, align 8

  %1 = load i32 ()*, i32 ()** @fp, align 8

  %call = call i32 %1()

  ret void

}


; Function Attrs: noinline nounwind optnone uwtable

define dso_local i32 @hello() #0 {

entry:

  %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0))

  ret i32 %call

}


declare dso_local i32 @printf(i8*, ...) #1


; Function Attrs: noinline nounwind optnone uwtable

define dso_local i32 @main() #0 {

entry:

  %retval = alloca i32, align 4

  store i32 0, i32* %retval, align 4

  call void @ind_call(i32 ()* @hello)

  ret i32 0

}


Best Regards
Mustakimur Rahman Khandaker
Graduate Student and Research Assistant
Department of Computer Science
Florida State University
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180415/f395ab0a/attachment.html>


More information about the llvm-dev mailing list