1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s 3 4; int foo1_with_default(int a) { 5; switch(a) { 6; case 10: 7; return 10; 8; case 20: 9; return 2; 10; } 11; return 4; 12; } 13 14define i32 @foo1_with_default(i32 %a) { 15; CHECK-LABEL: @foo1_with_default( 16; CHECK-NEXT: entry: 17; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = icmp eq i32 [[A:%.*]], 20 18; CHECK-NEXT: [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP]], i32 2, i32 4 19; CHECK-NEXT: [[SWITCH_SELECTCMP1:%.*]] = icmp eq i32 [[A]], 10 20; CHECK-NEXT: [[SWITCH_SELECT2:%.*]] = select i1 [[SWITCH_SELECTCMP1]], i32 10, i32 [[SWITCH_SELECT]] 21; CHECK-NEXT: ret i32 [[SWITCH_SELECT2]] 22; 23entry: 24 switch i32 %a, label %sw.epilog [ 25 i32 10, label %sw.bb 26 i32 20, label %sw.bb1 27 ] 28 29sw.bb: 30 br label %return 31 32sw.bb1: 33 br label %return 34 35sw.epilog: 36 br label %return 37 38return: 39 %retval.0 = phi i32 [ 4, %sw.epilog ], [ 2, %sw.bb1 ], [ 10, %sw.bb ] 40 ret i32 %retval.0 41} 42 43; Same as above, but both cases have the same value. 44define i32 @same_value(i32 %a) { 45; CHECK-LABEL: @same_value( 46; CHECK-NEXT: entry: 47; CHECK-NEXT: [[SWITCH_SELECTCMP_CASE1:%.*]] = icmp eq i32 [[A:%.*]], 10 48; CHECK-NEXT: [[SWITCH_SELECTCMP_CASE2:%.*]] = icmp eq i32 [[A]], 20 49; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = or i1 [[SWITCH_SELECTCMP_CASE1]], [[SWITCH_SELECTCMP_CASE2]] 50; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[SWITCH_SELECTCMP]], i32 10, i32 4 51; CHECK-NEXT: ret i32 [[TMP0]] 52; 53entry: 54 switch i32 %a, label %sw.epilog [ 55 i32 10, label %sw.bb 56 i32 20, label %sw.bb 57 ] 58 59sw.bb: 60 br label %return 61 62sw.epilog: 63 br label %return 64 65return: 66 %retval.0 = phi i32 [ 4, %sw.epilog ], [ 10, %sw.bb ] 67 ret i32 %retval.0 68} 69