[AVR] When lowering Select8/Select16, put newly generated MBBs in the same spot

Contributed by Dr. Gergő Érdi.

Fixes a bug.

Raised from (https://github.com/avr-rust/rust/issues/49).

llvm-svn: 302973
This commit is contained in:
Dylan McKay 2017-05-13 00:22:34 +00:00
parent b713266331
commit 0c4debc123
2 changed files with 38 additions and 2 deletions

View File

@ -1610,8 +1610,9 @@ AVRTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
MachineBasicBlock *trueMBB = MF->CreateMachineBasicBlock(LLVM_BB);
MachineBasicBlock *falseMBB = MF->CreateMachineBasicBlock(LLVM_BB);
MachineFunction::iterator I = MBB->getParent()->begin();
++I;
MachineFunction::iterator I;
for (I = MF->begin(); I != MF->end() && &(*I) != MBB; ++I);
if (I != MF->end()) ++I;
MF->insert(I, trueMBB);
MF->insert(I, falseMBB);

View File

@ -0,0 +1,35 @@
; RUN: llc -mcpu=atmega328p < %s -march=avr | FileCheck %s
; CHECK-LABEL: loopy
define internal fastcc void @loopy() {
; In this case, when we expand `Select8`/`Select16`, we should be
; replacing the existing MBB instead of adding a new one.
;
; https://github.com/avr-rust/rust/issues/49
; CHECK: LBB0_1:
; CHECK: LBB0_2:
; CHECK-NOT: LBB0_3:
start:
br label %bb7.preheader
bb7.preheader: ; preds = %bb10, %start
%i = phi i8 [ 0, %start ], [ %j, %bb10 ]
%j = phi i8 [ 1, %start ], [ %next, %bb10 ]
br label %bb10
bb4: ; preds = %bb10
ret void
bb10: ; preds = %bb7.preheader
tail call fastcc void @observe(i8 %i, i8 1)
%0 = icmp ult i8 %j, 20
%1 = zext i1 %0 to i8
%next = add i8 %j, %1
br i1 %0, label %bb7.preheader, label %bb4
}
declare void @observe(i8, i8);