~ubuntu-branches/ubuntu/quantal/llvm-3.1/quantal

« back to all changes in this revision

Viewing changes to test/Transforms/SimplifyCFG/switch-on-const-select.ll

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2012-03-29 19:09:51 UTC
  • Revision ID: package-import@ubuntu.com-20120329190951-aq83ivog4cg8bxun
Tags: upstream-3.1~svn153643
ImportĀ upstreamĀ versionĀ 3.1~svn153643

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
; RUN: opt < %s -simplifycfg -S | FileCheck %s
 
2
 
 
3
; Test basic folding to a conditional branch.
 
4
define i32 @foo(i64 %x, i64 %y) nounwind {
 
5
; CHECK: @foo
 
6
entry:
 
7
    %eq = icmp eq i64 %x, %y
 
8
    br i1 %eq, label %b, label %switch
 
9
switch:
 
10
    %lt = icmp slt i64 %x, %y
 
11
; CHECK: br i1 %lt, label %a, label %b
 
12
    %qux = select i1 %lt, i32 0, i32 2
 
13
    switch i32 %qux, label %bees [
 
14
        i32 0, label %a
 
15
        i32 1, label %b
 
16
        i32 2, label %b
 
17
    ]
 
18
a:
 
19
    tail call void @bees.a() nounwind
 
20
    ret i32 1
 
21
; CHECK: b:
 
22
; CHECK-NEXT: %retval = phi i32 [ 0, %switch ], [ 2, %entry ]
 
23
b:
 
24
    %retval = phi i32 [0, %switch], [0, %switch], [2, %entry]
 
25
    tail call void @bees.b() nounwind
 
26
    ret i32 %retval
 
27
; CHECK-NOT: bees:
 
28
bees:
 
29
    tail call void @llvm.trap() nounwind
 
30
    unreachable
 
31
}
 
32
 
 
33
; Test basic folding to an unconditional branch.
 
34
define i32 @bar(i64 %x, i64 %y) nounwind {
 
35
; CHECK: @bar
 
36
entry:
 
37
; CHECK-NEXT: entry:
 
38
; CHECK-NEXT: tail call void @bees.a() nounwind
 
39
; CHECK-NEXT: ret i32 0
 
40
    %lt = icmp slt i64 %x, %y
 
41
    %qux = select i1 %lt, i32 0, i32 2
 
42
    switch i32 %qux, label %bees [
 
43
        i32 0, label %a
 
44
        i32 1, label %b
 
45
        i32 2, label %a
 
46
    ]
 
47
a:
 
48
    %retval = phi i32 [0, %entry], [0, %entry], [1, %b]
 
49
    tail call void @bees.a() nounwind
 
50
    ret i32 0
 
51
b:
 
52
    tail call void @bees.b() nounwind
 
53
    br label %a
 
54
bees:
 
55
    tail call void @llvm.trap() nounwind
 
56
    unreachable
 
57
}
 
58
 
 
59
; Test the edge case where both values from the select are the default case.
 
60
define void @bazz(i64 %x, i64 %y) nounwind {
 
61
; CHECK: @bazz
 
62
entry:
 
63
; CHECK-NEXT: entry:
 
64
; CHECK-NEXT: tail call void @bees.b() nounwind
 
65
; CHECK-NEXT: ret void
 
66
    %lt = icmp slt i64 %x, %y
 
67
    %qux = select i1 %lt, i32 10, i32 12
 
68
    switch i32 %qux, label %b [
 
69
        i32 0, label %a
 
70
        i32 1, label %bees
 
71
        i32 2, label %bees
 
72
    ]
 
73
a:
 
74
    tail call void @bees.a() nounwind
 
75
    ret void
 
76
b:
 
77
    tail call void @bees.b() nounwind
 
78
    ret void
 
79
bees:
 
80
    tail call void @llvm.trap()
 
81
    unreachable
 
82
}
 
83
 
 
84
; Test the edge case where both values from the select are equal.
 
85
define void @quux(i64 %x, i64 %y) nounwind {
 
86
; CHECK: @quux
 
87
entry:
 
88
; CHECK-NEXT: entry:
 
89
; CHECK-NEXT: tail call void @bees.a() nounwind
 
90
; CHECK-NEXT: ret void
 
91
    %lt = icmp slt i64 %x, %y
 
92
    %qux = select i1 %lt, i32 0, i32 0
 
93
    switch i32 %qux, label %b [
 
94
        i32 0, label %a
 
95
        i32 1, label %bees
 
96
        i32 2, label %bees
 
97
    ]
 
98
a:
 
99
    tail call void @bees.a() nounwind
 
100
    ret void
 
101
b:
 
102
    tail call void @bees.b() nounwind
 
103
    ret void
 
104
bees:
 
105
    tail call void @llvm.trap()
 
106
    unreachable
 
107
}
 
108
 
 
109
; A final test, for phi node munging.
 
110
define i32 @xyzzy(i64 %x, i64 %y) {
 
111
; CHECK: @xyzzy
 
112
entry:
 
113
    %eq = icmp eq i64 %x, %y
 
114
    br i1 %eq, label %r, label %cont
 
115
cont:
 
116
; CHECK: %lt = icmp slt i64 %x, %y
 
117
    %lt = icmp slt i64 %x, %y
 
118
; CHECK-NEXT: select i1 %lt, i32 -1, i32 1
 
119
    %qux = select i1 %lt, i32 0, i32 2
 
120
    switch i32 %qux, label %bees [
 
121
        i32 0, label %a
 
122
        i32 1, label %r
 
123
        i32 2, label %r
 
124
    ]
 
125
r:
 
126
    %val = phi i32 [0, %entry], [1, %cont], [1, %cont]
 
127
    ret i32 %val
 
128
a:
 
129
    ret i32 -1
 
130
; CHECK-NOT: bees:
 
131
bees:
 
132
    tail call void @llvm.trap()
 
133
    unreachable
 
134
}
 
135
 
 
136
declare void @llvm.trap() nounwind noreturn
 
137
declare void @bees.a() nounwind
 
138
declare void @bees.b() nounwind