mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-08 13:00:43 +00:00
0c35941274
Summary: When forming expressions for phi nodes having an incoming value from outside the loop A and a value coming from the previous iteration B we were forming an AddRec if: - B was an AddRec - the value A was equal to the value for B at iteration -1 (or equal to the value of B shifted by one iteration, at iteration 0) In this case, we were computing the expression to be the expression of B, shifted by one iteration. This changes generalizes the logic above by removing the restriction that B needs to be an AddRec. For this we introduce two expression rewriters that allow us to - shift an expression by one iteration - get the value of an expression at iteration 0 This allows us to get SCEV expressions for PHI nodes when these expressions are not AddRecExprs. Reviewers: sanjoy Subscribers: llvm-commits, sanjoy Differential Revision: http://reviews.llvm.org/D14175 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251700 91177308-0d34-0410-b5e6-96231b3b80d8
60 lines
1.4 KiB
LLVM
60 lines
1.4 KiB
LLVM
; RUN: opt -scalar-evolution -analyze < %s | FileCheck %s
|
|
|
|
define void @test1(i8 %t, i32 %len) {
|
|
; CHECK-LABEL: test1
|
|
; CHECK: %sphi = phi i32 [ %ext, %entry ], [ %idx.inc.ext, %loop ]
|
|
; CHECK-NEXT: --> (zext i8 {%t,+,1}<%loop> to i32)
|
|
|
|
entry:
|
|
%st = zext i8 %t to i16
|
|
%ext = zext i8 %t to i32
|
|
%ecmp = icmp ult i16 %st, 42
|
|
br i1 %ecmp, label %loop, label %exit
|
|
|
|
loop:
|
|
|
|
%idx = phi i8 [ %t, %entry ], [ %idx.inc, %loop ]
|
|
%sphi = phi i32 [ %ext, %entry ], [%idx.inc.ext, %loop]
|
|
|
|
%idx.inc = add i8 %idx, 1
|
|
%idx.inc.ext = zext i8 %idx.inc to i32
|
|
%idx.ext = zext i8 %idx to i32
|
|
|
|
%c = icmp ult i32 %idx.inc.ext, %len
|
|
br i1 %c, label %loop, label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @test2(i8 %t, i32 %len) {
|
|
; CHECK-LABEL: test2
|
|
; CHECK: %sphi = phi i32 [ %ext.mul, %entry ], [ %mul, %loop ]
|
|
; CHECK-NEXT: --> (4 * (zext i8 {%t,+,1}<%loop> to i32))
|
|
|
|
entry:
|
|
%st = zext i8 %t to i16
|
|
%ext = zext i8 %t to i32
|
|
%ext.mul = mul i32 %ext, 4
|
|
|
|
%ecmp = icmp ult i16 %st, 42
|
|
br i1 %ecmp, label %loop, label %exit
|
|
|
|
loop:
|
|
|
|
%idx = phi i8 [ %t, %entry ], [ %idx.inc, %loop ]
|
|
%sphi = phi i32 [ %ext.mul, %entry ], [%mul, %loop]
|
|
|
|
%idx.inc = add i8 %idx, 1
|
|
%idx.inc.ext = zext i8 %idx.inc to i32
|
|
%mul = mul i32 %idx.inc.ext, 4
|
|
|
|
%idx.ext = zext i8 %idx to i32
|
|
|
|
%c = icmp ult i32 %idx.inc.ext, %len
|
|
br i1 %c, label %loop, label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|