1; RUN: opt < %s -analyze -enable-new-pm=0 -scalar-evolution | FileCheck %s 2; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s 3 4; SCEV would take a long time to compute SCEV expressions for this IR. If SCEV 5; finishes in < 1 second then the bug is fixed. 6 7target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 8target triple = "x86_64--linux-gnu" 9 10define void @smax(i32 %tmp3) { 11 ; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'smax' 12entry: 13 br label %bb4 14 15bb4: 16 %tmp5 = phi i64 [ %tmp62, %bb61 ], [ 0, %entry ] 17 %tmp6 = trunc i64 %tmp5 to i32 18 %tmp7 = shl nsw i32 %tmp6, 8 19 %tmp8 = sub nsw i32 %tmp3, %tmp7 20 %tmp9 = icmp slt i32 %tmp8, 256 21 %tmp10 = select i1 %tmp9, i32 %tmp8, i32 256 22 %tmp11 = add nsw i32 %tmp10, 1 23 %tmp12 = icmp sgt i32 %tmp8, %tmp11 24 %tmp13 = select i1 %tmp12, i32 %tmp11, i32 %tmp8 25 %tmp14 = icmp slt i32 %tmp13, 256 26 %tmp15 = select i1 %tmp14, i32 %tmp13, i32 256 27 %tmp16 = add nsw i32 %tmp15, 1 28 %tmp17 = icmp sgt i32 %tmp8, %tmp16 29 %tmp18 = select i1 %tmp17, i32 %tmp16, i32 %tmp8 30 %tmp19 = icmp slt i32 %tmp18, 256 31 %tmp20 = select i1 %tmp19, i32 %tmp18, i32 256 32 %tmp21 = add nsw i32 %tmp20, 1 33 %tmp22 = icmp sgt i32 %tmp8, %tmp21 34 %tmp23 = select i1 %tmp22, i32 %tmp21, i32 %tmp8 35 %tmp24 = icmp slt i32 %tmp23, 256 36 %tmp25 = select i1 %tmp24, i32 %tmp23, i32 256 37 %tmp26 = add nsw i32 %tmp25, 1 38 %tmp27 = icmp sgt i32 %tmp8, %tmp26 39 %tmp28 = select i1 %tmp27, i32 %tmp26, i32 %tmp8 40 %tmp29 = icmp slt i32 %tmp28, 256 41 %tmp30 = select i1 %tmp29, i32 %tmp28, i32 256 42 %tmp31 = add nsw i32 %tmp30, 1 43 %tmp32 = icmp sgt i32 %tmp8, %tmp31 44 %tmp33 = select i1 %tmp32, i32 %tmp31, i32 %tmp8 45 %tmp34 = icmp slt i32 %tmp33, 256 46 %tmp35 = select i1 %tmp34, i32 %tmp33, i32 256 47 %tmp36 = add nsw i32 %tmp35, 1 48 %tmp37 = icmp sgt i32 %tmp8, %tmp36 49 %tmp38 = select i1 %tmp37, i32 %tmp36, i32 %tmp8 50 %tmp39 = icmp slt i32 %tmp38, 256 51 %tmp40 = select i1 %tmp39, i32 %tmp38, i32 256 52 %tmp41 = add nsw i32 %tmp40, 1 53 %tmp42 = icmp sgt i32 %tmp8, %tmp41 54 %tmp43 = select i1 %tmp42, i32 %tmp41, i32 %tmp8 55 %tmp44 = add nsw i32 %tmp10, 7 56 %tmp45 = icmp slt i32 %tmp43, 256 57 %tmp46 = select i1 %tmp45, i32 %tmp43, i32 256 58; CHECK: %tmp46 = select i1 %tmp45, i32 %tmp43, i32 256 59; CHECK-NEXT: --> (256 smin (1 + (256 smin (1 + (256 smin (1 + (256 smin (1 + (256 smin (1 + (256 smin (1 + (256 smin (1 + (256 smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>))<nsw> smin {%tmp3,+,-256}<%bb4>) U: [-2147483648,257) S: [-2147483648,257) 60 %tmp47 = icmp sgt i32 %tmp44, %tmp46 61 %tmp48 = select i1 %tmp47, i32 %tmp44, i32 %tmp46 62 %tmp49 = ashr i32 %tmp48, 3 63 %tmp50 = icmp sgt i32 %tmp49, 0 64 %tmp51 = select i1 %tmp50, i32 %tmp49, i32 0 65 %tmp52 = zext i32 %tmp51 to i64 66 br label %bb53 67 68bb53: 69 %tmp54 = phi i64 [ undef, %bb4 ], [ %tmp59, %bb53 ] 70 %tmp55 = trunc i64 %tmp54 to i32 71 %tmp56 = shl nsw i32 %tmp55, 3 72 %tmp57 = sext i32 %tmp56 to i64 73 %tmp58 = getelementptr inbounds i8, i8* null, i64 %tmp57 74 store i8 undef, i8* %tmp58, align 8 75 %tmp59 = add nsw i64 %tmp54, 1 76 %tmp60 = icmp eq i64 %tmp59, %tmp52 77 br i1 %tmp60, label %bb61, label %bb53 78 79bb61: 80 %tmp62 = add nuw nsw i64 %tmp5, 1 81 br label %bb4 82} 83 84 85define void @umax(i32 %tmp3) { 86; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'umax' 87entry: 88 br label %bb4 89 90bb4: 91 %tmp5 = phi i64 [ %tmp62, %bb61 ], [ 0, %entry ] 92 %tmp6 = trunc i64 %tmp5 to i32 93 %tmp7 = shl nsw i32 %tmp6, 8 94 %tmp8 = sub nsw i32 %tmp3, %tmp7 95 %tmp9 = icmp ult i32 %tmp8, 256 96 %tmp10 = select i1 %tmp9, i32 %tmp8, i32 256 97 %tmp11 = add nsw i32 %tmp10, 1 98 %tmp12 = icmp ugt i32 %tmp8, %tmp11 99 %tmp13 = select i1 %tmp12, i32 %tmp11, i32 %tmp8 100 %tmp14 = icmp ult i32 %tmp13, 256 101 %tmp15 = select i1 %tmp14, i32 %tmp13, i32 256 102 %tmp16 = add nsw i32 %tmp15, 1 103 %tmp17 = icmp ugt i32 %tmp8, %tmp16 104 %tmp18 = select i1 %tmp17, i32 %tmp16, i32 %tmp8 105 %tmp19 = icmp ult i32 %tmp18, 256 106 %tmp20 = select i1 %tmp19, i32 %tmp18, i32 256 107 %tmp21 = add nsw i32 %tmp20, 1 108 %tmp22 = icmp ugt i32 %tmp8, %tmp21 109 %tmp23 = select i1 %tmp22, i32 %tmp21, i32 %tmp8 110 %tmp24 = icmp ult i32 %tmp23, 256 111 %tmp25 = select i1 %tmp24, i32 %tmp23, i32 256 112 %tmp26 = add nsw i32 %tmp25, 1 113 %tmp27 = icmp ugt i32 %tmp8, %tmp26 114 %tmp28 = select i1 %tmp27, i32 %tmp26, i32 %tmp8 115 %tmp29 = icmp ult i32 %tmp28, 256 116 %tmp30 = select i1 %tmp29, i32 %tmp28, i32 256 117 %tmp31 = add nsw i32 %tmp30, 1 118 %tmp32 = icmp ugt i32 %tmp8, %tmp31 119 %tmp33 = select i1 %tmp32, i32 %tmp31, i32 %tmp8 120 %tmp34 = icmp ult i32 %tmp33, 256 121 %tmp35 = select i1 %tmp34, i32 %tmp33, i32 256 122 %tmp36 = add nsw i32 %tmp35, 1 123 %tmp37 = icmp ugt i32 %tmp8, %tmp36 124 %tmp38 = select i1 %tmp37, i32 %tmp36, i32 %tmp8 125 %tmp39 = icmp ult i32 %tmp38, 256 126 %tmp40 = select i1 %tmp39, i32 %tmp38, i32 256 127 %tmp41 = add nsw i32 %tmp40, 1 128 %tmp42 = icmp ugt i32 %tmp8, %tmp41 129 %tmp43 = select i1 %tmp42, i32 %tmp41, i32 %tmp8 130 %tmp44 = add nsw i32 %tmp10, 7 131 %tmp45 = icmp ult i32 %tmp43, 256 132 %tmp46 = select i1 %tmp45, i32 %tmp43, i32 256 133; CHECK: %tmp46 = select i1 %tmp45, i32 %tmp43, i32 256 134; CHECK-NEXT: --> (256 umin (1 + (256 umin (1 + (256 umin (1 + (256 umin (1 + (256 umin (1 + (256 umin (1 + (256 umin (1 + (256 umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>))<nuw><nsw> umin {%tmp3,+,-256}<%bb4>) U: [0,257) S: [0,257) 135 %tmp47 = icmp ugt i32 %tmp44, %tmp46 136 %tmp48 = select i1 %tmp47, i32 %tmp44, i32 %tmp46 137 %tmp49 = ashr i32 %tmp48, 3 138 %tmp50 = icmp ugt i32 %tmp49, 0 139 %tmp51 = select i1 %tmp50, i32 %tmp49, i32 0 140 %tmp52 = zext i32 %tmp51 to i64 141 br label %bb53 142 143bb53: 144 %tmp54 = phi i64 [ undef, %bb4 ], [ %tmp59, %bb53 ] 145 %tmp55 = trunc i64 %tmp54 to i32 146 %tmp56 = shl nsw i32 %tmp55, 3 147 %tmp57 = sext i32 %tmp56 to i64 148 %tmp58 = getelementptr inbounds i8, i8* null, i64 %tmp57 149 store i8 undef, i8* %tmp58, align 8 150 %tmp59 = add nsw i64 %tmp54, 1 151 %tmp60 = icmp eq i64 %tmp59, %tmp52 152 br i1 %tmp60, label %bb61, label %bb53 153 154bb61: 155 %tmp62 = add nuw nsw i64 %tmp5, 1 156 br label %bb4 157} 158