1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00
llvm-mirror/test/Analysis/ScalarEvolution/pr35890.ll
Max Kazantsev f028dfc8f5 [SCEV] Make getPostIncExpr guaranteed to return AddRec
The current implementation of `getPostIncExpr` invokes `getAddExpr` for two recurrencies
and expects that it always returns it a recurrency. But this is not guaranteed to happen if we
have reached max recursion depth or refused to make SCEV simplification for other reasons.

This patch changes its implementation so that now it always returns SCEVAddRec without
relying on `getAddExpr`.

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

llvm-svn: 324866
2018-02-12 05:09:38 +00:00

45 lines
1009 B
LLVM

; RUN: opt < %s -scalar-evolution-max-arith-depth=0 -indvars -S | FileCheck %s
target datalayout = "e-m:e-i32:64-f80:128-n8:16:32:64-S128-ni:1"
target triple = "x86_64-unknown-linux-gnu"
; Check that it does not crash because SCEVAddRec's step is not an AddRec.
define void @pr35890(i32* %inc_ptr, i32 %a) {
; CHECK-LABEL: @pr35890(
entry:
%inc = load i32, i32* %inc_ptr, !range !0
%ne.cond = icmp ne i32 %inc, 0
br i1 %ne.cond, label %loop, label %bail
loop:
%iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
%a.1 = add i32 %a, 1
%iv.next = add i32 %iv, %a.1
%iv.wide = zext i32 %iv to i64
%iv.square = mul i64 %iv.wide, %iv.wide
%iv.cube = mul i64 %iv.square, %iv.wide
%brcond = icmp slt i64 %iv.wide, %iv.cube
br i1 %brcond, label %if.true, label %if.false
if.true:
br label %backedge
if.false:
br label %backedge
backedge:
%loopcond = icmp slt i32 %iv, 200
br i1 %loopcond, label %loop, label %exit
exit:
ret void
bail:
ret void
}
!0 = !{i32 0, i32 100}