[llvm] r343829 - [globalisel][combine] When placing truncates, handle the case when the BB is empty
Daniel Sanders via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 4 16:47:37 PDT 2018
Author: dsanders
Date: Thu Oct 4 16:47:37 2018
New Revision: 343829
URL: http://llvm.org/viewvc/llvm-project?rev=343829&view=rev
Log:
[globalisel][combine] When placing truncates, handle the case when the BB is empty
GlobalISel uses MIR with implicit fallthrough on each basic block. As a result,
getFirstNonPhi() can return end().
Modified:
llvm/trunk/lib/CodeGen/GlobalISel/CombinerHelper.cpp
llvm/trunk/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-extending-loads-cornercases.mir
Modified: llvm/trunk/lib/CodeGen/GlobalISel/CombinerHelper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/CombinerHelper.cpp?rev=343829&r1=343828&r2=343829&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalISel/CombinerHelper.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalISel/CombinerHelper.cpp Thu Oct 4 16:47:37 2018
@@ -110,7 +110,8 @@ PreferredTuple ChoosePreferredUse(Prefer
/// want to try harder to find a dominating block.
static void InsertInsnsWithoutSideEffectsBeforeUse(
MachineIRBuilder &Builder, MachineInstr &DefMI, MachineOperand &UseMO,
- std::function<void(MachineBasicBlock::iterator)> Inserter) {
+ std::function<void(MachineBasicBlock *, MachineBasicBlock::iterator)>
+ Inserter) {
MachineInstr &UseMI = *UseMO.getParent();
MachineBasicBlock *InsertBB = UseMI.getParent();
@@ -125,16 +126,26 @@ static void InsertInsnsWithoutSideEffect
// the def instead of at the start of the block.
if (InsertBB == DefMI.getParent()) {
MachineBasicBlock::iterator InsertPt = &DefMI;
- Inserter(std::next(InsertPt));
+ Inserter(InsertBB, std::next(InsertPt));
return;
}
// Otherwise we want the start of the BB
- Inserter(InsertBB->getFirstNonPHI());
+ Inserter(InsertBB, InsertBB->getFirstNonPHI());
}
} // end anonymous namespace
bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) {
+ struct InsertionPoint {
+ MachineOperand *UseMO;
+ MachineBasicBlock *InsertIntoBB;
+ MachineBasicBlock::iterator InsertBefore;
+ InsertionPoint(MachineOperand *UseMO, MachineBasicBlock *InsertIntoBB,
+ MachineBasicBlock::iterator InsertBefore)
+ : UseMO(UseMO), InsertIntoBB(InsertIntoBB), InsertBefore(InsertBefore) {
+ }
+ };
+
// We match the loads and follow the uses to the extend instead of matching
// the extends and following the def to the load. This is because the load
// must remain in the same position for correctness (unless we also add code
@@ -193,7 +204,7 @@ bool CombinerHelper::tryCombineExtending
// Rewrite all the uses to fix up the types.
SmallVector<MachineInstr *, 1> ScheduleForErase;
- SmallVector<std::pair<MachineOperand *, MachineInstr *>, 4> ScheduleForInsert;
+ SmallVector<InsertionPoint, 4> ScheduleForInsert;
for (auto &UseMO : MRI.use_operands(LoadValue.getReg())) {
MachineInstr *UseMI = UseMO.getParent();
@@ -243,8 +254,9 @@ bool CombinerHelper::tryCombineExtending
// ... = ... %3(s64)
InsertInsnsWithoutSideEffectsBeforeUse(
Builder, MI, UseMO,
- [&](MachineBasicBlock::iterator InsertBefore) {
- ScheduleForInsert.emplace_back(&UseMO, &*InsertBefore);
+ [&](MachineBasicBlock *InsertIntoBB,
+ MachineBasicBlock::iterator InsertBefore) {
+ ScheduleForInsert.emplace_back(&UseMO, InsertIntoBB, InsertBefore);
});
}
continue;
@@ -259,27 +271,29 @@ bool CombinerHelper::tryCombineExtending
// The use isn't an extend. Truncate back to the type we originally loaded.
// This is free on many targets.
InsertInsnsWithoutSideEffectsBeforeUse(
- Builder, MI, UseMO, [&](MachineBasicBlock::iterator InsertBefore) {
- ScheduleForInsert.emplace_back(&UseMO, &*InsertBefore);
+ Builder, MI, UseMO,
+ [&](MachineBasicBlock *InsertIntoBB,
+ MachineBasicBlock::iterator InsertBefore) {
+ ScheduleForInsert.emplace_back(&UseMO, InsertIntoBB, InsertBefore);
});
}
DenseMap<MachineBasicBlock *, MachineInstr *> EmittedInsns;
for (auto &InsertionInfo : ScheduleForInsert) {
- MachineOperand *UseMO = InsertionInfo.first;
- MachineInstr *InsertBefore = InsertionInfo.second;
+ MachineOperand *UseMO = InsertionInfo.UseMO;
+ MachineBasicBlock *InsertIntoBB = InsertionInfo.InsertIntoBB;
+ MachineBasicBlock::iterator InsertBefore = InsertionInfo.InsertBefore;
- MachineInstr *PreviouslyEmitted =
- EmittedInsns.lookup(InsertBefore->getParent());
+ MachineInstr *PreviouslyEmitted = EmittedInsns.lookup(InsertIntoBB);
if (PreviouslyEmitted) {
UseMO->setReg(PreviouslyEmitted->getOperand(0).getReg());
continue;
}
- Builder.setInsertPt(*InsertBefore->getParent(), InsertBefore);
+ Builder.setInsertPt(*InsertIntoBB, InsertBefore);
unsigned NewDstReg = MRI.cloneVirtualRegister(MI.getOperand(0).getReg());
MachineInstr *NewMI = Builder.buildTrunc(NewDstReg, ChosenDstReg);
- EmittedInsns[InsertBefore->getParent()] = NewMI;
+ EmittedInsns[InsertIntoBB] = NewMI;
UseMO->setReg(NewDstReg);
Observer.createdInstr(*NewMI);
}
Modified: llvm/trunk/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-extending-loads-cornercases.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-extending-loads-cornercases.mir?rev=343829&r1=343828&r2=343829&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-extending-loads-cornercases.mir (original)
+++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-extending-loads-cornercases.mir Thu Oct 4 16:47:37 2018
@@ -35,6 +35,19 @@
ret void
}
+ define void @sink_to_phi_emptyblock(i8* %addr) {
+ entry:
+ br i1 0, label %if, label %else
+ if:
+ br label %exit
+ else:
+ br label %else2
+ else2:
+ br label %exit
+ exit:
+ ret void
+ }
+
define void @use_doesnt_def_anything(i8* %addr) {
entry:
ret void
@@ -44,7 +57,6 @@
entry:
ret void
}
-
...
---
@@ -172,6 +184,52 @@ body: |
; CHECK: [[T5:%[0-9]+]]:_(s8) = G_PHI [[T2]](s8), %bb.1, [[T4]](s8)
%9:_(s32) = G_ZEXT %8
; CHECK: [[T6:%[0-9]+]]:_(s32) = G_ZEXT [[T5]](s8)
+ ; CHECK: $w0 = COPY [[T0]](s32)
+ ; CHECK: $w1 = COPY [[T6]](s32)
+ $w0 = COPY %3
+ $w1 = COPY %9
+...
+
+---
+name: sink_to_phi_emptyblock
+# CHECK-LABEL: name: sink_to_phi_emptyblock
+tracksRegLiveness: true
+body: |
+ bb.0.entry:
+ liveins: $x0, $w1
+ successors: %bb.1(0x40000000), %bb.2(0x40000000); %bb.1(50.00%), %bb.2(50.00%)
+ ; CHECK: [[T0:%[0-9]+]]:_(s32) = G_SEXTLOAD
+ %0:_(p0) = COPY $x0
+ %1:_(s32) = COPY $w1
+ %2:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
+ %3:_(s32) = G_SEXT %2
+ %4:_(s32) = G_CONSTANT i32 1
+ %5:_(s1) = G_ICMP intpred(ne), %1:_(s32), %4:_
+ G_BRCOND %5:_(s1), %bb.1
+ G_BR %bb.2.else
+ bb.1.if:
+ ; CHECK: bb.1.if:
+ successors: %bb.4(0x80000000)
+ %10:_(s8) = G_CONSTANT i8 1
+ ; CHECK: [[T1:%[0-9]+]]:_(s8) = G_TRUNC [[T0]](s32)
+ %6:_(s8) = G_ADD %2, %10
+ ; CHECK: [[T2:%[0-9]+]]:_(s8) = G_ADD [[T1]], {{.*}}
+ G_BR %bb.4.exit
+ bb.2.else:
+ ; CHECK: bb.2.else:
+ successors: %bb.3(0x80000000)
+ G_BR %bb.3.else2
+ bb.3.else2:
+ ; CHECK: bb.3.else2:
+ successors: %bb.4(0x80000000)
+ ; CHECK: [[T4:%[0-9]+]]:_(s8) = G_TRUNC [[T0]](s32)
+ ; Fallthrough
+ bb.4.exit:
+ ; CHECK: bb.4.exit:
+ %8:_(s8) = G_PHI %6:_(s8), %bb.1, %2:_(s8), %bb.3
+ ; CHECK: [[T5:%[0-9]+]]:_(s8) = G_PHI [[T2]](s8), %bb.1, [[T4]](s8)
+ %9:_(s32) = G_ZEXT %8
+ ; CHECK: [[T6:%[0-9]+]]:_(s32) = G_ZEXT [[T5]](s8)
; CHECK: $w0 = COPY [[T0]](s32)
; CHECK: $w1 = COPY [[T6]](s32)
$w0 = COPY %3
More information about the llvm-commits
mailing list