Fix codegen for references to available_externally symbols. This fixes
[oota-llvm.git] / test / CodeGen / PowerPC / available-externally.ll
1 ; RUN: llvm-as < %s | llc | grep {bl L_exact_log2.stub}
2 ; PR4482
3 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
4 target triple = "powerpc-apple-darwin8"
5
6 define i32 @foo(i64 %x) nounwind {
7 entry:
8         %x_addr = alloca i64            ; <i64*> [#uses=2]
9         %retval = alloca i32            ; <i32*> [#uses=2]
10         %0 = alloca i32         ; <i32*> [#uses=2]
11         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
12         store i64 %x, i64* %x_addr
13         %1 = load i64* %x_addr, align 8         ; <i64> [#uses=1]
14         %2 = call i32 @exact_log2(i64 %1) nounwind              ; <i32> [#uses=1]
15         store i32 %2, i32* %0, align 4
16         %3 = load i32* %0, align 4              ; <i32> [#uses=1]
17         store i32 %3, i32* %retval, align 4
18         br label %return
19
20 return:         ; preds = %entry
21         %retval1 = load i32* %retval            ; <i32> [#uses=1]
22         ret i32 %retval1
23 }
24
25 define available_externally i32 @exact_log2(i64 %x) nounwind {
26 entry:
27         %x_addr = alloca i64            ; <i64*> [#uses=6]
28         %retval = alloca i32            ; <i32*> [#uses=2]
29         %iftmp.0 = alloca i32           ; <i32*> [#uses=3]
30         %0 = alloca i32         ; <i32*> [#uses=2]
31         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
32         store i64 %x, i64* %x_addr
33         %1 = load i64* %x_addr, align 8         ; <i64> [#uses=1]
34         %2 = sub i64 0, %1              ; <i64> [#uses=1]
35         %3 = load i64* %x_addr, align 8         ; <i64> [#uses=1]
36         %4 = and i64 %2, %3             ; <i64> [#uses=1]
37         %5 = load i64* %x_addr, align 8         ; <i64> [#uses=1]
38         %6 = icmp ne i64 %4, %5         ; <i1> [#uses=1]
39         br i1 %6, label %bb2, label %bb
40
41 bb:             ; preds = %entry
42         %7 = load i64* %x_addr, align 8         ; <i64> [#uses=1]
43         %8 = icmp eq i64 %7, 0          ; <i1> [#uses=1]
44         br i1 %8, label %bb2, label %bb1
45
46 bb1:            ; preds = %bb
47         %9 = load i64* %x_addr, align 8         ; <i64> [#uses=1]
48         %10 = call i64 @llvm.cttz.i64(i64 %9)           ; <i64> [#uses=1]
49         %11 = trunc i64 %10 to i32              ; <i32> [#uses=1]
50         store i32 %11, i32* %iftmp.0, align 4
51         br label %bb3
52
53 bb2:            ; preds = %bb, %entry
54         store i32 -1, i32* %iftmp.0, align 4
55         br label %bb3
56
57 bb3:            ; preds = %bb2, %bb1
58         %12 = load i32* %iftmp.0, align 4               ; <i32> [#uses=1]
59         store i32 %12, i32* %0, align 4
60         %13 = load i32* %0, align 4             ; <i32> [#uses=1]
61         store i32 %13, i32* %retval, align 4
62         br label %return
63
64 return:         ; preds = %bb3
65         %retval4 = load i32* %retval            ; <i32> [#uses=1]
66         ret i32 %retval4
67 }
68
69 declare i64 @llvm.cttz.i64(i64) nounwind readnone