1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -S -passes='simplifycfg<sink-common-insts;switch-to-lookup>' < %s | FileCheck %s 3 4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" 5 6define void @pr104567(i8 %x, ptr %f) { 7; CHECK-LABEL: define void @pr104567( 8; CHECK-SAME: i8 [[X:%.*]], ptr [[F:%.*]]) { 9; CHECK-NEXT: [[START:.*:]] 10; CHECK-NEXT: [[Y:%.*]] = alloca [1 x i8], align 1 11; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 1, ptr nonnull [[Y]]) 12; CHECK-NEXT: [[SWITCH_OFFSET:%.*]] = add nsw i8 [[X]], 4 13; CHECK-NEXT: store i8 [[SWITCH_OFFSET]], ptr [[Y]], align 1 14; CHECK-NEXT: call void [[F]](ptr [[Y]]) 15; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 1, ptr nonnull [[Y]]) 16; CHECK-NEXT: ret void 17; 18start: 19 %y = alloca [1 x i8], align 1 20 call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %y) 21 switch i8 %x, label %default.unreachable [ 22 i8 0, label %bb4 23 i8 1, label %bb3 24 i8 2, label %bb2 25 ] 26 27default.unreachable: 28 unreachable 29 30bb4: 31 store i8 4, ptr %y, align 1 32 br label %bb5 33 34bb3: 35 store i8 5, ptr %y, align 1 36 br label %bb5 37 38bb2: 39 store i8 6, ptr %y, align 1 40 br label %bb5 41 42bb5: 43 call void %f(ptr %y) 44 call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %y) 45 ret void 46} 47 48define i64 @dont_make_div_variable(i64 noundef %x, i64 noundef %i) { 49; CHECK-LABEL: define i64 @dont_make_div_variable( 50; CHECK-SAME: i64 noundef [[X:%.*]], i64 noundef [[I:%.*]]) { 51; CHECK-NEXT: [[ENTRY:.*:]] 52; CHECK-NEXT: switch i64 [[I]], label %[[SW_DEFAULT:.*]] [ 53; CHECK-NEXT: i64 9, label %[[SW_BB:.*]] 54; CHECK-NEXT: i64 10, label %[[SW_BB1:.*]] 55; CHECK-NEXT: i64 11, label %[[SW_BB3:.*]] 56; CHECK-NEXT: i64 12, label %[[SW_BB5:.*]] 57; CHECK-NEXT: ] 58; CHECK: [[SW_BB]]: 59; CHECK-NEXT: [[DIV:%.*]] = udiv i64 [[X]], 9 60; CHECK-NEXT: br label %[[RETURN:.*]] 61; CHECK: [[SW_BB1]]: 62; CHECK-NEXT: [[DIV2:%.*]] = udiv i64 [[X]], 10 63; CHECK-NEXT: br label %[[RETURN]] 64; CHECK: [[SW_BB3]]: 65; CHECK-NEXT: [[DIV4:%.*]] = udiv i64 [[X]], 11 66; CHECK-NEXT: br label %[[RETURN]] 67; CHECK: [[SW_BB5]]: 68; CHECK-NEXT: [[DIV7:%.*]] = udiv i64 [[X]], 12 69; CHECK-NEXT: br label %[[RETURN]] 70; CHECK: [[SW_DEFAULT]]: 71; CHECK-NEXT: unreachable 72; CHECK: [[RETURN]]: 73; CHECK-NEXT: [[DIV6:%.*]] = phi i64 [ [[DIV7]], %[[SW_BB5]] ], [ [[DIV4]], %[[SW_BB3]] ], [ [[DIV2]], %[[SW_BB1]] ], [ [[DIV]], %[[SW_BB]] ] 74; CHECK-NEXT: ret i64 [[DIV6]] 75; 76entry: 77 switch i64 %i, label %sw.default [ 78 i64 9, label %sw.bb 79 i64 10, label %sw.bb1 80 i64 11, label %sw.bb3 81 i64 12, label %sw.bb5 82 ] 83 84sw.bb: 85 %div = udiv i64 %x, 9 86 br label %return 87 88sw.bb1: 89 %div2 = udiv i64 %x, 10 90 br label %return 91 92sw.bb3: 93 %div4 = udiv i64 %x, 11 94 br label %return 95 96sw.bb5: 97 %div6 = udiv i64 %x, 12 98 br label %return 99 100sw.default: 101 unreachable 102 103return: 104 %retval.0 = phi i64 [ %div6, %sw.bb5 ], [ %div4, %sw.bb3 ], [ %div2, %sw.bb1 ], [ %div, %sw.bb ] 105 ret i64 %retval.0 106} 107 108define i64 @okay_to_make_div_variable(i64 noundef %x, i64 noundef %i) { 109; CHECK-LABEL: define i64 @okay_to_make_div_variable( 110; CHECK-SAME: i64 noundef [[X:%.*]], i64 noundef [[I:%.*]]) { 111; CHECK-NEXT: [[ENTRY:.*:]] 112; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = sub nsw i64 [[I]], 9 113; CHECK-NEXT: [[SWITCH_OFFSET:%.*]] = add nsw i64 [[SWITCH_TABLEIDX]], 9 114; CHECK-NEXT: [[DIV6:%.*]] = udiv i64 [[SWITCH_OFFSET]], [[X]] 115; CHECK-NEXT: ret i64 [[DIV6]] 116; 117entry: 118 switch i64 %i, label %sw.default [ 119 i64 9, label %sw.bb 120 i64 10, label %sw.bb1 121 i64 11, label %sw.bb3 122 i64 12, label %sw.bb5 123 ] 124 125sw.bb: 126 %div = udiv i64 9, %x 127 br label %return 128 129sw.bb1: 130 %div2 = udiv i64 10, %x 131 br label %return 132 133sw.bb3: 134 %div4 = udiv i64 11, %x 135 br label %return 136 137sw.bb5: 138 %div6 = udiv i64 12, %x 139 br label %return 140 141sw.default: 142 unreachable 143 144return: 145 %retval.0 = phi i64 [ %div6, %sw.bb5 ], [ %div4, %sw.bb3 ], [ %div2, %sw.bb1 ], [ %div, %sw.bb ] 146 ret i64 %retval.0 147} 148