|
3 | 3 |
|
4 | 4 | declare void @clobber1()
|
5 | 5 | declare void @clobber2()
|
| 6 | +declare swiftcc void @swift_willThrow(ptr swifterror) |
6 | 7 |
|
7 | 8 | ; Do not try to sink the stores to the exit block, as this requires introducing
|
8 | 9 | ; a select for the pointer operand. This is not allowed for swifterror pointers.
|
|
76 | 77 | ; introduces a select for the pointer operand. This is not allowed for
|
77 | 78 | ; swifterror pointers.
|
78 | 79 | define swiftcc ptr @sink_load(ptr %arg, ptr swifterror %arg1, i1 %c) {
|
| 80 | +; CHECK-LABEL: define swiftcc ptr @sink_load |
| 81 | +; CHECK-SAME: (ptr [[ARG:%.*]], ptr swifterror [[ARG1:%.*]], i1 [[C:%.*]]) { |
| 82 | +; CHECK-NEXT: bb: |
| 83 | +; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]] |
| 84 | +; CHECK: then: |
| 85 | +; CHECK-NEXT: call void @clobber1() |
| 86 | +; CHECK-NEXT: [[L1:%.*]] = load ptr, ptr [[ARG]], align 8 |
| 87 | +; CHECK-NEXT: br label [[EXIT:%.*]] |
| 88 | +; CHECK: else: |
| 89 | +; CHECK-NEXT: call void @clobber2() |
| 90 | +; CHECK-NEXT: [[L2:%.*]] = load ptr, ptr [[ARG1]], align 8 |
| 91 | +; CHECK-NEXT: br label [[EXIT]] |
| 92 | +; CHECK: exit: |
| 93 | +; CHECK-NEXT: [[P:%.*]] = phi ptr [ [[L1]], [[THEN]] ], [ [[L2]], [[ELSE]] ] |
| 94 | +; CHECK-NEXT: ret ptr [[P]] |
| 95 | +; |
79 | 96 | bb:
|
80 | 97 | br i1 %c, label %then, label %else
|
81 | 98 |
|
@@ -127,3 +144,39 @@ exit:
|
127 | 144 | %p = phi ptr [ %l1, %then ], [ %l2, %else ]
|
128 | 145 | ret ptr %p
|
129 | 146 | }
|
| 147 | + |
| 148 | + |
| 149 | +define swiftcc void @sink_call(i1 %c) { |
| 150 | +; CHECK-LABEL: define swiftcc void @sink_call |
| 151 | +; CHECK-SAME: (i1 [[C:%.*]]) { |
| 152 | +; CHECK-NEXT: [[TMP1:%.*]] = alloca swifterror ptr, align 8 |
| 153 | +; CHECK-NEXT: [[TMP2:%.*]] = alloca swifterror ptr, align 8 |
| 154 | +; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]] |
| 155 | +; CHECK: then: |
| 156 | +; CHECK-NEXT: call void @clobber1() |
| 157 | +; CHECK-NEXT: call swiftcc void @swift_willThrow(ptr [[TMP2]]) |
| 158 | +; CHECK-NEXT: br label [[EXIT:%.*]] |
| 159 | +; CHECK: else: |
| 160 | +; CHECK-NEXT: call void @clobber2() |
| 161 | +; CHECK-NEXT: call swiftcc void @swift_willThrow(ptr [[TMP1]]) |
| 162 | +; CHECK-NEXT: br label [[EXIT]] |
| 163 | +; CHECK: exit: |
| 164 | +; CHECK-NEXT: ret void |
| 165 | +; |
| 166 | + %2 = alloca swifterror ptr, align 8 |
| 167 | + %3 = alloca swifterror ptr, align 8 |
| 168 | + br i1 %c, label %then, label %else |
| 169 | + |
| 170 | +then: |
| 171 | + call void @clobber1() |
| 172 | + call swiftcc void @swift_willThrow(ptr %3) |
| 173 | + br label %exit |
| 174 | + |
| 175 | +else: |
| 176 | + call void @clobber2() |
| 177 | + call swiftcc void @swift_willThrow(ptr %2) |
| 178 | + br label %exit |
| 179 | + |
| 180 | +exit: |
| 181 | + ret void |
| 182 | +} |
0 commit comments