[PATCH] D64192: [MachinePipeliner][PowerPC] Add a testcase for order in scheduled group.

Jinsong Ji via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 3 21:01:54 PDT 2019


jsji created this revision.
Herald added subscribers: llvm-commits, hiraditya, nemanjai.
Herald added a project: LLVM.

[MachinePipeliner] Fix order for nodes with Anti dependence in same cycle

Problem exposed in PowerPC functional testing.

We did not consider Anti dependence for nodes in same cycle,
so we may end up generating bad machine code.
eg: the reduced test won't verify.

  - Bad machine code: Using an undefined physical register ***
- function:    lame_encode_buffer_interleaved
- basic block: %bb.4  (0x4bde4e12928)
- instruction: %29:gprc = ADDZE %27:gprc, implicit-def dead $carry,

implicit $carry

- operand 3:   implicit $carry


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D64192

Files:
  llvm/lib/CodeGen/MachinePipeliner.cpp
  llvm/test/CodeGen/PowerPC/sms-grp-order.ll


Index: llvm/test/CodeGen/PowerPC/sms-grp-order.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/sms-grp-order.ll
@@ -0,0 +1,49 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; REQUIRES: asserts
+; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs\
+; RUN:       -mcpu=pwr9 --ppc-enable-pipeliner | FileCheck %s
+
+define void @lame_encode_buffer_interleaved() local_unnamed_addr {
+; CHECK-LABEL: lame_encode_buffer_interleaved:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    lhz 3, 0(0)
+; CHECK-NEXT:    li 5, 1
+; CHECK-NEXT:    sldi 5, 5, 62
+; CHECK-NEXT:    lhz 4, 0(3)
+; CHECK-NEXT:    mtctr 5
+; CHECK-NEXT:    .p2align 5
+; CHECK-NEXT:  .LBB0_1: #
+; CHECK-NEXT:    extsh 3, 3
+; CHECK-NEXT:    extsh 4, 4
+; CHECK-NEXT:    srawi 3, 3, 1
+; CHECK-NEXT:    addze 3, 3
+; CHECK-NEXT:    srawi 4, 4, 1
+; CHECK-NEXT:    addze 4, 4
+; CHECK-NEXT:    bdnz .LBB0_1
+; CHECK-NEXT:  # %bb.2:
+; CHECK-NEXT:    sth 3, 0(0)
+; CHECK-NEXT:    sth 4, 0(3)
+; CHECK-NEXT:    blr
+  br label %1
+
+1:                                                ; preds = %1, %0
+  %2 = phi i64 [ 0, %0 ], [ %13, %1 ]
+  %3 = load i16, i16* null, align 2
+  %4 = load i16, i16* undef, align 2
+  %5 = sext i16 %3 to i32
+  %6 = sext i16 %4 to i32
+  %7 = add nsw i32 0, %5
+  %8 = add nsw i32 0, %6
+  %9 = sdiv i32 %7, 2
+  %10 = sdiv i32 %8, 2
+  %11 = trunc i32 %9 to i16
+  %12 = trunc i32 %10 to i16
+  store i16 %11, i16* null, align 2
+  store i16 %12, i16* undef, align 2
+  %13 = add i64 %2, 4
+  %14 = icmp eq i64 %13, 0
+  br i1 %14, label %15, label %1
+
+15:                                               ; preds = %1
+  ret void
+}
Index: llvm/lib/CodeGen/MachinePipeliner.cpp
===================================================================
--- llvm/lib/CodeGen/MachinePipeliner.cpp
+++ llvm/lib/CodeGen/MachinePipeliner.cpp
@@ -3559,6 +3559,14 @@
         if (Pos < MoveUse)
           MoveUse = Pos;
       }
+      // We did not handle HW dependences in previous for loop,
+      // and we normally set Latency =0 for Anti deps,
+      // so may have nodes in same cycle with Anti denpendent on HW regs
+      else if (S.getKind() == SDep::Anti && stageScheduled(*I) == StageInst1) {
+        OrderBeforeUse = true;
+        if((MoveUse == 0)||(Pos < MoveUse))
+          MoveUse = Pos;
+      }
     }
     for (auto &P : SU->Preds) {
       if (P.getSUnit() != *I)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D64192.207966.patch
Type: text/x-patch
Size: 2493 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190704/5994de63/attachment.bin>


More information about the llvm-commits mailing list