1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 19:23:23 +01:00
llvm-mirror/test/Transforms/IndVarSimplify/rewrite-loop-exit-values-phi.ll
David Stenberg 0b541e25d4 [IndVarSimplify] Fix Modified status when handling dead PHI nodes
When bailing out in rewriteLoopExitValues() you could be left with PHI
nodes in the DeadInsts vector. Those would be not handled by the use of
RecursivelyDeleteTriviallyDeadInstructions() in IndVarSimplify. This
resulted in the IndVarSimplify pass returning an incorrect modified
status. This was caught by the expensive check introduced in D86589.

This patches changes IndVarSimplify so that it deletes those PHI nodes,
using RecursivelyDeleteDeadPHINode().

This fixes PR47486.

Reviewed By: mkazantsev

Differential Revision: https://reviews.llvm.org/D91153
2020-11-26 14:28:21 +01:00

52 lines
1.8 KiB
LLVM

; RUN: opt -indvars -S %s -o - | FileCheck %s
; When bailing out in rewriteLoopExitValues() you would be left with a PHI node
; that was not deleted, and the IndVar pass would return an incorrect modified
; status. This was caught by the expensive check introduced in D86589.
; CHECK-LABEL: header:
; CHECK-NEXT: %idx = phi i64 [ %idx.next, %latch ], [ undef, %entry ]
; CHECK-NEXT: %cond = icmp sgt i64 %n, %idx
; CHECK-NEXT: br i1 %cond, label %end, label %inner.preheader
; CHECK-LABEL: latch:
; CHECK-NEXT: %idx.next = add nsw i64 %idx, -1
; CHECK-NEXT: br label %header
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@ptr = external global i64
define dso_local void @hoge() local_unnamed_addr {
entry: ; preds = %entry
%n = sdiv exact i64 undef, 40
br label %header
header: ; preds = %latch, %entry
%idx = phi i64 [ %idx.next, %latch ], [ undef, %entry ]
%cond = icmp sgt i64 %n, %idx
br i1 %cond, label %end, label %inner
inner: ; preds = %inner, %header
%i = phi i64 [ %i.next, %inner ], [ 0, %header ]
%j = phi i64 [ %j.next, %inner ], [ %n, %header ]
%i.next = add nsw i64 %i, 1
%j.next = add nsw i64 %j, 1
store i64 undef, i64* @ptr
%cond1 = icmp slt i64 %j, %idx
br i1 %cond1, label %inner, label %inner_exit
inner_exit: ; preds = %inner
%indvar = phi i64 [ %i.next, %inner ]
%indvar_use = add i64 %indvar, 1
br label %latch
latch: ; preds = %inner_exit
%idx.next = add nsw i64 %idx, -1
br label %header
end: ; preds = %header
ret void
}