mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
be20c3f9e9
Summary: Since now Scalar Evolution can create non-add rec expressions for PHI nodes, it can also create SCEVConstant expressions. This will confuse replaceCongruentPHIs, which previously relied on the fact that SCEV could not produce constants in this case. We will now replace the node with a constant in these cases - or avoid processing the Phi in case of a type mismatch. Reviewers: sanjoy Subscribers: llvm-commits, majnemer Differential Revision: http://reviews.llvm.org/D14230 llvm-svn: 251938
34 lines
864 B
LLVM
34 lines
864 B
LLVM
; RUN: opt < %s -indvars -S | FileCheck %s
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
; PR25372
|
|
; We can compute the expression of %phi0 and that is a SCEV
|
|
; constant. However, instcombine can't deduce this, so we can
|
|
; potentially end up trying to handle a constant when replacing
|
|
; congruent IVs.
|
|
|
|
; CHECK-LABEL: crash
|
|
define void @crash() {
|
|
entry:
|
|
br i1 false, label %not_taken, label %pre
|
|
|
|
not_taken:
|
|
br label %pre
|
|
|
|
pre:
|
|
; %phi0.pre and %phi1.pre are evaluated by SCEV to constant 0.
|
|
%phi0.pre = phi i32 [ 0, %entry ], [ 2, %not_taken ]
|
|
%phi1.pre = phi i32 [ 0, %entry ], [ 1, %not_taken ]
|
|
br label %loop
|
|
|
|
loop:
|
|
; %phi0 and %phi1 are evaluated by SCEV to constant 0.
|
|
%phi0 = phi i32 [ 0, %loop ], [ %phi0.pre, %pre ]
|
|
%phi1 = phi i32 [ 0, %loop ], [ %phi1.pre, %pre ]
|
|
br i1 undef, label %exit, label %loop
|
|
|
|
exit:
|
|
ret void
|
|
}
|