]> granicus.if.org Git - llvm/commitdiff
[MachinePipeliner] Fix Phi refers to Phi in same stage in 1st epilogue
authorJinsong Ji <jji@us.ibm.com>
Tue, 9 Jul 2019 02:27:35 +0000 (02:27 +0000)
committerJinsong Ji <jji@us.ibm.com>
Tue, 9 Jul 2019 02:27:35 +0000 (02:27 +0000)
Summary:
This is exposed by functional testing on PowerPC.
In some pipelined loops, Phi refer to phi did not get value defined by
the Phi, hence getting wrong value later.

As the comment mentioned, we should "use the value defined by the Phi,
unless we're generating the firstepilog and the Phi refers to a Phi
 in a different stage.", so Phi refering to same stage Phi should use
the value defined by the Phi here.

Reviewers: bcahoon, hfinkel

Reviewed By: hfinkel

Subscribers: MaskRay, wuzish, nemanjai, hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D64035

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365428 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MachinePipeliner.cpp
test/CodeGen/PowerPC/sms-phi.ll

index 167c05f9ef4e2b9633b5449ed62de2c277833d51..9c0c5cc5c70e2a879909b15e4c83bdbc7069b429 100644 (file)
@@ -2430,7 +2430,7 @@ void SwingSchedulerDAG::generateExistingPhis(
         // Use the value defined by the Phi, unless we're generating the first
         // epilog and the Phi refers to a Phi in a different stage.
         else if (VRMap[PrevStage - np].count(Def) &&
-                 (!LoopDefIsPhi || PrevStage != LastStageNum))
+                 (!LoopDefIsPhi || (PrevStage != LastStageNum) || (LoopValStage == StageScheduled)))
           PhiOp2 = VRMap[PrevStage - np][Def];
       }
 
index 7fd59edf1c9bf4573ab28ef08530e29bacbdb6c1..93975663f1bce4bb1dad26f10f1a0de3117e77ac 100644 (file)
@@ -8,7 +8,7 @@ define dso_local void @sha512() #0 {
 ;CHECK: epilog:
 ;CHECK:        %23:g8rc_and_g8rc_nox0 = PHI %5:g8rc_and_g8rc_nox0, %bb.3, %18:g8rc_and_g8rc_nox0, %bb.4
 ;CHECK-NEXT:   %24:g8rc = PHI %6:g8rc, %bb.3, %16:g8rc, %bb.4
-;CHECK-NEXT:   %25:g8rc = PHI %6:g8rc, %bb.3, %16:g8rc, %bb.4
+;CHECK-NEXT:   %25:g8rc = PHI %6:g8rc, %bb.3, %19:g8rc, %bb.4
   br label %1
 
 1:                                                ; preds = %1, %0