summaryrefslogtreecommitdiff
path: root/test/Transforms/CodeGenPrepare/load_to_switch.ll
blob: 76a57c6b50ef43cbd42a66bec0dadcbde3300b4a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
; RUN: llc -march=sparc  < %s | FileCheck %s

; Check that all the switches turned into lookup tables by SimplifyCFG are
; turned back into switches for targets that don't like lookup tables.

@.str = private unnamed_addr constant [4 x i8] c"foo\00", align 1
@.str1 = private unnamed_addr constant [4 x i8] c"bar\00", align 1
@.str2 = private unnamed_addr constant [4 x i8] c"baz\00", align 1
@.str3 = private unnamed_addr constant [4 x i8] c"qux\00", align 1
@.str4 = private unnamed_addr constant [6 x i8] c"error\00", align 1
@switch.table = private unnamed_addr constant [7 x i32] [i32 55, i32 123, i32 0, i32 -1, i32 27, i32 62, i32 1]
@switch.table1 = private unnamed_addr constant [4 x i8] c"*\09X\05"
@switch.table2 = private unnamed_addr constant [4 x float] [float 0x40091EB860000000, float 0x3FF3BE76C0000000, float 0x4012449BA0000000, float 0x4001AE1480000000]
@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)]

define i32 @f(i32 %c)  {
entry:
  %switch.tableidx = sub i32 %c, 42
  %0 = icmp ult i32 %switch.tableidx, 7
  br i1 %0, label %switch.lookup, label %return

switch.lookup:
  %switch.gep = getelementptr inbounds [7 x i32]* @switch.table, i32 0, i32 %switch.tableidx
  %switch.load = load i32* %switch.gep
  ret i32 %switch.load

return:
  ret i32 15

; CHECK: f:
; CHECK: %switch.lookup
; CHECK-NOT: sethi %hi(.Lswitch.table)
}

declare void @dummy(i8 signext, float)

define void @h(i32 %x) {
entry:
  %switch.tableidx = sub i32 %x, 0
  %0 = icmp ult i32 %switch.tableidx, 4
  br i1 %0, label %switch.lookup, label %sw.epilog

switch.lookup:
  %switch.gep = getelementptr inbounds [4 x i8]* @switch.table1, i32 0, i32 %switch.tableidx
  %switch.load = load i8* %switch.gep
  %switch.gep1 = getelementptr inbounds [4 x float]* @switch.table2, i32 0, i32 %switch.tableidx
  %switch.load2 = load float* %switch.gep1
  br label %sw.epilog

sw.epilog:
  %a.0 = phi i8 [ %switch.load, %switch.lookup ], [ 7, %entry ]
  %b.0 = phi float [ %switch.load2, %switch.lookup ], [ 0x4023FAE140000000, %entry ]
  call void @dummy(i8 signext %a.0, float %b.0)
  ret void

; CHECK: h:
; CHECK: %switch.lookup
; CHECK-NOT: sethi %hi(.Lswitch.table{{[0-9]}})
; CHECK-NOT: sethi %hi(.Lswitch.table{{[0-9]}})
}

define i8* @foostring(i32 %x) {
entry:
  %switch.tableidx = sub i32 %x, 0
  %0 = icmp ult i32 %switch.tableidx, 4
  br i1 %0, label %switch.lookup, label %return

switch.lookup:
  %switch.gep = getelementptr inbounds [4 x i8*]* @switch.table3, i32 0, i32 %switch.tableidx
  %switch.load = load i8** %switch.gep
  ret i8* %switch.load

return:
  ret i8* getelementptr inbounds ([6 x i8]* @.str4, i64 0, i64 0)

; CHECK: foostring:
; CHECK: %switch.lookup
; CHECK-NOT: sethi %hi(.Lswitch.table3)
}

; CHECK-NOT: .Lswitch.table
; CHECK-NOT: .Lswitch.table1
; CHECK-NOT: .Lswitch.table2
; CHECK-NOT: .Lswitch.table3