From 053321731c501539ba48e158708568c3f8e17e46 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 3 Dec 2009 07:41:54 +0000 Subject: [PATCH] add a note git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90428 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/README.txt | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/lib/Target/README.txt b/lib/Target/README.txt index 2d8a687ebeb..2d513c8cc3a 100644 --- a/lib/Target/README.txt +++ b/lib/Target/README.txt @@ -1704,3 +1704,35 @@ need all but the bottom two bits from %A, and if we gave that mask to SDB it would delete the or instruction for us. //===---------------------------------------------------------------------===// + +FunctionAttrs is not marking this function as readnone (just readonly): +$ clang t.c -emit-llvm -S -o - -O0 | opt -mem2reg -S -functionattrs + +int t(int a, int b, int c) { + int *p; + if (a) + p = &a; + else + p = &c; + return *p; +} + +This is because we codegen this to: + +define i32 @t(i32 %a, i32 %b, i32 %c) nounwind readonly ssp { +entry: + %a.addr = alloca i32 ; [#uses=3] + %c.addr = alloca i32 ; [#uses=2] +... + +if.end: + %p.0 = phi i32* [ %a.addr, %if.then ], [ %c.addr, %if.else ] + %tmp2 = load i32* %p.0 ; [#uses=1] + ret i32 %tmp2 +} + +And functionattrs doesn't realize that the p.0 load points to function local +memory. + +//===---------------------------------------------------------------------===// + -- 2.34.1