1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -S -indvars | grep "= icmp" | count 3 2*9880d681SAndroid Build Coastguard Worker; PR4914.ll 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Indvars should be able to do range analysis and eliminate icmps. 5*9880d681SAndroid Build Coastguard Worker; There are two here which cannot be eliminated. 6*9880d681SAndroid Build Coastguard Worker; There's one that icmp which can be eliminated and which indvars currently 7*9880d681SAndroid Build Coastguard Worker; cannot eliminate, because it requires analyzing more than just the 8*9880d681SAndroid Build Coastguard Worker; range of the induction variable. 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker@0 = private constant [4 x i8] c"%d\0A\00", align 1 ; <[4 x i8]*> [#uses=1] 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine i32 @main() nounwind { 13*9880d681SAndroid Build Coastguard Workerbb: 14*9880d681SAndroid Build Coastguard Worker br label %bb1 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %bb14, %bb 17*9880d681SAndroid Build Coastguard Worker %t = phi i32 [ 0, %bb ], [ %t19, %bb14 ] ; <i32> [#uses=5] 18*9880d681SAndroid Build Coastguard Worker %t2 = phi i32 [ 0, %bb ], [ %t18, %bb14 ] ; <i32> [#uses=1] 19*9880d681SAndroid Build Coastguard Worker %t3 = icmp slt i32 %t, 0 ; <i1> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker br i1 %t3, label %bb7, label %bb4 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerbb4: ; preds = %bb1 23*9880d681SAndroid Build Coastguard Worker %t5 = icmp sgt i32 %t, 255 ; <i1> [#uses=1] 24*9880d681SAndroid Build Coastguard Worker %t6 = select i1 %t5, i32 255, i32 %t ; <i32> [#uses=1] 25*9880d681SAndroid Build Coastguard Worker br label %bb7 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerbb7: ; preds = %bb4, %bb1 28*9880d681SAndroid Build Coastguard Worker %t8 = phi i32 [ %t6, %bb4 ], [ 0, %bb1 ] ; <i32> [#uses=1] 29*9880d681SAndroid Build Coastguard Worker %t9 = sub i32 0, %t ; <i32> [#uses=3] 30*9880d681SAndroid Build Coastguard Worker %t10 = icmp slt i32 %t9, 0 ; <i1> [#uses=1] 31*9880d681SAndroid Build Coastguard Worker br i1 %t10, label %bb14, label %bb11 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerbb11: ; preds = %bb7 34*9880d681SAndroid Build Coastguard Worker %t12 = icmp sgt i32 %t9, 255 ; <i1> [#uses=1] 35*9880d681SAndroid Build Coastguard Worker %t13 = select i1 %t12, i32 255, i32 %t9 ; <i32> [#uses=1] 36*9880d681SAndroid Build Coastguard Worker br label %bb14 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerbb14: ; preds = %bb11, %bb7 39*9880d681SAndroid Build Coastguard Worker %t15 = phi i32 [ %t13, %bb11 ], [ 0, %bb7 ] ; <i32> [#uses=1] 40*9880d681SAndroid Build Coastguard Worker %t16 = add nsw i32 %t2, 255 ; <i32> [#uses=1] 41*9880d681SAndroid Build Coastguard Worker %t17 = add nsw i32 %t16, %t8 ; <i32> [#uses=1] 42*9880d681SAndroid Build Coastguard Worker %t18 = add nsw i32 %t17, %t15 ; <i32> [#uses=2] 43*9880d681SAndroid Build Coastguard Worker %t19 = add nsw i32 %t, 1 ; <i32> [#uses=2] 44*9880d681SAndroid Build Coastguard Worker %t20 = icmp slt i32 %t19, 1000000000 ; <i1> [#uses=1] 45*9880d681SAndroid Build Coastguard Worker br i1 %t20, label %bb1, label %bb21 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerbb21: ; preds = %bb14 48*9880d681SAndroid Build Coastguard Worker %t22 = call i32 (i8*, ...) @printf(i8* noalias getelementptr inbounds ([4 x i8], [4 x i8]* @0, i32 0, i32 0), i32 %t18) nounwind 49*9880d681SAndroid Build Coastguard Worker ret i32 0 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdeclare i32 @printf(i8* noalias nocapture, ...) nounwind 53