Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs |
| 2 | ; RUN: opt -S -verify -iroutliner -ir-outlining-no-cost < %s | FileCheck %s |
| 3 | |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 4 | ; Here we have multiple exits, but the different sources, same outputs are |
| 5 | ; needed, this checks that they are compressed, and moved into the appropriate |
| 6 | ; output blocks. |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 7 | |
| 8 | define void @outline_outputs1() #0 { |
| 9 | entry: |
| 10 | %output = alloca i32, align 4 |
| 11 | %result = alloca i32, align 4 |
| 12 | %output2 = alloca i32, align 4 |
| 13 | %result2 = alloca i32, align 4 |
| 14 | %a = alloca i32, align 4 |
| 15 | %b = alloca i32, align 4 |
| 16 | br label %block_2 |
| 17 | block_1: |
| 18 | %a2 = alloca i32, align 4 |
| 19 | %b2 = alloca i32, align 4 |
| 20 | br label %block_2 |
| 21 | block_2: |
| 22 | %a2val = load i32, i32* %a |
| 23 | %b2val = load i32, i32* %b |
| 24 | %add2 = add i32 2, %a2val |
| 25 | %mul2 = mul i32 2, %b2val |
| 26 | br label %block_5 |
| 27 | block_3: |
| 28 | %aval = load i32, i32* %a |
| 29 | %bval = load i32, i32* %b |
| 30 | %add = add i32 2, %aval |
| 31 | %mul = mul i32 2, %bval |
| 32 | br label %block_4 |
| 33 | block_4: |
| 34 | store i32 %add, i32* %output, align 4 |
| 35 | store i32 %mul, i32* %result, align 4 |
| 36 | br label %block_6 |
| 37 | block_5: |
| 38 | store i32 %add2, i32* %output, align 4 |
| 39 | store i32 %mul2, i32* %result, align 4 |
| 40 | br label %block_7 |
| 41 | block_6: |
| 42 | %div = udiv i32 %aval, %bval |
| 43 | ret void |
| 44 | block_7: |
| 45 | %sub = sub i32 %a2val, %b2val |
| 46 | ret void |
| 47 | } |
| 48 | |
| 49 | define void @outline_outputs2() #0 { |
| 50 | entry: |
| 51 | %output = alloca i32, align 4 |
| 52 | %result = alloca i32, align 4 |
| 53 | %output2 = alloca i32, align 4 |
| 54 | %result2 = alloca i32, align 4 |
| 55 | %a = alloca i32, align 4 |
| 56 | %b = alloca i32, align 4 |
| 57 | br label %block_2 |
| 58 | block_1: |
| 59 | %a2 = alloca i32, align 4 |
| 60 | %b2 = alloca i32, align 4 |
| 61 | br label %block_2 |
| 62 | block_2: |
| 63 | %a2val = load i32, i32* %a |
| 64 | %b2val = load i32, i32* %b |
| 65 | %add2 = add i32 2, %a2val |
| 66 | %mul2 = mul i32 2, %b2val |
| 67 | br label %block_5 |
| 68 | block_3: |
| 69 | %aval = load i32, i32* %a |
| 70 | %bval = load i32, i32* %b |
| 71 | %add = add i32 2, %aval |
| 72 | %mul = mul i32 2, %bval |
| 73 | br label %block_4 |
| 74 | block_4: |
| 75 | store i32 %add, i32* %output, align 4 |
| 76 | store i32 %mul, i32* %result, align 4 |
| 77 | br label %block_7 |
| 78 | block_5: |
| 79 | store i32 %add2, i32* %output, align 4 |
| 80 | store i32 %mul2, i32* %result, align 4 |
| 81 | br label %block_6 |
| 82 | block_6: |
| 83 | %diff = sub i32 %a2val, %b2val |
| 84 | ret void |
| 85 | block_7: |
| 86 | %quot = udiv i32 %aval, %bval |
| 87 | ret void |
| 88 | } |
| 89 | ; CHECK-LABEL: @outline_outputs1( |
| 90 | ; CHECK-NEXT: entry: |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 91 | ; CHECK-NEXT: [[BVAL_LOC:%.*]] = alloca i32, align 4 |
| 92 | ; CHECK-NEXT: [[AVAL_LOC:%.*]] = alloca i32, align 4 |
| 93 | ; CHECK-NEXT: [[B2VAL_LOC:%.*]] = alloca i32, align 4 |
| 94 | ; CHECK-NEXT: [[A2VAL_LOC:%.*]] = alloca i32, align 4 |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 95 | ; CHECK-NEXT: [[OUTPUT:%.*]] = alloca i32, align 4 |
| 96 | ; CHECK-NEXT: [[RESULT:%.*]] = alloca i32, align 4 |
| 97 | ; CHECK-NEXT: [[OUTPUT2:%.*]] = alloca i32, align 4 |
| 98 | ; CHECK-NEXT: [[RESULT2:%.*]] = alloca i32, align 4 |
| 99 | ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 |
| 100 | ; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 |
| 101 | ; CHECK-NEXT: br label [[BLOCK_2:%.*]] |
| 102 | ; CHECK: block_1: |
| 103 | ; CHECK-NEXT: [[A2:%.*]] = alloca i32, align 4 |
| 104 | ; CHECK-NEXT: [[B2:%.*]] = alloca i32, align 4 |
| 105 | ; CHECK-NEXT: br label [[BLOCK_2]] |
| 106 | ; CHECK: block_2: |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 107 | ; CHECK-NEXT: [[LT_CAST:%.*]] = bitcast i32* [[A2VAL_LOC]] to i8* |
| 108 | ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST]]) |
| 109 | ; CHECK-NEXT: [[LT_CAST1:%.*]] = bitcast i32* [[B2VAL_LOC]] to i8* |
| 110 | ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST1]]) |
| 111 | ; CHECK-NEXT: [[LT_CAST2:%.*]] = bitcast i32* [[AVAL_LOC]] to i8* |
| 112 | ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST2]]) |
| 113 | ; CHECK-NEXT: [[LT_CAST3:%.*]] = bitcast i32* [[BVAL_LOC]] to i8* |
| 114 | ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]]) |
| 115 | ; CHECK-NEXT: [[TARGETBLOCK:%.*]] = call i1 @outlined_ir_func_0(i32* [[A]], i32* [[B]], i32* [[OUTPUT]], i32* [[RESULT]], i32* [[A2VAL_LOC]], i32* [[B2VAL_LOC]], i32* [[AVAL_LOC]], i32* [[BVAL_LOC]]) |
| 116 | ; CHECK-NEXT: [[A2VAL_RELOAD:%.*]] = load i32, i32* [[A2VAL_LOC]], align 4 |
| 117 | ; CHECK-NEXT: [[B2VAL_RELOAD:%.*]] = load i32, i32* [[B2VAL_LOC]], align 4 |
| 118 | ; CHECK-NEXT: [[AVAL_RELOAD:%.*]] = load i32, i32* [[AVAL_LOC]], align 4 |
| 119 | ; CHECK-NEXT: [[BVAL_RELOAD:%.*]] = load i32, i32* [[BVAL_LOC]], align 4 |
| 120 | ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST]]) |
| 121 | ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST1]]) |
| 122 | ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST2]]) |
| 123 | ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST3]]) |
| 124 | ; CHECK-NEXT: br i1 [[TARGETBLOCK]], label [[BLOCK_6:%.*]], label [[BLOCK_7:%.*]] |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 125 | ; CHECK: block_6: |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 126 | ; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]] |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 127 | ; CHECK-NEXT: ret void |
| 128 | ; CHECK: block_7: |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 129 | ; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]] |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 130 | ; CHECK-NEXT: ret void |
| 131 | ; |
| 132 | ; |
| 133 | ; CHECK-LABEL: @outline_outputs2( |
| 134 | ; CHECK-NEXT: entry: |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 135 | ; CHECK-NEXT: [[BVAL_LOC:%.*]] = alloca i32, align 4 |
| 136 | ; CHECK-NEXT: [[AVAL_LOC:%.*]] = alloca i32, align 4 |
| 137 | ; CHECK-NEXT: [[B2VAL_LOC:%.*]] = alloca i32, align 4 |
| 138 | ; CHECK-NEXT: [[A2VAL_LOC:%.*]] = alloca i32, align 4 |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 139 | ; CHECK-NEXT: [[OUTPUT:%.*]] = alloca i32, align 4 |
| 140 | ; CHECK-NEXT: [[RESULT:%.*]] = alloca i32, align 4 |
| 141 | ; CHECK-NEXT: [[OUTPUT2:%.*]] = alloca i32, align 4 |
| 142 | ; CHECK-NEXT: [[RESULT2:%.*]] = alloca i32, align 4 |
| 143 | ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 |
| 144 | ; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 |
| 145 | ; CHECK-NEXT: br label [[BLOCK_2:%.*]] |
| 146 | ; CHECK: block_1: |
| 147 | ; CHECK-NEXT: [[A2:%.*]] = alloca i32, align 4 |
| 148 | ; CHECK-NEXT: [[B2:%.*]] = alloca i32, align 4 |
| 149 | ; CHECK-NEXT: br label [[BLOCK_2]] |
| 150 | ; CHECK: block_2: |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 151 | ; CHECK-NEXT: [[LT_CAST:%.*]] = bitcast i32* [[A2VAL_LOC]] to i8* |
| 152 | ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST]]) |
| 153 | ; CHECK-NEXT: [[LT_CAST1:%.*]] = bitcast i32* [[B2VAL_LOC]] to i8* |
| 154 | ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST1]]) |
| 155 | ; CHECK-NEXT: [[LT_CAST2:%.*]] = bitcast i32* [[AVAL_LOC]] to i8* |
| 156 | ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST2]]) |
| 157 | ; CHECK-NEXT: [[LT_CAST3:%.*]] = bitcast i32* [[BVAL_LOC]] to i8* |
| 158 | ; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]]) |
| 159 | ; CHECK-NEXT: [[TARGETBLOCK:%.*]] = call i1 @outlined_ir_func_0(i32* [[A]], i32* [[B]], i32* [[OUTPUT]], i32* [[RESULT]], i32* [[A2VAL_LOC]], i32* [[B2VAL_LOC]], i32* [[AVAL_LOC]], i32* [[BVAL_LOC]]) |
| 160 | ; CHECK-NEXT: [[A2VAL_RELOAD:%.*]] = load i32, i32* [[A2VAL_LOC]], align 4 |
| 161 | ; CHECK-NEXT: [[B2VAL_RELOAD:%.*]] = load i32, i32* [[B2VAL_LOC]], align 4 |
| 162 | ; CHECK-NEXT: [[AVAL_RELOAD:%.*]] = load i32, i32* [[AVAL_LOC]], align 4 |
| 163 | ; CHECK-NEXT: [[BVAL_RELOAD:%.*]] = load i32, i32* [[BVAL_LOC]], align 4 |
| 164 | ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST]]) |
| 165 | ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST1]]) |
| 166 | ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST2]]) |
| 167 | ; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST3]]) |
| 168 | ; CHECK-NEXT: br i1 [[TARGETBLOCK]], label [[BLOCK_7:%.*]], label [[BLOCK_6:%.*]] |
| 169 | ; CHECK: block_6: |
| 170 | ; CHECK-NEXT: [[DIFF:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]] |
| 171 | ; CHECK-NEXT: ret void |
| 172 | ; CHECK: block_7: |
| 173 | ; CHECK-NEXT: [[QUOT:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]] |
| 174 | ; CHECK-NEXT: ret void |
| 175 | ; |
| 176 | ; |
| 177 | ; CHECK: define internal i1 @outlined_ir_func_0( |
| 178 | ; CHECK-NEXT: newFuncRoot: |
| 179 | ; CHECK-NEXT: br label [[BLOCK_2_TO_OUTLINE:%.*]] |
| 180 | ; CHECK: block_2_to_outline: |
| 181 | ; CHECK-NEXT: [[A2VAL:%.*]] = load i32, i32* [[TMP0:%.*]], align 4 |
| 182 | ; CHECK-NEXT: [[B2VAL:%.*]] = load i32, i32* [[TMP1:%.*]], align 4 |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 183 | ; CHECK-NEXT: [[ADD2:%.*]] = add i32 2, [[A2VAL]] |
| 184 | ; CHECK-NEXT: [[MUL2:%.*]] = mul i32 2, [[B2VAL]] |
| 185 | ; CHECK-NEXT: br label [[BLOCK_5:%.*]] |
| 186 | ; CHECK: block_3: |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 187 | ; CHECK-NEXT: [[AVAL:%.*]] = load i32, i32* [[TMP0]], align 4 |
| 188 | ; CHECK-NEXT: [[BVAL:%.*]] = load i32, i32* [[TMP1]], align 4 |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 189 | ; CHECK-NEXT: [[ADD:%.*]] = add i32 2, [[AVAL]] |
| 190 | ; CHECK-NEXT: [[MUL:%.*]] = mul i32 2, [[BVAL]] |
| 191 | ; CHECK-NEXT: br label [[BLOCK_4:%.*]] |
| 192 | ; CHECK: block_4: |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 193 | ; CHECK-NEXT: store i32 [[ADD]], i32* [[TMP2:%.*]], align 4 |
| 194 | ; CHECK-NEXT: store i32 [[MUL]], i32* [[TMP3:%.*]], align 4 |
| 195 | ; CHECK-NEXT: br label [[BLOCK_6_EXITSTUB:%.*]] |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 196 | ; CHECK: block_5: |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 197 | ; CHECK-NEXT: store i32 [[ADD2]], i32* [[TMP2]], align 4 |
| 198 | ; CHECK-NEXT: store i32 [[MUL2]], i32* [[TMP3]], align 4 |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 199 | ; CHECK-NEXT: br label [[BLOCK_7_EXITSTUB:%.*]] |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 200 | ; CHECK: block_6.exitStub: |
| 201 | ; CHECK-NEXT: store i32 [[AVAL]], i32* [[TMP6:%.*]], align 4 |
| 202 | ; CHECK-NEXT: store i32 [[BVAL]], i32* [[TMP7:%.*]], align 4 |
| 203 | ; CHECK-NEXT: ret i1 true |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 204 | ; CHECK: block_7.exitStub: |
Andrew Litteken | c172f1a | 2021-07-28 09:22:35 -0700 | [diff] [blame] | 205 | ; CHECK-NEXT: store i32 [[A2VAL]], i32* [[TMP4:%.*]], align 4 |
| 206 | ; CHECK-NEXT: store i32 [[B2VAL]], i32* [[TMP5:%.*]], align 4 |
| 207 | ; CHECK-NEXT: ret i1 false |
Andrew Litteken | 81d3ac0 | 2021-07-28 07:59:37 -0700 | [diff] [blame] | 208 | ; |