mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-13 23:18:51 +00:00
fc933c073e
For -disable-iv-rewrite, perform LFTR without generating a new "canonical" induction variable. Instead find the "best" existing induction variable for use in the loop exit test and compute the final value of that IV for use in the new loop exit test. In short, convert to a simple eq/ne exit test as long as it's cheap to do so. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135420 91177308-0d34-0410-b5e6-96231b3b80d8
94 lines
3.1 KiB
LLVM
94 lines
3.1 KiB
LLVM
; RUN: opt < %s -indvars -S | FileCheck %s
|
|
; RUN: opt < %s -indvars -disable-iv-rewrite -S | FileCheck %s
|
|
;
|
|
; PR1301
|
|
|
|
; Do a bunch of analysis and prove that the loops can use an i32 trip
|
|
; count without casting.
|
|
;
|
|
; Note that all four functions should actually be converted to
|
|
; memset. However, this test case validates indvars behavior. We
|
|
; don't check that phis are "folded together" because that is a job
|
|
; for loop strength reduction. But indvars must remove sext, zext, and add i8.
|
|
;
|
|
; CHECK-NOT: {{sext|zext|add i8}}
|
|
|
|
; ModuleID = 'ada.bc'
|
|
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-n:8:16:32"
|
|
target triple = "i686-pc-linux-gnu"
|
|
|
|
define void @kinds__sbytezero([256 x i32]* nocapture %a) nounwind {
|
|
bb.thread:
|
|
%tmp46 = getelementptr [256 x i32]* %a, i32 0, i32 0 ; <i32*> [#uses=1]
|
|
store i32 0, i32* %tmp46
|
|
br label %bb
|
|
|
|
bb: ; preds = %bb, %bb.thread
|
|
%i.0.reg2mem.0 = phi i8 [ -128, %bb.thread ], [ %tmp8, %bb ] ; <i8> [#uses=1]
|
|
%tmp8 = add i8 %i.0.reg2mem.0, 1 ; <i8> [#uses=3]
|
|
%tmp1 = sext i8 %tmp8 to i32 ; <i32> [#uses=1]
|
|
%tmp3 = add i32 %tmp1, 128 ; <i32> [#uses=1]
|
|
%tmp4 = getelementptr [256 x i32]* %a, i32 0, i32 %tmp3 ; <i32*> [#uses=1]
|
|
store i32 0, i32* %tmp4
|
|
%0 = icmp eq i8 %tmp8, 127 ; <i1> [#uses=1]
|
|
br i1 %0, label %return, label %bb
|
|
|
|
return: ; preds = %bb
|
|
ret void
|
|
}
|
|
|
|
define void @kinds__ubytezero([256 x i32]* nocapture %a) nounwind {
|
|
bb.thread:
|
|
%tmp35 = getelementptr [256 x i32]* %a, i32 0, i32 0 ; <i32*> [#uses=1]
|
|
store i32 0, i32* %tmp35
|
|
br label %bb
|
|
|
|
bb: ; preds = %bb, %bb.thread
|
|
%i.0.reg2mem.0 = phi i8 [ 0, %bb.thread ], [ %tmp7, %bb ] ; <i8> [#uses=1]
|
|
%tmp7 = add i8 %i.0.reg2mem.0, 1 ; <i8> [#uses=3]
|
|
%tmp1 = zext i8 %tmp7 to i32 ; <i32> [#uses=1]
|
|
%tmp3 = getelementptr [256 x i32]* %a, i32 0, i32 %tmp1 ; <i32*> [#uses=1]
|
|
store i32 0, i32* %tmp3
|
|
%0 = icmp eq i8 %tmp7, -1 ; <i1> [#uses=1]
|
|
br i1 %0, label %return, label %bb
|
|
|
|
return: ; preds = %bb
|
|
ret void
|
|
}
|
|
|
|
define void @kinds__srangezero([21 x i32]* nocapture %a) nounwind {
|
|
bb.thread:
|
|
br label %bb
|
|
|
|
bb: ; preds = %bb, %bb.thread
|
|
%i.0.reg2mem.0 = phi i8 [ -10, %bb.thread ], [ %tmp7, %bb ] ; <i8> [#uses=2]
|
|
%tmp12 = sext i8 %i.0.reg2mem.0 to i32 ; <i32> [#uses=1]
|
|
%tmp4 = add i32 %tmp12, 10 ; <i32> [#uses=1]
|
|
%tmp5 = getelementptr [21 x i32]* %a, i32 0, i32 %tmp4 ; <i32*> [#uses=1]
|
|
store i32 0, i32* %tmp5
|
|
%tmp7 = add i8 %i.0.reg2mem.0, 1 ; <i8> [#uses=2]
|
|
%0 = icmp sgt i8 %tmp7, 10 ; <i1> [#uses=1]
|
|
br i1 %0, label %return, label %bb
|
|
|
|
return: ; preds = %bb
|
|
ret void
|
|
}
|
|
|
|
define void @kinds__urangezero([21 x i32]* nocapture %a) nounwind {
|
|
bb.thread:
|
|
br label %bb
|
|
|
|
bb: ; preds = %bb, %bb.thread
|
|
%i.0.reg2mem.0 = phi i8 [ 10, %bb.thread ], [ %tmp7, %bb ] ; <i8> [#uses=2]
|
|
%tmp12 = sext i8 %i.0.reg2mem.0 to i32 ; <i32> [#uses=1]
|
|
%tmp4 = add i32 %tmp12, -10 ; <i32> [#uses=1]
|
|
%tmp5 = getelementptr [21 x i32]* %a, i32 0, i32 %tmp4 ; <i32*> [#uses=1]
|
|
store i32 0, i32* %tmp5
|
|
%tmp7 = add i8 %i.0.reg2mem.0, 1 ; <i8> [#uses=2]
|
|
%0 = icmp sgt i8 %tmp7, 30 ; <i1> [#uses=1]
|
|
br i1 %0, label %return, label %bb
|
|
|
|
return: ; preds = %bb
|
|
ret void
|
|
}
|