xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll (revision 1934c1aa3613fe2ded87ca4cd739694378e92601)
1; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -switch-to-lookup -mtriple=arm -relocation-model=static    < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE
2; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -switch-to-lookup -mtriple=arm -relocation-model=pic       < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE
3; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -switch-to-lookup -mtriple=arm -relocation-model=ropi      < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE
4; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -switch-to-lookup -mtriple=arm -relocation-model=rwpi      < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE
5; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -switch-to-lookup -mtriple=arm -relocation-model=ropi-rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE
6
7; RUN: opt -S -passes='simplifycfg<switch-to-lookup>' -mtriple=arm -relocation-model=static    < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE
8; RUN: opt -S -passes='simplifycfg<switch-to-lookup>' -mtriple=arm -relocation-model=pic       < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE
9; RUN: opt -S -passes='simplifycfg<switch-to-lookup>' -mtriple=arm -relocation-model=ropi      < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE
10; RUN: opt -S -passes='simplifycfg<switch-to-lookup>' -mtriple=arm -relocation-model=rwpi      < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE
11; RUN: opt -S -passes='simplifycfg<switch-to-lookup>' -mtriple=arm -relocation-model=ropi-rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE
12
13; CHECK:       @{{.*}} = private unnamed_addr constant [3 x i32] [i32 1234, i32 5678, i32 15532]
14; ENABLE:      @{{.*}} = private unnamed_addr constant [3 x ptr] [ptr @c1, ptr @c2, ptr @c3]
15; DISABLE-NOT: @{{.*}} = private unnamed_addr constant [3 x ptr] [ptr @c1, ptr @c2, ptr @c3]
16; ENABLE:      @{{.*}} = private unnamed_addr constant [3 x ptr] [ptr @g1, ptr @g2, ptr @g3]
17; DISABLE-NOT: @{{.*}} = private unnamed_addr constant [3 x ptr] [ptr @g1, ptr @g2, ptr @g3]
18; ENABLE:      @{{.*}} = private unnamed_addr constant [3 x ptr] [ptr @f1, ptr @f2, ptr @f3]
19; DISABLE-NOT: @{{.*}} = private unnamed_addr constant [3 x ptr] [ptr @f1, ptr @f2, ptr @f3]
20
21target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
22target triple = "armv7a--none-eabi"
23
24define i32 @test1(i32 %n) {
25entry:
26  switch i32 %n, label %sw.default [
27  i32 0, label %sw.bb
28  i32 1, label %sw.bb1
29  i32 2, label %sw.bb2
30  ]
31
32sw.bb:
33  br label %return
34
35sw.bb1:
36  br label %return
37
38sw.bb2:
39  br label %return
40
41sw.default:
42  br label %return
43
44return:
45  %retval.0 = phi i32 [ 15498, %sw.default ], [ 15532, %sw.bb2 ], [ 5678, %sw.bb1 ], [ 1234, %sw.bb ]
46  ret i32 %retval.0
47}
48
49@c1 = external constant i32, align 4
50@c2 = external constant i32, align 4
51@c3 = external constant i32, align 4
52@c4 = external constant i32, align 4
53
54
55define ptr @test2(i32 %n) {
56entry:
57  switch i32 %n, label %sw.default [
58  i32 0, label %sw.bb
59  i32 1, label %sw.bb1
60  i32 2, label %sw.bb2
61  ]
62
63sw.bb:
64  br label %return
65
66sw.bb1:
67  br label %return
68
69sw.bb2:
70  br label %return
71
72sw.default:
73  br label %return
74
75return:
76  %retval.0 = phi ptr [ @c4, %sw.default ], [ @c3, %sw.bb2 ], [ @c2, %sw.bb1 ], [ @c1, %sw.bb ]
77  ret ptr %retval.0
78}
79
80@g1 = external global i32, align 4
81@g2 = external global i32, align 4
82@g3 = external global i32, align 4
83@g4 = external global i32, align 4
84
85define ptr @test3(i32 %n) {
86entry:
87  switch i32 %n, label %sw.default [
88  i32 0, label %sw.bb
89  i32 1, label %sw.bb1
90  i32 2, label %sw.bb2
91  ]
92
93sw.bb:
94  br label %return
95
96sw.bb1:
97  br label %return
98
99sw.bb2:
100  br label %return
101
102sw.default:
103  br label %return
104
105return:
106  %retval.0 = phi ptr [ @g4, %sw.default ], [ @g3, %sw.bb2 ], [ @g2, %sw.bb1 ], [ @g1, %sw.bb ]
107  ret ptr %retval.0
108}
109
110declare i32 @f1(i32, i32)
111declare i32 @f2(i32, i32)
112declare i32 @f3(i32, i32)
113declare i32 @f4(i32, i32)
114declare i32 @f5(i32, i32)
115
116define i32 @test4(i32 %a, i32 %b, i32 %c) {
117entry:
118  %cmp = icmp eq i32 %a, 1
119  br i1 %cmp, label %cond.end11, label %cond.false
120
121cond.false:
122  %cmp1 = icmp eq i32 %a, 2
123  br i1 %cmp1, label %cond.end11, label %cond.false3
124
125cond.false3:
126  %cmp4 = icmp eq i32 %a, 3
127  br i1 %cmp4, label %cond.end11, label %cond.false6
128
129cond.false6:
130  %cmp7 = icmp eq i32 %a, 4
131  %cond = select i1 %cmp7, ptr @f4, ptr @f5
132  br label %cond.end11
133
134cond.end11:
135  %cond12 = phi ptr [ @f1, %entry ], [ @f2, %cond.false ], [ %cond, %cond.false6 ], [ @f3, %cond.false3 ]
136  %call = call i32 %cond12(i32 %b, i32 %c) #2
137  ret i32 %call
138}
139