UseListOrder: Handle self-users

Correctly sort self-users (such as PHI nodes).  I added a targeted test
in `test/Bitcode/use-list-order.ll` and the final missing RUN line to
tests in `test/Assembly`.

This is part of PR5680.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214417 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith 2014-07-31 18:33:12 +00:00
parent 5dbbe4adbe
commit 9d65d3717c
3 changed files with 17 additions and 3 deletions

View File

@ -166,13 +166,13 @@ static void predictValueUseListOrderImpl(const Value *V, const Function *F,
// If ID is 4, then expect: 7 6 5 1 2 3. // If ID is 4, then expect: 7 6 5 1 2 3.
if (LID < RID) { if (LID < RID) {
if (RID < ID) if (RID <= ID)
if (!IsGlobalValue) // GlobalValue uses don't get reversed. if (!IsGlobalValue) // GlobalValue uses don't get reversed.
return true; return true;
return false; return false;
} }
if (RID < LID) { if (RID < LID) {
if (LID < ID) if (LID <= ID)
if (!IsGlobalValue) // GlobalValue uses don't get reversed. if (!IsGlobalValue) // GlobalValue uses don't get reversed.
return false; return false;
return true; return true;
@ -180,7 +180,7 @@ static void predictValueUseListOrderImpl(const Value *V, const Function *F,
// LID and RID are equal, so we have different operands of the same user. // LID and RID are equal, so we have different operands of the same user.
// Assume operands are added in order for all instructions. // Assume operands are added in order for all instructions.
if (LID < ID) if (LID <= ID)
if (!IsGlobalValue) // GlobalValue uses don't get reversed. if (!IsGlobalValue) // GlobalValue uses don't get reversed.
return LU->getOperandNo() < RU->getOperandNo(); return LU->getOperandNo() < RU->getOperandNo();
return LU->getOperandNo() > RU->getOperandNo(); return LU->getOperandNo() > RU->getOperandNo();

View File

@ -1,4 +1,5 @@
; RUN: llvm-as %s -o /dev/null ; RUN: llvm-as %s -o /dev/null
; RUN: verify-uselistorder %s -preserve-bc-use-list-order -num-shuffles=5
; Dominance relationships is not calculated correctly for unreachable blocks, ; Dominance relationships is not calculated correctly for unreachable blocks,
; which causes the verifier to barf on this input. ; which causes the verifier to barf on this input.

View File

@ -118,3 +118,16 @@ entry:
%local = load i4* @globalAndFunction %local = load i4* @globalAndFunction
ret i4 %local ret i4 %local
} }
; Check for when an instruction is its own user.
define void @selfUser() {
entry:
ret void
loop1:
br label %loop2
loop2:
%var = phi i32 [ %var, %loop1 ], [ %var, %loop2 ]
br label %loop1
}