Fix test.
[oota-llvm.git] / test / Transforms / FunctionAttrs / 2008-12-31-NoCapture.ll
index 86feb4318c6b0a5757e6bfde64042acd1cb8d2fe..53857f61ce5829192ea942105722bf222d9aeb5a 100644 (file)
@@ -1,5 +1,5 @@
-; RUN: llvm-as < %s | opt -functionattrs | llvm-dis | not grep {nocapture *%%q}
-; RUN: llvm-as < %s | opt -functionattrs | llvm-dis | grep {nocapture *%%p} | count 3
+; RUN: opt < %s -functionattrs -S | not grep {nocapture *%%q}
+; RUN: opt < %s -functionattrs -S | grep {nocapture *%%p} | count 6
 @g = global i32* null          ; <i32**> [#uses=1]
 
 define i32* @c1(i32* %q) {
@@ -16,6 +16,54 @@ define void @c3(i32* %q) {
        ret void
 }
 
+define i1 @c4(i32* %q, i32 %bitno) {
+       %tmp = ptrtoint i32* %q to i32
+       %tmp2 = lshr i32 %tmp, %bitno
+       %bit = trunc i32 %tmp2 to i1
+       br i1 %bit, label %l1, label %l0
+l0:
+       ret i1 0 ; escaping value not caught by def-use chaining.
+l1:
+       ret i1 1 ; escaping value not caught by def-use chaining.
+}
+
+@lookup_table = global [2 x i1] [ i1 0, i1 1 ]
+
+define i1 @c5(i32* %q, i32 %bitno) {
+       %tmp = ptrtoint i32* %q to i32
+       %tmp2 = lshr i32 %tmp, %bitno
+       %bit = and i32 %tmp2, 1
+        ; subtle escape mechanism follows
+       %lookup = getelementptr [2 x i1]* @lookup_table, i32 0, i32 %bit
+       %val = load i1* %lookup
+       ret i1 %val
+}
+
+declare void @throw_if_bit_set(i8*, i8) readonly
+define i1 @c6(i8* %q, i8 %bit) {
+       invoke void @throw_if_bit_set(i8* %q, i8 %bit)
+               to label %ret0 unwind label %ret1
+ret0:
+       ret i1 0
+ret1:
+       ret i1 1
+}
+
+define i1* @lookup_bit(i32* %q, i32 %bitno) readnone nounwind {
+       %tmp = ptrtoint i32* %q to i32
+       %tmp2 = lshr i32 %tmp, %bitno
+       %bit = and i32 %tmp2, 1
+       %lookup = getelementptr [2 x i1]* @lookup_table, i32 0, i32 %bit
+       ret i1* %lookup
+}
+
+define i1 @c7(i32* %q, i32 %bitno) {
+       %ptr = call i1* @lookup_bit(i32* %q, i32 %bitno)
+       %val = load i1* %ptr
+       ret i1 %val
+}
+
+
 define i32 @nc1(i32* %q, i32* %p, i1 %b) {
 e:
        br label %l
@@ -39,3 +87,15 @@ define void @nc3(void ()* %p) {
        call void %p()
        ret void
 }
+
+declare void @external(i8*) readonly nounwind
+define void @nc4(i8* %p) {
+       call void @external(i8* %p)
+       ret void
+}
+
+define void @nc5(void (i8*)* %f, i8* %p) {
+       call void %f(i8* %p) readonly nounwind
+       call void %f(i8* nocapture %p)
+       ret void
+}