1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -indvars -S "-default-data-layout=e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -indvars -S "-default-data-layout=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-f80:128:128-n8:16:32" | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; PR11279: Assertion !IVLimit->getType()->isPointerTy() 5*9880d681SAndroid Build Coastguard Worker; 6*9880d681SAndroid Build Coastguard Worker; Test LinearFunctionTestReplace of a pointer-type loop counter. Note 7*9880d681SAndroid Build Coastguard Worker; that BECount may or may not be a pointer type. A pointer type 8*9880d681SAndroid Build Coastguard Worker; BECount doesn't really make sense, but that's what falls out of 9*9880d681SAndroid Build Coastguard Worker; SCEV. Since it's an i8*, it has unit stride so we never adjust the 10*9880d681SAndroid Build Coastguard Worker; SCEV expression in a way that would convert it to an integer type. 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testnullptrptr( 13*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 14*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne 15*9880d681SAndroid Build Coastguard Workerdefine i8 @testnullptrptr(i8* %buf, i8* %end) nounwind { 16*9880d681SAndroid Build Coastguard Worker br label %loopguard 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerloopguard: 19*9880d681SAndroid Build Coastguard Worker %guard = icmp ult i8* null, %end 20*9880d681SAndroid Build Coastguard Worker br i1 %guard, label %preheader, label %exit 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerpreheader: 23*9880d681SAndroid Build Coastguard Worker br label %loop 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerloop: 26*9880d681SAndroid Build Coastguard Worker %p.01.us.us = phi i8* [ null, %preheader ], [ %gep, %loop ] 27*9880d681SAndroid Build Coastguard Worker %s = phi i8 [0, %preheader], [%snext, %loop] 28*9880d681SAndroid Build Coastguard Worker %gep = getelementptr inbounds i8, i8* %p.01.us.us, i64 1 29*9880d681SAndroid Build Coastguard Worker %snext = load i8, i8* %gep 30*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i8* %gep, %end 31*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %loop, label %exit 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerexit: 34*9880d681SAndroid Build Coastguard Worker %ret = phi i8 [0, %loopguard], [%snext, %loop] 35*9880d681SAndroid Build Coastguard Worker ret i8 %ret 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testptrptr( 39*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 40*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne 41*9880d681SAndroid Build Coastguard Workerdefine i8 @testptrptr(i8* %buf, i8* %end) nounwind { 42*9880d681SAndroid Build Coastguard Worker br label %loopguard 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerloopguard: 45*9880d681SAndroid Build Coastguard Worker %guard = icmp ult i8* %buf, %end 46*9880d681SAndroid Build Coastguard Worker br i1 %guard, label %preheader, label %exit 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerpreheader: 49*9880d681SAndroid Build Coastguard Worker br label %loop 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerloop: 52*9880d681SAndroid Build Coastguard Worker %p.01.us.us = phi i8* [ %buf, %preheader ], [ %gep, %loop ] 53*9880d681SAndroid Build Coastguard Worker %s = phi i8 [0, %preheader], [%snext, %loop] 54*9880d681SAndroid Build Coastguard Worker %gep = getelementptr inbounds i8, i8* %p.01.us.us, i64 1 55*9880d681SAndroid Build Coastguard Worker %snext = load i8, i8* %gep 56*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i8* %gep, %end 57*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %loop, label %exit 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerexit: 60*9880d681SAndroid Build Coastguard Worker %ret = phi i8 [0, %loopguard], [%snext, %loop] 61*9880d681SAndroid Build Coastguard Worker ret i8 %ret 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testnullptrint( 65*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 66*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne 67*9880d681SAndroid Build Coastguard Workerdefine i8 @testnullptrint(i8* %buf, i8* %end) nounwind { 68*9880d681SAndroid Build Coastguard Worker br label %loopguard 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerloopguard: 71*9880d681SAndroid Build Coastguard Worker %bi = ptrtoint i8* %buf to i32 72*9880d681SAndroid Build Coastguard Worker %ei = ptrtoint i8* %end to i32 73*9880d681SAndroid Build Coastguard Worker %cnt = sub i32 %ei, %bi 74*9880d681SAndroid Build Coastguard Worker %guard = icmp ult i32 0, %cnt 75*9880d681SAndroid Build Coastguard Worker br i1 %guard, label %preheader, label %exit 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerpreheader: 78*9880d681SAndroid Build Coastguard Worker br label %loop 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerloop: 81*9880d681SAndroid Build Coastguard Worker %p.01.us.us = phi i8* [ null, %preheader ], [ %gep, %loop ] 82*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %preheader ], [ %ivnext, %loop ] 83*9880d681SAndroid Build Coastguard Worker %s = phi i8 [0, %preheader], [%snext, %loop] 84*9880d681SAndroid Build Coastguard Worker %gep = getelementptr inbounds i8, i8* %p.01.us.us, i64 1 85*9880d681SAndroid Build Coastguard Worker %snext = load i8, i8* %gep 86*9880d681SAndroid Build Coastguard Worker %ivnext = add i32 %iv, 1 87*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %ivnext, %cnt 88*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %loop, label %exit 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerexit: 91*9880d681SAndroid Build Coastguard Worker %ret = phi i8 [0, %loopguard], [%snext, %loop] 92*9880d681SAndroid Build Coastguard Worker ret i8 %ret 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testptrint( 96*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 97*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ne 98*9880d681SAndroid Build Coastguard Workerdefine i8 @testptrint(i8* %buf, i8* %end) nounwind { 99*9880d681SAndroid Build Coastguard Worker br label %loopguard 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerloopguard: 102*9880d681SAndroid Build Coastguard Worker %bi = ptrtoint i8* %buf to i32 103*9880d681SAndroid Build Coastguard Worker %ei = ptrtoint i8* %end to i32 104*9880d681SAndroid Build Coastguard Worker %cnt = sub i32 %ei, %bi 105*9880d681SAndroid Build Coastguard Worker %guard = icmp ult i32 %bi, %cnt 106*9880d681SAndroid Build Coastguard Worker br i1 %guard, label %preheader, label %exit 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerpreheader: 109*9880d681SAndroid Build Coastguard Worker br label %loop 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerloop: 112*9880d681SAndroid Build Coastguard Worker %p.01.us.us = phi i8* [ %buf, %preheader ], [ %gep, %loop ] 113*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ %bi, %preheader ], [ %ivnext, %loop ] 114*9880d681SAndroid Build Coastguard Worker %s = phi i8 [0, %preheader], [%snext, %loop] 115*9880d681SAndroid Build Coastguard Worker %gep = getelementptr inbounds i8, i8* %p.01.us.us, i64 1 116*9880d681SAndroid Build Coastguard Worker %snext = load i8, i8* %gep 117*9880d681SAndroid Build Coastguard Worker %ivnext = add i32 %iv, 1 118*9880d681SAndroid Build Coastguard Worker %cmp = icmp ult i32 %ivnext, %cnt 119*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %loop, label %exit 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerexit: 122*9880d681SAndroid Build Coastguard Worker %ret = phi i8 [0, %loopguard], [%snext, %loop] 123*9880d681SAndroid Build Coastguard Worker ret i8 %ret 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; IV and BECount have two different pointer types here. 127*9880d681SAndroid Build Coastguard Workerdefine void @testnullptr([512 x i8]* %base) nounwind { 128*9880d681SAndroid Build Coastguard Workerentry: 129*9880d681SAndroid Build Coastguard Worker %add.ptr1603 = getelementptr [512 x i8], [512 x i8]* %base, i64 0, i64 512 130*9880d681SAndroid Build Coastguard Worker br label %preheader 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerpreheader: 133*9880d681SAndroid Build Coastguard Worker %cmp1604192 = icmp ult i8* undef, %add.ptr1603 134*9880d681SAndroid Build Coastguard Worker br i1 %cmp1604192, label %for.body, label %for.end1609 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerfor.body: 137*9880d681SAndroid Build Coastguard Worker %r.17193 = phi i8* [ %incdec.ptr1608, %for.body ], [ null, %preheader ] 138*9880d681SAndroid Build Coastguard Worker %incdec.ptr1608 = getelementptr i8, i8* %r.17193, i64 1 139*9880d681SAndroid Build Coastguard Worker %cmp1604 = icmp ult i8* %incdec.ptr1608, %add.ptr1603 140*9880d681SAndroid Build Coastguard Worker br i1 %cmp1604, label %for.body, label %for.end1609 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Workerfor.end1609: 143*9880d681SAndroid Build Coastguard Worker unreachable 144*9880d681SAndroid Build Coastguard Worker} 145