gn build: Extract git() and git_out() functions in sync script
[llvm-complete.git] / test / Transforms / FunctionAttrs / noalias_returned.ll
blob2cffec7f2e7ce605d528f5ed1dfc6aa8eec7a892
1 ; RUN: opt -S -attributor -attributor-disable=false < %s | FileCheck %s
3 ; TEST 1 - negative.
5 ; void *G;
6 ; void *foo(){
7 ;   void *V = malloc(4);
8 ;   G = V;
9 ;   return V;
10 ; }
12 @G = external global i8*
14 ; CHECK: define i8* @foo()
15 define i8* @foo() {
16   %1 = tail call noalias i8* @malloc(i64 4)
17   store i8* %1, i8** @G, align 8
18   ret i8* %1
21 declare noalias i8* @malloc(i64)
23 ; TEST 2
24 ; call noalias function in return instruction.
26 ; CHECK: define noalias i8* @return_noalias()
27 define i8* @return_noalias(){
28   %1 = tail call noalias i8* @malloc(i64 4)
29   ret i8* %1
32 declare i8* @alias()
34 ; TEST 3
35 ; CHECK: define i8* @call_alias()
36 ; CHECK-NOT: noalias
37 define i8* @call_alias(){
38   %1 = tail call i8* @alias()
39   ret i8* %1
42 ; TEST 4
43 ; void *baz();
44 ; void *foo(int a);
46 ; void *bar()  {
47 ;   foo(0);
48 ;    return baz();
49 ; }
51 ; void *foo(int a)  {
52 ;   if (a)
53 ;   bar();
54 ;   return malloc(4);
55 ; }
57 ; CHECK: define i8* @bar()
58 define i8* @bar() nounwind uwtable {
59   %1 = tail call i8* (...) @baz()
60   ret i8* %1
63 ; CHECK: define noalias i8* @foo1(i32 %0)
64 define i8* @foo1(i32 %0) nounwind uwtable {
65   %2 = icmp eq i32 %0, 0
66   br i1 %2, label %5, label %3
68 3:                                                ; preds = %1
69   %4 = tail call i8* (...) @baz()
70   br label %5
72 5:                                                ; preds = %1, %3
73   %6 = tail call noalias i8* @malloc(i64 4)
74   ret i8* %6
77 declare i8* @baz(...) nounwind uwtable
79 ; TEST 5
81 ; Returning global pointer. Should not be noalias.
82 ; CHECK: define nonnull align 8 dereferenceable(8) i8** @getter()
83 define i8** @getter() {
84   ret i8** @G
87 ; Returning global pointer. Should not be noalias.
88 ; CHECK: define nonnull align 8 dereferenceable(8) i8** @calle1()
89 define i8** @calle1(){
90   %1 = call i8** @getter()
91   ret i8** %1
94 ; TEST 6
95 declare noalias i8* @strdup(i8* nocapture) nounwind
97 ; CHECK: define noalias i8* @test6()
98 define i8* @test6() nounwind uwtable ssp {
99   %x = alloca [2 x i8], align 1
100   %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %x, i64 0, i64 0
101   store i8 97, i8* %arrayidx, align 1
102   %arrayidx1 = getelementptr inbounds [2 x i8], [2 x i8]* %x, i64 0, i64 1
103   store i8 0, i8* %arrayidx1, align 1
104   %call = call noalias i8* @strdup(i8* %arrayidx) nounwind
105   ret i8* %call
108 ; TEST 7
110 ; CHECK: define noalias i8* @test7()
111 define i8* @test7() nounwind {
112 entry:
113   %A = call noalias i8* @malloc(i64 4) nounwind
114   %tobool = icmp eq i8* %A, null
115   br i1 %tobool, label %return, label %if.end
117 if.end:
118   store i8 7, i8* %A
119   br label %return
121 return:
122   %retval.0 = phi i8* [ %A, %if.end ], [ null, %entry ]
123   ret i8* %retval.0
126 ; TEST 8
128 ; CHECK: define noalias i8* @test8(i32* %0)
129 define i8* @test8(i32* %0) nounwind uwtable {
130   %2 = tail call noalias i8* @malloc(i64 4)
131   %3 = icmp ne i32* %0, null
132   br i1 %3, label %4, label %5
134 4:                                                ; preds = %1
135   store i8 10, i8* %2
136   br label %5
138 5:                                                ; preds = %1, %4
139   ret i8* %2