Move load_to_switch.ll to test/CodeGen/SPARC/
[oota-llvm.git] / test / CodeGen / SPARC / load_to_switch.ll
1 ; RUN: llc -march=sparc < %s | FileCheck %s
2
3 ; Check that all the switches turned into lookup tables by SimplifyCFG are
4 ; turned back into switches for targets that don't like lookup tables.
5
6 @.str = private unnamed_addr constant [4 x i8] c"foo\00", align 1
7 @.str1 = private unnamed_addr constant [4 x i8] c"bar\00", align 1
8 @.str2 = private unnamed_addr constant [4 x i8] c"baz\00", align 1
9 @.str3 = private unnamed_addr constant [4 x i8] c"qux\00", align 1
10 @.str4 = private unnamed_addr constant [6 x i8] c"error\00", align 1
11 @switch.table = private unnamed_addr constant [7 x i32] [i32 55, i32 123, i32 0, i32 -1, i32 27, i32 62, i32 1]
12 @switch.table1 = private unnamed_addr constant [4 x i8] c"*\09X\05"
13 @switch.table2 = private unnamed_addr constant [4 x float] [float 0x40091EB860000000, float 0x3FF3BE76C0000000, float 0x4012449BA0000000, float 0x4001AE1480000000]
14 @switch.table3 = private unnamed_addr constant [4 x i8*] [i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8]* @.str1, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8]* @.str2, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8]* @.str3, i64 0, i64 0)]
15
16 define i32 @f(i32 %c)  {
17 entry:
18   %switch.tableidx = sub i32 %c, 42
19   %0 = icmp ult i32 %switch.tableidx, 7
20   br i1 %0, label %switch.lookup, label %return
21
22 switch.lookup:
23   %switch.gep = getelementptr inbounds [7 x i32]* @switch.table, i32 0, i32 %switch.tableidx
24   %switch.load = load i32* %switch.gep
25   ret i32 %switch.load
26
27 return:
28   ret i32 15
29
30 ; CHECK: f:
31 ; CHECK: %switch.lookup
32 ; CHECK-NOT: sethi %hi(.Lswitch.table)
33 }
34
35 declare void @dummy(i8 signext, float)
36
37 define void @h(i32 %x) {
38 entry:
39   %switch.tableidx = sub i32 %x, 0
40   %0 = icmp ult i32 %switch.tableidx, 4
41   br i1 %0, label %switch.lookup, label %sw.epilog
42
43 switch.lookup:
44   %switch.gep = getelementptr inbounds [4 x i8]* @switch.table1, i32 0, i32 %switch.tableidx
45   %switch.load = load i8* %switch.gep
46   %switch.gep1 = getelementptr inbounds [4 x float]* @switch.table2, i32 0, i32 %switch.tableidx
47   %switch.load2 = load float* %switch.gep1
48   br label %sw.epilog
49
50 sw.epilog:
51   %a.0 = phi i8 [ %switch.load, %switch.lookup ], [ 7, %entry ]
52   %b.0 = phi float [ %switch.load2, %switch.lookup ], [ 0x4023FAE140000000, %entry ]
53   call void @dummy(i8 signext %a.0, float %b.0)
54   ret void
55
56 ; CHECK: h:
57 ; CHECK: %switch.lookup
58 ; CHECK-NOT: sethi %hi(.Lswitch.table{{[0-9]}})
59 ; CHECK-NOT: sethi %hi(.Lswitch.table{{[0-9]}})
60 }
61
62 define i8* @foostring(i32 %x) {
63 entry:
64   %switch.tableidx = sub i32 %x, 0
65   %0 = icmp ult i32 %switch.tableidx, 4
66   br i1 %0, label %switch.lookup, label %return
67
68 switch.lookup:
69   %switch.gep = getelementptr inbounds [4 x i8*]* @switch.table3, i32 0, i32 %switch.tableidx
70   %switch.load = load i8** %switch.gep
71   ret i8* %switch.load
72
73 return:
74   ret i8* getelementptr inbounds ([6 x i8]* @.str4, i64 0, i64 0)
75
76 ; CHECK: foostring:
77 ; CHECK: %switch.lookup
78 ; CHECK-NOT: sethi %hi(.Lswitch.table3)
79 }
80
81 ; CHECK-NOT: .Lswitch.table
82 ; CHECK-NOT: .Lswitch.table1
83 ; CHECK-NOT: .Lswitch.table2
84 ; CHECK-NOT: .Lswitch.table3