1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -S -simplifycfg -simplifycfg-require-and-preserve-domtree=1 | FileCheck %s 3 4define void @callbr_duplicate_dest() { 5; CHECK-LABEL: @callbr_duplicate_dest( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: callbr void asm sideeffect "", "!i"() 8; CHECK-NEXT: to label [[BB:%.*]] [label %bb] 9; CHECK: bb: 10; CHECK-NEXT: ret void 11; 12entry: 13 callbr void asm sideeffect "", "!i"() 14 to label %bb [label %bb] 15 16bb: 17 ret void 18} 19 20; TODO: Can fold to a duplicate callbr destination. 21define void @callbr_can_fold_to_duplicate_dest1() { 22; CHECK-LABEL: @callbr_can_fold_to_duplicate_dest1( 23; CHECK-NEXT: entry: 24; CHECK-NEXT: callbr void asm sideeffect "", "!i"() 25; CHECK-NEXT: to label [[BB2:%.*]] [label %common.ret] 26; CHECK: common.ret: 27; CHECK-NEXT: ret void 28; CHECK: bb2: 29; CHECK-NEXT: br label [[COMMON_RET:%.*]] 30; 31entry: 32 callbr void asm sideeffect "", "!i"() 33 to label %bb2 [label %bb1] 34 35bb1: 36 ret void 37 38bb2: 39 ret void 40} 41 42; TODO: Can fold to a duplicate callbr destination. 43define void @callbr_can_fold_to_duplicate_dest2() { 44; CHECK-LABEL: @callbr_can_fold_to_duplicate_dest2( 45; CHECK-NEXT: entry: 46; CHECK-NEXT: callbr void asm sideeffect "", "!i,!i"() 47; CHECK-NEXT: to label [[COMMON_RET:%.*]] [label [[BB2:%.*]], label %bb3] 48; CHECK: common.ret: 49; CHECK-NEXT: ret void 50; CHECK: bb2: 51; CHECK-NEXT: br label [[COMMON_RET]] 52; CHECK: bb3: 53; CHECK-NEXT: br label [[COMMON_RET]] 54; 55entry: 56 callbr void asm sideeffect "", "!i,!i"() 57 to label %bb1 [label %bb2, label %bb3] 58 59bb1: 60 ret void 61 62bb2: 63 ret void 64 65bb3: 66 ret void 67} 68