[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