[llvm-commits] [poolalloc] r117589 - in /poolalloc/trunk/test/dsa/extern: extern_global2.c extern_global2.ll extern_global_escape.c
Will Dietz
wdietz2 at illinois.edu
Thu Oct 28 12:53:20 PDT 2010
Author: wdietz2
Date: Thu Oct 28 14:53:20 2010
New Revision: 117589
URL: http://llvm.org/viewvc/llvm-project?rev=117589&view=rev
Log:
Add a trickier extern/global test case.
Add c versions for readability.
Added:
poolalloc/trunk/test/dsa/extern/extern_global2.c
poolalloc/trunk/test/dsa/extern/extern_global2.ll
poolalloc/trunk/test/dsa/extern/extern_global_escape.c
Added: poolalloc/trunk/test/dsa/extern/extern_global2.c
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/test/dsa/extern/extern_global2.c?rev=117589&view=auto
==============================================================================
--- poolalloc/trunk/test/dsa/extern/extern_global2.c (added)
+++ poolalloc/trunk/test/dsa/extern/extern_global2.c Thu Oct 28 14:53:20 2010
@@ -0,0 +1,48 @@
+//--Make sure we can run DSA on it!
+//RUN: llvm-gcc %s -c --emit-llvm -o - | \
+//RUN: dsaopt -dsa-bu -dsa-td -disable-output
+
+static int * G = 0;
+
+typedef void (*fp)(int **);
+
+extern void external(fp f);
+
+static void C(int ** a) {
+ // Make the argument point to the global.
+ // Eventually, this link will make the global external because eventually, in TD,
+ // our argument will be +E because we're externally callable.
+ *a = G;
+}
+
+static void B(void) {
+ // Pass something to C, doesn't really matter here.
+ int a;
+ int * ptr = &a;
+ C(&ptr);
+}
+
+static void B2(void) {
+ // This makes use of the global.
+ // At somepoint, we should know that 'a' is external because
+ // the global aliases the parameter and since C becomes externally callable
+ int * a = G;
+ int val = *a;
+}
+
+// Makes its argument external
+static void externalize(fp f) {
+ external(f);
+}
+
+static void A(void) {
+ // Here we make 'f' externally callable, but we don't know that
+ // Until BU is run.
+ fp f = C;
+ externalize(f);
+
+ // Call tree...
+ B();
+ B2();
+}
+
Added: poolalloc/trunk/test/dsa/extern/extern_global2.ll
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/test/dsa/extern/extern_global2.ll?rev=117589&view=auto
==============================================================================
--- poolalloc/trunk/test/dsa/extern/extern_global2.ll (added)
+++ poolalloc/trunk/test/dsa/extern/extern_global2.ll Thu Oct 28 14:53:20 2010
@@ -0,0 +1,113 @@
+; ModuleID = 'extern_global2.c'
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+target triple = "x86_64-unknown-linux-gnu"
+;RUN: dsaopt %s -dsa-local -analyze
+;RUN: dsaopt %s -dsa-bu -analyze
+;RUN: dsaopt %s -dsa-td -analyze
+
+; Global stays non-external until TD!
+; RUN: dsaopt %s -dsa-local -analyze -verify-flags "G+G-E"
+; RUN: dsaopt %s -dsa-bu -analyze -verify-flags "G+G-E"
+; RUN: dsaopt %s -dsa-bu -analyze -verify-flags "G:0-E"
+; RUN: dsaopt %s -dsa-td -analyze -verify-flags "G+G-E"
+; RUN: dsaopt %s -dsa-td -analyze -verify-flags "G:0+E"
+ at G = internal global i32* null ; <i32**> [#uses=2]
+
+; This function is externally callable so we mark it's arguments
+; external when processed in TD.
+;RUN: dsaopt %s -dsa-local -analyze -verify-flags "C:a+I-E"
+;RUN: dsaopt %s -dsa-bu -analyze -verify-flags "C:a+I-E"
+;RUN: dsaopt %s -dsa-td -analyze -verify-flags "C:a-I+E"
+define internal void @C(i32** %a) nounwind {
+entry:
+ %a_addr = alloca i32** ; <i32***> [#uses=2]
+ %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
+ store i32** %a, i32*** %a_addr
+ %0 = load i32** @G, align 8 ; <i32*> [#uses=1]
+ %1 = load i32*** %a_addr, align 8 ; <i32**> [#uses=1]
+ store i32* %0, i32** %1, align 8
+ br label %return
+
+return: ; preds = %entry
+ ret void
+}
+
+; FIXME: These runlines are wrong, the 'a' points to sometihng reachable
+; from what will be an external global, so it should be +E!
+; RUNX: dsaopt %s -dsa-local -analyze -verify-flags "B:ptr-E"
+; RUNX: dsaopt %s -dsa-local -analyze -verify-flags "B:a-E"
+; RUNX: dsaopt %s -dsa-bu -analyze -verify-flags "B:ptr-E"
+; RUNX: dsaopt %s -dsa-bu -analyze -verify-flags "B:a-E"
+; RUNX: dsaopt %s -dsa-td -analyze -verify-flags "B:ptr-E"
+; RUNX: dsaopt %s -dsa-td -analyze -verify-flags "B:a-E"
+define internal void @B() nounwind {
+entry:
+ %a = alloca i32 ; <i32*> [#uses=1]
+ %ptr = alloca i32* ; <i32**> [#uses=2]
+ %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
+ store i32* %a, i32** %ptr, align 8
+ call void @C(i32** %ptr) nounwind
+ br label %return
+
+return: ; preds = %entry
+ ret void
+}
+
+define internal void @B2() nounwind {
+entry:
+ %a = alloca i32* ; <i32**> [#uses=2]
+ %val = alloca i32 ; <i32*> [#uses=1]
+ %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
+ %0 = load i32** @G, align 8 ; <i32*> [#uses=1]
+ store i32* %0, i32** %a, align 8
+ %1 = load i32** %a, align 8 ; <i32*> [#uses=1]
+ %2 = load i32* %1, align 4 ; <i32> [#uses=1]
+ store i32 %2, i32* %val, align 4
+ br label %return
+
+return: ; preds = %entry
+ ret void
+}
+
+; 'f' is passed to an external function, should always be external.
+;RUN: dsaopt %s -dsa-local -analyze -verify-flags "externalize:f+E"
+;RUN: dsaopt %s -dsa-bu -analyze -verify-flags "externalize:f+E"
+;RUN: dsaopt %s -dsa-td -analyze -verify-flags "externalize:f+E"
+define internal void @externalize(void (i32**)* %f) nounwind {
+entry:
+ %f_addr = alloca void (i32**)* ; <void (i32**)**> [#uses=2]
+ %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
+ store void (i32**)* %f, void (i32**)** %f_addr
+ %0 = load void (i32**)** %f_addr, align 8 ; <void (i32**)*> [#uses=1]
+ call void @external(void (i32**)* %0) nounwind
+ br label %return
+
+return: ; preds = %entry
+ ret void
+}
+
+declare void @external(void (i32**)*)
+
+; 'f' shouldn't be external in local, nothing to cause that yet.
+; However in BU and TD f should point to something external, but not be
+; external itself.
+;RUN: dsaopt %s -dsa-local -analyze -verify-flags "A:f-E"
+;RUN: dsaopt %s -dsa-local -analyze -verify-flags "A:f:0-E"
+;RUN: dsaopt %s -dsa-bu -analyze -verify-flags "A:f-E"
+;RUN: dsaopt %s -dsa-bu -analyze -verify-flags "A:f:0+E"
+;RUN: dsaopt %s -dsa-td -analyze -verify-flags "A:f-E"
+;RUN: dsaopt %s -dsa-td -analyze -verify-flags "A:f:0+E"
+define internal void @A() nounwind {
+entry:
+ %f = alloca void (i32**)* ; <void (i32**)**> [#uses=2]
+ %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
+ store void (i32**)* @C, void (i32**)** %f, align 8
+ %0 = load void (i32**)** %f, align 8 ; <void (i32**)*> [#uses=1]
+ call void @externalize(void (i32**)* %0) nounwind
+ call void @B() nounwind
+ call void @B2() nounwind
+ br label %return
+
+return: ; preds = %entry
+ ret void
+}
Added: poolalloc/trunk/test/dsa/extern/extern_global_escape.c
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/test/dsa/extern/extern_global_escape.c?rev=117589&view=auto
==============================================================================
--- poolalloc/trunk/test/dsa/extern/extern_global_escape.c (added)
+++ poolalloc/trunk/test/dsa/extern/extern_global_escape.c Thu Oct 28 14:53:20 2010
@@ -0,0 +1,25 @@
+//--Make sure we can run DSA on it!
+//RUN: llvm-gcc %s -c --emit-llvm -o - | \
+//RUN: dsaopt -dsa-bu -dsa-td -disable-output
+
+#include <stdio.h>
+
+int * globalptr = NULL;
+
+void externallyVisible(int * ptr)
+{
+ globalptr = ptr;
+}
+
+void usesGlobalPtr()
+{
+ int *ptr = globalptr;
+}
+
+int main()
+{
+ int stack = 1;
+ externallyVisible(&stack);
+ usesGlobalPtr();
+ return 0;
+}
More information about the llvm-commits
mailing list