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