1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s | FileCheck %s 3 4; RUN: opt -passes='simplifycfg<sink-common-insts;hoist-common-insts>,verify' -S %s | FileCheck %s 5 6declare void @clobber1() 7declare void @clobber2() 8 9define void @sink(ptr %arg, i1 %c) { 10; CHECK-LABEL: define void @sink( 11; CHECK-SAME: ptr [[ARG:%.*]], i1 [[C:%.*]]) { 12; CHECK-NEXT: bb: 13; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]] 14; CHECK: then: 15; CHECK-NEXT: call void @clobber1() 16; CHECK-NEXT: store ptr null, ptr [[ARG]], align 8 17; CHECK-NEXT: br label [[EXIT:%.*]] 18; CHECK: else: 19; CHECK-NEXT: call void @clobber2() 20; CHECK-NEXT: store ptr null, ptr [[ARG]], align 8, !mmra [[META0:![0-9]+]] 21; CHECK-NEXT: br label [[EXIT]] 22; CHECK: exit: 23; CHECK-NEXT: ret void 24; 25bb: 26 br i1 %c, label %then, label %else 27 28then: 29 call void @clobber1() 30 store ptr null, ptr %arg, align 8 31 br label %exit 32 33else: 34 call void @clobber2() 35 store ptr null, ptr %arg, align 8, !mmra !0 36 br label %exit 37 38exit: 39 ret void 40} 41 42define void @hoist_store(ptr %arg, i1 %c) { 43; CHECK-LABEL: define void @hoist_store( 44; CHECK-SAME: ptr [[ARG:%.*]], i1 [[C:%.*]]) { 45; CHECK-NEXT: bb: 46; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]] 47; CHECK: then: 48; CHECK-NEXT: store ptr null, ptr [[ARG]], align 8 49; CHECK-NEXT: call void @clobber1() 50; CHECK-NEXT: br label [[EXIT:%.*]] 51; CHECK: else: 52; CHECK-NEXT: store ptr null, ptr [[ARG]], align 8, !mmra [[META0]] 53; CHECK-NEXT: call void @clobber2() 54; CHECK-NEXT: br label [[EXIT]] 55; CHECK: exit: 56; CHECK-NEXT: ret void 57; 58bb: 59 br i1 %c, label %then, label %else 60 61then: 62 store ptr null, ptr %arg, align 8 63 call void @clobber1() 64 br label %exit 65 66else: 67 store ptr null, ptr %arg, align 8, !mmra !0 68 call void @clobber2() 69 br label %exit 70 71exit: 72 ret void 73} 74 75define ptr @sink_load(ptr %arg, i1 %c) { 76; CHECK-LABEL: define ptr @sink_load( 77; CHECK-SAME: ptr [[ARG:%.*]], i1 [[C:%.*]]) { 78; CHECK-NEXT: bb: 79; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]] 80; CHECK: then: 81; CHECK-NEXT: call void @clobber1() 82; CHECK-NEXT: [[L1:%.*]] = load ptr, ptr [[ARG]], align 8 83; CHECK-NEXT: br label [[EXIT:%.*]] 84; CHECK: else: 85; CHECK-NEXT: call void @clobber2() 86; CHECK-NEXT: [[L2:%.*]] = load ptr, ptr [[ARG]], align 8, !mmra [[META0]] 87; CHECK-NEXT: br label [[EXIT]] 88; CHECK: exit: 89; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[L1]], [[THEN]] ], [ [[L2]], [[ELSE]] ] 90; CHECK-NEXT: ret ptr [[P]] 91; 92bb: 93 br i1 %c, label %then, label %else 94 95then: 96 call void @clobber1() 97 %l1 = load ptr, ptr %arg, align 8 98 br label %exit 99 100else: 101 call void @clobber2() 102 %l2 = load ptr, ptr %arg, align 8, !mmra !0 103 br label %exit 104 105exit: 106 %p = phi ptr [ %l1, %then ], [ %l2, %else ] 107 ret ptr %p 108} 109 110define ptr @hoist_load(ptr %arg, i1 %c) { 111; CHECK-LABEL: define ptr @hoist_load( 112; CHECK-SAME: ptr [[ARG:%.*]], i1 [[C:%.*]]) { 113; CHECK-NEXT: bb: 114; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]] 115; CHECK: then: 116; CHECK-NEXT: [[L1:%.*]] = load ptr, ptr [[ARG]], align 8 117; CHECK-NEXT: call void @clobber1() 118; CHECK-NEXT: br label [[EXIT:%.*]] 119; CHECK: else: 120; CHECK-NEXT: [[L2:%.*]] = load ptr, ptr [[ARG]], align 8, !mmra [[META0]] 121; CHECK-NEXT: call void @clobber2() 122; CHECK-NEXT: br label [[EXIT]] 123; CHECK: exit: 124; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[L1]], [[THEN]] ], [ [[L2]], [[ELSE]] ] 125; CHECK-NEXT: ret ptr [[P]] 126; 127bb: 128 br i1 %c, label %then, label %else 129 130then: 131 %l1 = load ptr, ptr %arg, align 8 132 call void @clobber1() 133 br label %exit 134 135else: 136 %l2 = load ptr, ptr %arg, align 8, !mmra !0 137 call void @clobber2() 138 br label %exit 139 140exit: 141 %p = phi ptr [ %l1, %then ], [ %l2, %else ] 142 ret ptr %p 143} 144 145 146!0 = !{!"foo", !"bar"} 147 148;. 149; CHECK: [[META0]] = !{!"foo", !"bar"} 150;. 151