1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=simplifycfg,adce -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s 3 4declare void @f1() 5 6declare void @f2() 7 8declare void @f3() 9 10declare void @f4() 11 12define i32 @test1(i32 %X, i1 %D) { 13; CHECK-LABEL: @test1( 14; CHECK-NEXT: E: 15; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], 0 16; CHECK-NEXT: br i1 [[C]], label [[B:%.*]], label [[F:%.*]] 17; CHECK: common.ret: 18; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 345, [[B]] ], [ 123, [[F]] ] 19; CHECK-NEXT: ret i32 [[COMMON_RET_OP]] 20; CHECK: B: 21; CHECK-NEXT: call void @f2() 22; CHECK-NEXT: br label [[COMMON_RET:%.*]] 23; CHECK: F: 24; CHECK-NEXT: call void @f3() 25; CHECK-NEXT: br label [[COMMON_RET]] 26; 27E: 28 %C = icmp eq i32 %X, 0 ; <i1> [#uses=2] 29 br i1 %C, label %T, label %F 30T: ; preds = %A, %E 31 br i1 %C, label %B, label %A 32A: ; preds = %T 33 call void @f1( ) 34 br i1 %D, label %T, label %F 35B: ; preds = %T 36 call void @f2( ) 37 ret i32 345 38F: ; preds = %A, %E 39 call void @f3( ) 40 ret i32 123 41} 42 43define i32 @test2(i32 %X, i1 %D) { 44; CHECK-LABEL: @test2( 45; CHECK-NEXT: E: 46; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], 0 47; CHECK-NEXT: br i1 [[C]], label [[B:%.*]], label [[F:%.*]] 48; CHECK: common.ret: 49; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 345, [[B]] ], [ 123, [[F]] ] 50; CHECK-NEXT: ret i32 [[COMMON_RET_OP]] 51; CHECK: B: 52; CHECK-NEXT: call void @f2() 53; CHECK-NEXT: br label [[COMMON_RET:%.*]] 54; CHECK: F: 55; CHECK-NEXT: call void @f3() 56; CHECK-NEXT: br label [[COMMON_RET]] 57; 58E: 59 %C = icmp eq i32 %X, 0 ; <i1> [#uses=2] 60 br i1 %C, label %T, label %F 61T: ; preds = %A, %E 62 %P = phi i1 [ true, %E ], [ %C, %A ] ; <i1> [#uses=1] 63 br i1 %P, label %B, label %A 64A: ; preds = %T 65 call void @f1( ) 66 br i1 %D, label %T, label %F 67B: ; preds = %T 68 call void @f2( ) 69 ret i32 345 70F: ; preds = %A, %E 71 call void @f3( ) 72 ret i32 123 73} 74 75define i32 @test3(i32 %X, i1 %D, ptr %AP, ptr %BP) { 76; CHECK-LABEL: @test3( 77; CHECK-NEXT: E: 78; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], 0 79; CHECK-NEXT: br i1 [[C]], label [[B_CRITEDGE:%.*]], label [[F:%.*]] 80; CHECK: common.ret: 81; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = phi i32 [ 345, [[B_CRITEDGE]] ], [ 123, [[F]] ] 82; CHECK-NEXT: ret i32 [[COMMON_RET_OP]] 83; CHECK: B.critedge: 84; CHECK-NEXT: call void @f3() 85; CHECK-NEXT: [[XX_C:%.*]] = load i32, ptr [[AP:%.*]], align 4 86; CHECK-NEXT: store i32 [[XX_C]], ptr [[BP:%.*]], align 4 87; CHECK-NEXT: call void @f2() 88; CHECK-NEXT: br label [[COMMON_RET:%.*]] 89; CHECK: F: 90; CHECK-NEXT: call void @f3() 91; CHECK-NEXT: br label [[COMMON_RET]] 92; 93E: 94 %C = icmp eq i32 %X, 0 ; <i1> [#uses=2] 95 br i1 %C, label %T, label %F 96T: ; preds = %A, %E 97 call void @f3( ) 98 %XX = load i32, ptr %AP ; <i32> [#uses=1] 99 store i32 %XX, ptr %BP 100 br i1 %C, label %B, label %A 101A: ; preds = %T 102 call void @f1( ) 103 br i1 %D, label %T, label %F 104B: ; preds = %T 105 call void @f2( ) 106 ret i32 345 107F: ; preds = %A, %E 108 call void @f3( ) 109 ret i32 123 110} 111