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

Dylan McKay via llvm-commits llvm-commits at lists.llvm.org
Fri May 12 17:22:35 PDT 2017


Author: dylanmckay
Date: Fri May 12 19:22:34 2017
New Revision: 302973

URL: http://llvm.org/viewvc/llvm-project?rev=302973&view=rev
Log:
[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).

Added:
    llvm/trunk/test/CodeGen/AVR/select-mbb-placement-bug.ll
Modified:
    llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp

Modified: llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp?rev=302973&r1=302972&r2=302973&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/AVR/AVRISelLowering.cpp Fri May 12 19:22:34 2017
@@ -1610,8 +1610,9 @@ AVRTargetLowering::EmitInstrWithCustomIn
   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);
 

Added: llvm/trunk/test/CodeGen/AVR/select-mbb-placement-bug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AVR/select-mbb-placement-bug.ll?rev=302973&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AVR/select-mbb-placement-bug.ll (added)
+++ llvm/trunk/test/CodeGen/AVR/select-mbb-placement-bug.ll Fri May 12 19:22:34 2017
@@ -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);
+




More information about the llvm-commits mailing list