1; RUN: opt < %s -S -analyze -scalar-evolution | FileCheck %s 2 3; copied from flags-from-poison.ll 4; CHECK-LABEL: @test-add-nuw 5; CHECK: --> {(1 + %offset)<nuw>,+,1}<nuw><%loop> U: [1,0) S: [1,0) 6define void @test-add-nuw(float* %input, i32 %offset, i32 %numIterations) { 7entry: 8 br label %loop 9loop: 10 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ] 11 %nexti = add nuw i32 %i, 1 12 %index32 = add nuw i32 %nexti, %offset 13 %ptr = getelementptr inbounds float, float* %input, i32 %index32 14 %f = load float, float* %ptr, align 4 15 %exitcond = icmp eq i32 %nexti, %numIterations 16 br i1 %exitcond, label %exit, label %loop 17 18exit: 19 ret void 20} 21 22; CHECK-LABEL: @test-addrec-nuw 23; CHECK: --> {(1 + (10 smax %offset))<nuw>,+,1}<nuw><%loop> U: [11,0) S: [11,0) 24define void @test-addrec-nuw(float* %input, i32 %offset, i32 %numIterations) { 25entry: 26 %cmp = icmp sgt i32 %offset, 10 27 %min.10 = select i1 %cmp, i32 %offset, i32 10 28 br label %loop 29loop: 30 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ] 31 %nexti = add nuw i32 %i, 1 32 %index32 = add nuw i32 %nexti, %min.10 33 %ptr = getelementptr inbounds float, float* %input, i32 %index32 34 %f = load float, float* %ptr, align 4 35 %exitcond = icmp eq i32 %nexti, %numIterations 36 br i1 %exitcond, label %exit, label %loop 37 38exit: 39 ret void 40} 41 42; CHECK-LABEL: @test-addrec-nsw-start-neg-strip-neg 43; CHECK: --> {(-1 + (-10 smin %offset))<nsw>,+,-1}<nsw><%loop> U: [-2147483648,-10) S: [-2147483648,-10) 44define void @test-addrec-nsw-start-neg-strip-neg(float* %input, i32 %offset, i32 %numIterations) { 45entry: 46 %cmp = icmp slt i32 %offset, -10 47 %max = select i1 %cmp, i32 %offset, i32 -10 48 br label %loop 49loop: 50 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ] 51 %nexti = add nsw i32 %i, -1 52 %index32 = add nsw i32 %nexti, %max 53 %ptr = getelementptr inbounds float, float* %input, i32 %index32 54 %f = load float, float* %ptr, align 4 55 %exitcond = icmp eq i32 %nexti, %numIterations 56 br i1 %exitcond, label %exit, label %loop 57 58exit: 59 ret void 60} 61 62; CHECK-LABEL: @test-addrec-nsw-start-pos-strip-neg 63; CHECK: --> {(-1 + (10 smin %offset))<nsw>,+,-1}<nsw><%loop> U: [-2147483648,10) S: [-2147483648,10) 64define void @test-addrec-nsw-start-pos-strip-neg(float* %input, i32 %offset, i32 %numIterations) { 65entry: 66 %cmp = icmp slt i32 %offset, 10 67 %max = select i1 %cmp, i32 %offset, i32 10 68 br label %loop 69loop: 70 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ] 71 %nexti = add nsw i32 %i, -1 72 %index32 = add nsw i32 %nexti, %max 73 %ptr = getelementptr inbounds float, float* %input, i32 %index32 74 %f = load float, float* %ptr, align 4 75 %exitcond = icmp eq i32 %nexti, %numIterations 76 br i1 %exitcond, label %exit, label %loop 77 78exit: 79 ret void 80} 81 82; CHECK-LABEL: @test-addrec-nsw-start-pos-strip-pos 83; CHECK: --> {(1 + (10 smax %offset))<nuw><nsw>,+,1}<nuw><nsw><%loop> U: [11,-2147483648) S: [11,-2147483648) 84define void @test-addrec-nsw-start-pos-strip-pos(float* %input, i32 %offset, i32 %numIterations) { 85entry: 86 %cmp = icmp sgt i32 %offset, 10 87 %min = select i1 %cmp, i32 %offset, i32 10 88 br label %loop 89loop: 90 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ] 91 %nexti = add nsw i32 %i, 1 92 %index32 = add nsw i32 %nexti, %min 93 %ptr = getelementptr inbounds float, float* %input, i32 %index32 94 %f = load float, float* %ptr, align 4 95 %exitcond = icmp eq i32 %nexti, %numIterations 96 br i1 %exitcond, label %exit, label %loop 97 98exit: 99 ret void 100} 101 102; CHECK-LABEL: @test-addrec-nsw-start-neg-strip-pos 103; CHECK: --> {(1 + (-10 smax %offset))<nsw>,+,1}<nsw><%loop> U: [-9,-2147483648) S: [-9,-2147483648) 104define void @test-addrec-nsw-start-neg-strip-pos(float* %input, i32 %offset, i32 %numIterations) { 105entry: 106 %cmp = icmp sgt i32 %offset, -10 107 %min = select i1 %cmp, i32 %offset, i32 -10 108 br label %loop 109loop: 110 %i = phi i32 [ %nexti, %loop ], [ 0, %entry ] 111 %nexti = add nsw i32 %i, 1 112 %index32 = add nsw i32 %nexti, %min 113 %ptr = getelementptr inbounds float, float* %input, i32 %index32 114 %f = load float, float* %ptr, align 4 115 %exitcond = icmp eq i32 %nexti, %numIterations 116 br i1 %exitcond, label %exit, label %loop 117 118exit: 119 ret void 120} 121 122