1 ; RUN: opt < %s -scalar-evolution -analyze \ 2 ; RUN: | grep " --> (sext i. {.*,+,.*}<%bb1> to i64)" | count 5 3 4 ; Don't convert (sext {...,+,...}) to {sext(...),+,sext(...)} in cases 5 ; where the trip count is not within range. 6 7 target datalayout = "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" 8 target triple = "x86_64-unknown-linux-gnu" 9 10 define void @foo0(double* nocapture %x) nounwind { 11 bb1.thread: 12 br label %bb1 13 14 bb1: ; preds = %bb1, %bb1.thread 15 %i.0.reg2mem.0 = phi i64 [ -128, %bb1.thread ], [ %8, %bb1 ] ; <i64> [#uses=3] 16 %0 = trunc i64 %i.0.reg2mem.0 to i7 ; <i8> [#uses=1] 17 %1 = trunc i64 %i.0.reg2mem.0 to i9 ; <i8> [#uses=1] 18 %2 = sext i9 %1 to i64 ; <i64> [#uses=1] 19 %3 = getelementptr double* %x, i64 %2 ; <double*> [#uses=1] 20 %4 = load double* %3, align 8 ; <double> [#uses=1] 21 %5 = fmul double %4, 3.900000e+00 ; <double> [#uses=1] 22 %6 = sext i7 %0 to i64 ; <i64> [#uses=1] 23 %7 = getelementptr double* %x, i64 %6 ; <double*> [#uses=1] 24 store double %5, double* %7, align 8 25 %8 = add i64 %i.0.reg2mem.0, 1 ; <i64> [#uses=2] 26 %9 = icmp sgt i64 %8, 127 ; <i1> [#uses=1] 27 br i1 %9, label %return, label %bb1 28 29 return: ; preds = %bb1 30 ret void 31 } 32 33 define void @foo1(double* nocapture %x) nounwind { 34 bb1.thread: 35 br label %bb1 36 37 bb1: ; preds = %bb1, %bb1.thread 38 %i.0.reg2mem.0 = phi i64 [ -128, %bb1.thread ], [ %8, %bb1 ] ; <i64> [#uses=3] 39 %0 = trunc i64 %i.0.reg2mem.0 to i8 ; <i8> [#uses=1] 40 %1 = trunc i64 %i.0.reg2mem.0 to i9 ; <i8> [#uses=1] 41 %2 = sext i9 %1 to i64 ; <i64> [#uses=1] 42 %3 = getelementptr double* %x, i64 %2 ; <double*> [#uses=1] 43 %4 = load double* %3, align 8 ; <double> [#uses=1] 44 %5 = fmul double %4, 3.900000e+00 ; <double> [#uses=1] 45 %6 = sext i8 %0 to i64 ; <i64> [#uses=1] 46 %7 = getelementptr double* %x, i64 %6 ; <double*> [#uses=1] 47 store double %5, double* %7, align 8 48 %8 = add i64 %i.0.reg2mem.0, 1 ; <i64> [#uses=2] 49 %9 = icmp sgt i64 %8, 128 ; <i1> [#uses=1] 50 br i1 %9, label %return, label %bb1 51 52 return: ; preds = %bb1 53 ret void 54 } 55 56 define void @foo2(double* nocapture %x) nounwind { 57 bb1.thread: 58 br label %bb1 59 60 bb1: ; preds = %bb1, %bb1.thread 61 %i.0.reg2mem.0 = phi i64 [ -129, %bb1.thread ], [ %8, %bb1 ] ; <i64> [#uses=3] 62 %0 = trunc i64 %i.0.reg2mem.0 to i8 ; <i8> [#uses=1] 63 %1 = trunc i64 %i.0.reg2mem.0 to i9 ; <i8> [#uses=1] 64 %2 = sext i9 %1 to i64 ; <i64> [#uses=1] 65 %3 = getelementptr double* %x, i64 %2 ; <double*> [#uses=1] 66 %4 = load double* %3, align 8 ; <double> [#uses=1] 67 %5 = fmul double %4, 3.900000e+00 ; <double> [#uses=1] 68 %6 = sext i8 %0 to i64 ; <i64> [#uses=1] 69 %7 = getelementptr double* %x, i64 %6 ; <double*> [#uses=1] 70 store double %5, double* %7, align 8 71 %8 = add i64 %i.0.reg2mem.0, 1 ; <i64> [#uses=2] 72 %9 = icmp sgt i64 %8, 127 ; <i1> [#uses=1] 73 br i1 %9, label %return, label %bb1 74 75 return: ; preds = %bb1 76 ret void 77 } 78 79 define void @foo3(double* nocapture %x) nounwind { 80 bb1.thread: 81 br label %bb1 82 83 bb1: ; preds = %bb1, %bb1.thread 84 %i.0.reg2mem.0 = phi i64 [ -128, %bb1.thread ], [ %8, %bb1 ] ; <i64> [#uses=3] 85 %0 = trunc i64 %i.0.reg2mem.0 to i8 ; <i8> [#uses=1] 86 %1 = trunc i64 %i.0.reg2mem.0 to i9 ; <i8> [#uses=1] 87 %2 = sext i9 %1 to i64 ; <i64> [#uses=1] 88 %3 = getelementptr double* %x, i64 %2 ; <double*> [#uses=1] 89 %4 = load double* %3, align 8 ; <double> [#uses=1] 90 %5 = fmul double %4, 3.900000e+00 ; <double> [#uses=1] 91 %6 = sext i8 %0 to i64 ; <i64> [#uses=1] 92 %7 = getelementptr double* %x, i64 %6 ; <double*> [#uses=1] 93 store double %5, double* %7, align 8 94 %8 = add i64 %i.0.reg2mem.0, -1 ; <i64> [#uses=2] 95 %9 = icmp sgt i64 %8, 127 ; <i1> [#uses=1] 96 br i1 %9, label %return, label %bb1 97 98 return: ; preds = %bb1 99 ret void 100 } 101