Allow call-slop optzn for destinations with a suitable dereferenceable attribute
[oota-llvm.git] / test / Feature / weak_constant.ll
1 ; RUN: opt < %s -std-compile-opts -S > %t
2 ; RUN:   grep undef %t | count 1
3 ; RUN:   grep 5 %t | count 1
4 ; RUN:   grep 7 %t | count 1
5 ; RUN:   grep 9 %t | count 1
6
7         %0 = type { i32, i32 }          ; type %0
8 @a = weak constant i32 undef            ; <i32*> [#uses=1]
9 @b = weak constant i32 5                ; <i32*> [#uses=1]
10 @c = weak constant %0 { i32 7, i32 9 }          ; <%0*> [#uses=1]
11
12 define i32 @la() {
13         %v = load i32* @a               ; <i32> [#uses=1]
14         ret i32 %v
15 }
16
17 define i32 @lb() {
18         %v = load i32* @b               ; <i32> [#uses=1]
19         ret i32 %v
20 }
21
22 define i32 @lc() {
23         %g = getelementptr %0* @c, i32 0, i32 0         ; <i32*> [#uses=1]
24         %u = load i32* %g               ; <i32> [#uses=1]
25         %h = getelementptr %0* @c, i32 0, i32 1         ; <i32*> [#uses=1]
26         %v = load i32* %h               ; <i32> [#uses=1]
27         %r = add i32 %u, %v
28         ret i32 %r
29 }
30
31 define i32 @f() {
32         %u = call i32 @la()             ; <i32> [#uses=1]
33         %v = call i32 @lb()             ; <i32> [#uses=1]
34         %w = call i32 @lc()             ; <i32> [#uses=1]
35         %r = add i32 %u, %v             ; <i32> [#uses=1]
36         %s = add i32 %r, %w             ; <i32> [#uses=1]
37         ret i32 %s
38 }