1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -indvars -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; PR1301 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Do a bunch of analysis and prove that the loops can use an i32 trip 6*9880d681SAndroid Build Coastguard Worker; count without casting. 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker; Note that all four functions should actually be converted to 9*9880d681SAndroid Build Coastguard Worker; memset. However, this test case validates indvars behavior. We 10*9880d681SAndroid Build Coastguard Worker; don't check that phis are "folded together" because that is a job 11*9880d681SAndroid Build Coastguard Worker; for loop strength reduction. But indvars must remove sext, zext, and add i8. 12*9880d681SAndroid Build Coastguard Worker; 13*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{sext|zext|add i8}} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; ModuleID = 'ada.bc' 16*9880d681SAndroid Build Coastguard Workertarget 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-n8:16:32" 17*9880d681SAndroid Build Coastguard Workertarget triple = "i686-pc-linux-gnu" 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine void @kinds__sbytezero([256 x i32]* nocapture %a) nounwind { 20*9880d681SAndroid Build Coastguard Workerbb.thread: 21*9880d681SAndroid Build Coastguard Worker %tmp46 = getelementptr [256 x i32], [256 x i32]* %a, i32 0, i32 0 ; <i32*> [#uses=1] 22*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %tmp46 23*9880d681SAndroid Build Coastguard Worker br label %bb 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerbb: ; preds = %bb, %bb.thread 26*9880d681SAndroid Build Coastguard Worker %i.0.reg2mem.0 = phi i8 [ -128, %bb.thread ], [ %tmp8, %bb ] ; <i8> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker %tmp8 = add i8 %i.0.reg2mem.0, 1 ; <i8> [#uses=3] 28*9880d681SAndroid Build Coastguard Worker %tmp1 = sext i8 %tmp8 to i32 ; <i32> [#uses=1] 29*9880d681SAndroid Build Coastguard Worker %tmp3 = add i32 %tmp1, 128 ; <i32> [#uses=1] 30*9880d681SAndroid Build Coastguard Worker %tmp4 = getelementptr [256 x i32], [256 x i32]* %a, i32 0, i32 %tmp3 ; <i32*> [#uses=1] 31*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %tmp4 32*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i8 %tmp8, 127 ; <i1> [#uses=1] 33*9880d681SAndroid Build Coastguard Worker br i1 %0, label %return, label %bb 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %bb 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine void @kinds__ubytezero([256 x i32]* nocapture %a) nounwind { 40*9880d681SAndroid Build Coastguard Workerbb.thread: 41*9880d681SAndroid Build Coastguard Worker %tmp35 = getelementptr [256 x i32], [256 x i32]* %a, i32 0, i32 0 ; <i32*> [#uses=1] 42*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %tmp35 43*9880d681SAndroid Build Coastguard Worker br label %bb 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerbb: ; preds = %bb, %bb.thread 46*9880d681SAndroid Build Coastguard Worker %i.0.reg2mem.0 = phi i8 [ 0, %bb.thread ], [ %tmp7, %bb ] ; <i8> [#uses=1] 47*9880d681SAndroid Build Coastguard Worker %tmp7 = add i8 %i.0.reg2mem.0, 1 ; <i8> [#uses=3] 48*9880d681SAndroid Build Coastguard Worker %tmp1 = zext i8 %tmp7 to i32 ; <i32> [#uses=1] 49*9880d681SAndroid Build Coastguard Worker %tmp3 = getelementptr [256 x i32], [256 x i32]* %a, i32 0, i32 %tmp1 ; <i32*> [#uses=1] 50*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %tmp3 51*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i8 %tmp7, -1 ; <i1> [#uses=1] 52*9880d681SAndroid Build Coastguard Worker br i1 %0, label %return, label %bb 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %bb 55*9880d681SAndroid Build Coastguard Worker ret void 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine void @kinds__srangezero([21 x i32]* nocapture %a) nounwind { 59*9880d681SAndroid Build Coastguard Workerbb.thread: 60*9880d681SAndroid Build Coastguard Worker br label %bb 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerbb: ; preds = %bb, %bb.thread 63*9880d681SAndroid Build Coastguard Worker %i.0.reg2mem.0 = phi i8 [ -10, %bb.thread ], [ %tmp7, %bb ] ; <i8> [#uses=2] 64*9880d681SAndroid Build Coastguard Worker %tmp12 = sext i8 %i.0.reg2mem.0 to i32 ; <i32> [#uses=1] 65*9880d681SAndroid Build Coastguard Worker %tmp4 = add i32 %tmp12, 10 ; <i32> [#uses=1] 66*9880d681SAndroid Build Coastguard Worker %tmp5 = getelementptr [21 x i32], [21 x i32]* %a, i32 0, i32 %tmp4 ; <i32*> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %tmp5 68*9880d681SAndroid Build Coastguard Worker %tmp7 = add i8 %i.0.reg2mem.0, 1 ; <i8> [#uses=2] 69*9880d681SAndroid Build Coastguard Worker %0 = icmp sgt i8 %tmp7, 10 ; <i1> [#uses=1] 70*9880d681SAndroid Build Coastguard Worker br i1 %0, label %return, label %bb 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %bb 73*9880d681SAndroid Build Coastguard Worker ret void 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine void @kinds__urangezero([21 x i32]* nocapture %a) nounwind { 77*9880d681SAndroid Build Coastguard Workerbb.thread: 78*9880d681SAndroid Build Coastguard Worker br label %bb 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerbb: ; preds = %bb, %bb.thread 81*9880d681SAndroid Build Coastguard Worker %i.0.reg2mem.0 = phi i8 [ 10, %bb.thread ], [ %tmp7, %bb ] ; <i8> [#uses=2] 82*9880d681SAndroid Build Coastguard Worker %tmp12 = sext i8 %i.0.reg2mem.0 to i32 ; <i32> [#uses=1] 83*9880d681SAndroid Build Coastguard Worker %tmp4 = add i32 %tmp12, -10 ; <i32> [#uses=1] 84*9880d681SAndroid Build Coastguard Worker %tmp5 = getelementptr [21 x i32], [21 x i32]* %a, i32 0, i32 %tmp4 ; <i32*> [#uses=1] 85*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %tmp5 86*9880d681SAndroid Build Coastguard Worker %tmp7 = add i8 %i.0.reg2mem.0, 1 ; <i8> [#uses=2] 87*9880d681SAndroid Build Coastguard Worker %0 = icmp sgt i8 %tmp7, 30 ; <i1> [#uses=1] 88*9880d681SAndroid Build Coastguard Worker br i1 %0, label %return, label %bb 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %bb 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker} 93