1; RUN: llvm-extract -bb 'foo:if;then;else' -bb 'bar:bb14;bb20' -S %s | FileCheck %s 2; Extract two groups of basic blocks in two different functions. 3 4 5; The first extracted function is the region composed by the 6; blocks if, then, and else from foo. 7; CHECK: define dso_local void @foo.if.split(i32 %arg1, i32 %arg, i32* %tmp.0.ce.out) { 8; CHECK: newFuncRoot: 9; CHECK: br label %if.split 10; 11; CHECK: end.exitStub: ; preds = %end.split 12; CHECK: ret void 13; 14; CHECK: then: ; preds = %if.split 15; CHECK: %tmp12 = shl i32 %arg1, 2 16; CHECK: %tmp13 = add nsw i32 %tmp12, %arg 17; CHECK: br label %end.split 18; 19; CHECK: else: ; preds = %if.split 20; CHECK: %tmp22 = mul nsw i32 %arg, 3 21; CHECK: %tmp24 = sdiv i32 %arg1, 6 22; CHECK: %tmp25 = add nsw i32 %tmp24, %tmp22 23; CHECK: br label %end.split 24; 25; CHECK: if.split: ; preds = %newFuncRoot 26; CHECK: %tmp5 = icmp sgt i32 %arg, 0 27; CHECK: %tmp8 = icmp sgt i32 %arg1, 0 28; CHECK: %or.cond = and i1 %tmp5, %tmp8 29; CHECK: br i1 %or.cond, label %then, label %else 30; 31; CHECK: end.split: ; preds = %then, %else 32; CHECK: %tmp.0.ce = phi i32 [ %tmp13, %then ], [ %tmp25, %else ] 33; CHECK: store i32 %tmp.0.ce, i32* %tmp.0.ce.out 34; CHECK: br label %end.exitStub 35; CHECK: } 36 37; The second extracted function is the region composed by the blocks 38; bb14 and bb20 from bar. 39; CHECK: define dso_local i1 @bar.bb14(i32 %arg1, i32 %arg, i32* %tmp25.out) { 40; CHECK: newFuncRoot: 41; CHECK: br label %bb14 42; 43; CHECK: bb26.exitStub: ; preds = %bb14 44; CHECK: ret i1 true 45; 46; CHECK: bb30.exitStub: ; preds = %bb20 47; CHECK: ret i1 false 48; 49; CHECK: bb14: ; preds = %newFuncRoot 50; CHECK: %tmp0 = and i32 %arg1, %arg 51; CHECK: %tmp1 = icmp slt i32 %tmp0, 0 52; CHECK: br i1 %tmp1, label %bb20, label %bb26.exitStub 53; 54; CHECK: bb20: ; preds = %bb14 55; CHECK: %tmp22 = mul nsw i32 %arg, 3 56; CHECK: %tmp24 = sdiv i32 %arg1, 6 57; CHECK: %tmp25 = add nsw i32 %tmp24, %tmp22 58; CHECK: store i32 %tmp25, i32* %tmp25.out 59; CHECK: br label %bb30.exitStub 60; CHECK: } 61 62define i32 @foo(i32 %arg, i32 %arg1) { 63if: 64 %tmp5 = icmp sgt i32 %arg, 0 65 %tmp8 = icmp sgt i32 %arg1, 0 66 %or.cond = and i1 %tmp5, %tmp8 67 br i1 %or.cond, label %then, label %else 68 69then: 70 %tmp12 = shl i32 %arg1, 2 71 %tmp13 = add nsw i32 %tmp12, %arg 72 br label %end 73 74else: 75 %tmp22 = mul nsw i32 %arg, 3 76 %tmp24 = sdiv i32 %arg1, 6 77 %tmp25 = add nsw i32 %tmp24, %tmp22 78 br label %end 79 80end: 81 %tmp.0 = phi i32 [ %tmp13, %then ], [ %tmp25, %else ] 82 %and0 = and i32 %tmp.0, %arg 83 %cmp1 = icmp slt i32 %and0, 0 84 br i1 %cmp1, label %ret0, label %ret1 85 86ret0: 87 ret i32 0 88 89ret1: 90 ret i32 1 91} 92 93define i32 @bar(i32 %arg, i32 %arg1) { 94bb: 95 %tmp5 = icmp sgt i32 %arg, 0 96 %tmp8 = icmp sgt i32 %arg1, 0 97 %or.cond = and i1 %tmp5, %tmp8 98 br i1 %or.cond, label %bb9, label %bb14 99 100bb9: ; preds = %bb 101 %tmp12 = shl i32 %arg1, 2 102 %tmp13 = add nsw i32 %tmp12, %arg 103 br label %bb30 104 105bb14: ; preds = %bb 106 %tmp0 = and i32 %arg1, %arg 107 %tmp1 = icmp slt i32 %tmp0, 0 108 br i1 %tmp1, label %bb20, label %bb26 109 110bb20: ; preds = %bb14 111 %tmp22 = mul nsw i32 %arg, 3 112 %tmp24 = sdiv i32 %arg1, 6 113 %tmp25 = add nsw i32 %tmp24, %tmp22 114 br label %bb30 115 116bb26: ; preds = %bb14 117 %tmp29 = sub nsw i32 %arg, %arg1 118 br label %bb30 119 120bb30: ; preds = %bb26, %bb20, %bb9 121 %tmp.0 = phi i32 [ %tmp13, %bb9 ], [ %tmp25, %bb20 ], [ %tmp29, %bb26 ] 122 ret i32 %tmp.0 123} 124 125