1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00
llvm-mirror/test/Analysis/ScalarEvolution/2008-07-29-SMinExpr.ll
Keno Fischer ca6b59008b [SCEV] Add explicit representations of umin/smin
Summary:
Currently we express umin as `~umax(~x, ~y)`. However, this becomes
a problem for operands in non-integral pointer spaces, because `~x`
is not something we can compute for `x` non-integral. However, since
comparisons are generally still allowed, we are actually able to
express `umin(x, y)` directly as long as we don't try to express is
as a umax. Support this by adding an explicit umin/smin representation
to SCEV. We do this by factoring the existing getUMax/getSMax functions
into a new function that does all four. The previous two functions were
largely identical.

Reviewed By: sanjoy
Differential Revision: https://reviews.llvm.org/D50167

llvm-svn: 360159
2019-05-07 15:28:47 +00:00

27 lines
801 B
LLVM

; RUN: opt < %s -analyze -scalar-evolution \
; RUN: -scalar-evolution-max-iterations=0 | FileCheck %s
; PR2607
define i32 @b(i32 %x, i32 %y) nounwind {
entry:
%cmp2 = icmp slt i32 %y, %x
%cond3 = select i1 %cmp2, i32 %y, i32 %x
%cmp54 = icmp slt i32 %cond3, -2147483632
br i1 %cmp54, label %forinc, label %afterfor
forinc: ; preds = %forinc, %entry
%j.01 = phi i32 [ %dec, %forinc ], [ -2147483632, %entry ]
%dec = add i32 %j.01, -1
%cmp = icmp slt i32 %y, %x
%cond = select i1 %cmp, i32 %y, i32 %x
%cmp5 = icmp sgt i32 %dec, %cond
br i1 %cmp5, label %forinc, label %afterfor
afterfor: ; preds = %forinc, %entry
%j.0.lcssa = phi i32 [ -2147483632, %entry ], [ %dec, %forinc ]
ret i32 %j.0.lcssa
}
; CHECK: backedge-taken count is (-2147483633 + (-1 * (%{{[xy]}} smin %{{[xy]}})))