1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --scrub-attributes 2; RUN: opt -passes=simplifycfg --switch-to-lookup -S < %s | FileCheck %s 3target triple = "x86_64-unknown-linux-gnu" 4 5@alloc0 = private unnamed_addr constant <{ [2 x i8] }> <{ [2 x i8] c"A1" }>, align 1 6@alloc1 = private unnamed_addr constant <{ [2 x i8] }> <{ [2 x i8] c"B2" }>, align 1 7@alloc2 = private unnamed_addr constant <{ [2 x i8] }> <{ [2 x i8] c"C3" }>, align 1 8 9define { ptr, i64 } @switch_to_lookup_gep(i8 %0) unnamed_addr { 10; CHECK-LABEL: @switch_to_lookup_gep( 11; CHECK-NEXT: start: 12; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [3 x ptr], ptr @switch.table.switch_to_lookup_gep, i32 0, i8 [[TMP0:%.*]] 13; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load ptr, ptr [[SWITCH_GEP]], align 8 14; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, i64 } undef, ptr [[SWITCH_LOAD]], 0 15; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr, i64 } [[TMP1]], i64 1, 1 16; CHECK-NEXT: ret { ptr, i64 } [[TMP2]] 17; 18start: 19 switch i8 %0, label %default [ 20 i8 0, label %bb0 21 i8 1, label %bb1 22 i8 2, label %bb2 23 ] 24 25bb0: 26 br label %end 27 28bb1: 29 br label %end 30 31bb2: 32 br label %end 33 34default: 35 unreachable 36 37end: 38 %.sroa.0.0 = phi ptr [ getelementptr inbounds (<{ [2 x i8] }>, ptr @alloc0, i32 0, i32 0, i32 1), %bb0 ], [ getelementptr inbounds (<{ [2 x i8] }>, ptr @alloc1, i32 0, i32 0, i32 1), %bb1 ], [ getelementptr inbounds (<{ [2 x i8] }>, ptr @alloc2, i32 0, i32 0, i32 1), %bb2 ] 39 %1 = insertvalue { ptr, i64 } undef, ptr %.sroa.0.0, 0 40 %2 = insertvalue { ptr, i64 } %1, i64 1, 1 41 ret { ptr, i64 } %2 42} 43 44define { ptr, i64 } @switch_to_lookup_gep_oob(i8 %0) unnamed_addr { 45; CHECK-LABEL: @switch_to_lookup_gep_oob( 46; CHECK-NEXT: start: 47; CHECK-NEXT: switch i8 [[TMP0:%.*]], label [[DEFAULT:%.*]] [ 48; CHECK-NEXT: i8 0, label [[END:%.*]] 49; CHECK-NEXT: i8 1, label [[BB1:%.*]] 50; CHECK-NEXT: i8 2, label [[BB2:%.*]] 51; CHECK-NEXT: ] 52; CHECK: bb1: 53; CHECK-NEXT: br label [[END]] 54; CHECK: bb2: 55; CHECK-NEXT: br label [[END]] 56; CHECK: default: 57; CHECK-NEXT: unreachable 58; CHECK: end: 59; CHECK-NEXT: [[DOTSROA_0_0:%.*]] = phi ptr [ getelementptr (<{ [2 x i8] }>, ptr @alloc1, i32 0, i32 0, i32 4), [[BB1]] ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc2, i32 0, i32 0, i32 4), [[BB2]] ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc0, i32 0, i32 0, i32 4), [[START:%.*]] ] 60; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, i64 } undef, ptr [[DOTSROA_0_0]], 0 61; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr, i64 } [[TMP1]], i64 1, 1 62; CHECK-NEXT: ret { ptr, i64 } [[TMP2]] 63; 64start: 65 switch i8 %0, label %default [ 66 i8 0, label %bb0 67 i8 1, label %bb1 68 i8 2, label %bb2 69 ] 70 71bb0: 72 br label %end 73 74bb1: 75 br label %end 76 77bb2: 78 br label %end 79 80default: 81 unreachable 82 83end: 84 %.sroa.0.0 = phi ptr [ getelementptr (<{ [2 x i8] }>, ptr @alloc0, i32 0, i32 0, i32 4), %bb0 ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc1, i32 0, i32 0, i32 4), %bb1 ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc2, i32 0, i32 0, i32 4), %bb2 ] 85 %1 = insertvalue { ptr, i64 } undef, ptr %.sroa.0.0, 0 86 %2 = insertvalue { ptr, i64 } %1, i64 1, 1 87 ret { ptr, i64 } %2 88} 89 90define { ptr, i64 } @switch_to_lookup_gep_ptrtoint(i8 %0) unnamed_addr { 91; CHECK-LABEL: @switch_to_lookup_gep_ptrtoint( 92; CHECK-NEXT: start: 93; CHECK-NEXT: switch i8 [[TMP0:%.*]], label [[DEFAULT:%.*]] [ 94; CHECK-NEXT: i8 0, label [[END:%.*]] 95; CHECK-NEXT: i8 1, label [[BB1:%.*]] 96; CHECK-NEXT: i8 2, label [[BB2:%.*]] 97; CHECK-NEXT: ] 98; CHECK: bb1: 99; CHECK-NEXT: br label [[END]] 100; CHECK: bb2: 101; CHECK-NEXT: br label [[END]] 102; CHECK: default: 103; CHECK-NEXT: unreachable 104; CHECK: end: 105; CHECK-NEXT: [[DOTSROA_0_0:%.*]] = phi ptr [ getelementptr (<{ [2 x i8] }>, ptr @alloc1, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), [[BB1]] ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc2, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), [[BB2]] ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc0, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), [[START:%.*]] ] 106; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, i64 } undef, ptr [[DOTSROA_0_0]], 0 107; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr, i64 } [[TMP1]], i64 1, 1 108; CHECK-NEXT: ret { ptr, i64 } [[TMP2]] 109; 110start: 111 switch i8 %0, label %default [ 112 i8 0, label %bb0 113 i8 1, label %bb1 114 i8 2, label %bb2 115 ] 116 117bb0: 118 br label %end 119 120bb1: 121 br label %end 122 123bb2: 124 br label %end 125 126default: 127 unreachable 128 129end: 130 %.sroa.0.0 = phi ptr [ getelementptr (<{ [2 x i8] }>, ptr @alloc0, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), %bb0 ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc1, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), %bb1 ], [ getelementptr (<{ [2 x i8] }>, ptr @alloc2, i32 0, i32 0, i64 ptrtoint (ptr @alloc0 to i64)), %bb2 ] 131 %1 = insertvalue { ptr, i64 } undef, ptr %.sroa.0.0, 0 132 %2 = insertvalue { ptr, i64 } %1, i64 1, 1 133 ret { ptr, i64 } %2 134} 135