Skip to content

Commit 3876755

Browse files
author
Michael Skvortsov
committed
Improve conditional throwing
1 parent d5e4cf8 commit 3876755

File tree

2 files changed

+89
-4
lines changed

2 files changed

+89
-4
lines changed

llvm/lib/Target/TVM/TVMIfConversionTerm.cpp

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
//===----------------------------------------------------------------------===//
1313

1414
#include "TVM.h"
15+
#include "TVMUtilities.h"
16+
1517
#include "llvm/ADT/PostOrderIterator.h"
1618
#include "llvm/CodeGen/MachineDominators.h"
1719
#include "llvm/CodeGen/MachineFunctionPass.h"
@@ -49,7 +51,8 @@ class TVMIfConversionTerm final : public MachineFunctionPass {
4951
static char ID;
5052
explicit TVMIfConversionTerm() : MachineFunctionPass(ID) {}
5153
private:
52-
bool tryConvertIf(MachineBasicBlock*);
54+
bool tryConvertIf1(MachineBasicBlock *MBB);
55+
bool tryConvertIf2(MachineBasicBlock *MBB);
5356
void updateDomTree(MachineBasicBlock *Head,
5457
MachineBasicBlock *ThrowBB,
5558
MachineBasicBlock *ContBB);
@@ -96,7 +99,7 @@ void TVMIfConversionTerm::updateLoops(MachineBasicBlock *ThrowBB,
9699
Loops->removeBlock(ContBB);
97100
}
98101

99-
bool TVMIfConversionTerm::tryConvertIf(MachineBasicBlock* MBB) {
102+
bool TVMIfConversionTerm::tryConvertIf1(MachineBasicBlock *MBB) {
100103
SmallVector<MachineBasicBlock*, 4> RemovedBlocks;
101104

102105
MachineBasicBlock *Head = MBB;
@@ -148,6 +151,55 @@ bool TVMIfConversionTerm::tryConvertIf(MachineBasicBlock* MBB) {
148151
return true;
149152
}
150153

154+
static bool IsThrow(MachineBasicBlock *MBB) {
155+
if (!MBB->succ_empty())
156+
return false;
157+
if (MBB->size() != 1)
158+
return false;
159+
auto &MI = MBB->front();
160+
if (MI.getOpcode() != TVM::THROW)
161+
return false;
162+
return true;
163+
}
164+
165+
// ...
166+
// |
167+
// MBB ...
168+
// ... / \ /
169+
// \ / \ /
170+
// \ / \ /
171+
// TBB \ /
172+
// FBB
173+
// |
174+
// ...
175+
bool TVMIfConversionTerm::tryConvertIf2(MachineBasicBlock *MBB) {
176+
MachineBasicBlock *TBB = nullptr;
177+
MachineBasicBlock *FBB = nullptr;
178+
SmallVector<MachineOperand, 4> Cond;
179+
if (TII->analyzeBranch(*MBB, TBB, FBB, Cond))
180+
return false;
181+
182+
unsigned Opcode;
183+
if (TBB && IsThrow(TBB)) {
184+
Opcode = TVM::THROWIF;
185+
} else if (FBB && IsThrow(FBB)) {
186+
std::swap(TBB, FBB);
187+
Opcode = TVM::THROWIFNOT;
188+
} else {
189+
return false;
190+
}
191+
192+
auto &TI = TBB->front();
193+
auto &MI = *MBB->getFirstTerminator();
194+
BuildMI(*MBB, MI, MI.getDebugLoc(), TII->get(Opcode))
195+
.add(Cond[1]).add(TI.getOperand(0));
196+
TII->removeBranch(*MBB);
197+
MBB->removeSuccessor(TBB);
198+
TII->insertBranch(*MBB, FBB, nullptr, ArrayRef<MachineOperand>(), DebugLoc());
199+
200+
return true;
201+
}
202+
151203
bool TVMIfConversionTerm::runOnMachineFunction(MachineFunction &MF) {
152204
LLVM_DEBUG(dbgs() << "********** TVM IF-CONVERSION TERM **********\n"
153205
<< "********** Function: " << MF.getName() << '\n');
@@ -157,9 +209,12 @@ bool TVMIfConversionTerm::runOnMachineFunction(MachineFunction &MF) {
157209
DomTree = &getAnalysis<MachineDominatorTree>();
158210
Loops = getAnalysisIfAvailable<MachineLoopInfo>();
159211
bool Changed = false;
160-
for (auto DomNode : post_order(DomTree))
161-
if (tryConvertIf(DomNode->getBlock()))
212+
for (auto DomNode : post_order(DomTree)) {
213+
if (tryConvertIf1(DomNode->getBlock()))
162214
Changed = true;
215+
if (tryConvertIf2(DomNode->getBlock()))
216+
Changed = true;
217+
}
163218
return Changed;
164219
}
165220

llvm/test/CodeGen/TVM/intrinsic.ll

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,21 @@ do_throw:
209209
unreachable
210210
}
211211

212+
; CHECK-LABEL: throws2
213+
define void @throws2(i257 %cond1, i257 %cond2) {
214+
%flag1 = trunc i257 %cond1 to i1
215+
br i1 %flag1, label %bb, label %ok
216+
bb:
217+
; CHECK: THROWIF 42
218+
%flag2 = trunc i257 %cond2 to i1
219+
br i1 %flag2, label %do_throw, label %ok
220+
ok:
221+
ret void
222+
do_throw:
223+
call void @llvm.tvm.throw(i257 42)
224+
unreachable
225+
}
226+
212227
; CHECK-LABEL: throws_neg
213228
define void @throws_neg(i257 %cond) {
214229
; CHECK: THROWIFNOT 42
@@ -221,6 +236,21 @@ do_throw:
221236
unreachable
222237
}
223238

239+
; CHECK-LABEL: throws2_neg
240+
define void @throws2_neg(i257 %cond1, i257 %cond2) {
241+
%flag1 = trunc i257 %cond1 to i1
242+
br i1 %flag1, label %bb, label %ok
243+
bb:
244+
; CHECK: THROWIFNOT 42
245+
%flag2 = trunc i257 %cond2 to i1
246+
br i1 %flag2, label %ok, label %do_throw
247+
ok:
248+
ret void
249+
do_throw:
250+
call void @llvm.tvm.throw(i257 42)
251+
unreachable
252+
}
253+
224254
; CHECK-LABEL: throws_uncond
225255
define void @throws_uncond() {
226256
; CHECK: THROW 42

0 commit comments

Comments
 (0)