268 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes='print<delinearization>' -disable-output 2>&1 | FileCheck %s3;4; a, b, c, d, g, h;5; char *f;6; static fn1(p1) {7; char *e = p1;8; for (; d;) {9; a = 0;10; for (;; ++a)11; for (; b; ++b)12; c = e[b + a];13; }14; }15;16; fn2() {17; for (;;)18; fn1(&f[g * h]);19; }20 21@g = common global i32 0, align 422@h = common global i32 0, align 423@f = common global ptr null, align 424@a = common global i32 0, align 425@b = common global i32 0, align 426@c = common global i32 0, align 427@d = common global i32 0, align 428 29define i32 @fn2() {30; CHECK-LABEL: 'fn2'31; CHECK-NEXT: Inst: store i32 %storemerge.i, ptr @a, align 432; CHECK-NEXT: AccessFunction: 033; CHECK-NEXT: failed to delinearize34; CHECK-EMPTY:35; CHECK-NEXT: Inst: %9 = load i8, ptr %arrayidx.i, align 136; CHECK-NEXT: AccessFunction: (sext i32 {({(%1 * %2),+,1}<nw><%for.cond2thread-pre-split.i> + %.pr.i),+,8}<nw><%for.body4.i> to i64)37; CHECK-NEXT: failed to delinearize38; CHECK-EMPTY:39; CHECK-NEXT: Inst: store i32 %conv.i, ptr @c, align 440; CHECK-NEXT: AccessFunction: 041; CHECK-NEXT: failed to delinearize42; CHECK-EMPTY:43; CHECK-NEXT: Inst: store i32 %inc.i, ptr @b, align 444; CHECK-NEXT: AccessFunction: 045; CHECK-NEXT: failed to delinearize46; CHECK-EMPTY:47; CHECK-NEXT: Inst: %10 = load i8, ptr %arrayidx.1.i, align 148; CHECK-NEXT: AccessFunction: (sext i32 {({(1 + (%1 * %2)),+,1}<nw><%for.cond2thread-pre-split.i> + %.pr.i),+,8}<nw><%for.body4.i> to i64)49; CHECK-NEXT: failed to delinearize50; CHECK-EMPTY:51; CHECK-NEXT: Inst: store i32 %conv.1.i, ptr @c, align 452; CHECK-NEXT: AccessFunction: 053; CHECK-NEXT: failed to delinearize54; CHECK-EMPTY:55; CHECK-NEXT: Inst: store i32 %inc.1.i, ptr @b, align 456; CHECK-NEXT: AccessFunction: 057; CHECK-NEXT: failed to delinearize58; CHECK-EMPTY:59; CHECK-NEXT: Inst: %11 = load i8, ptr %arrayidx.2.i, align 160; CHECK-NEXT: AccessFunction: (sext i32 {({(2 + (%1 * %2)),+,1}<nw><%for.cond2thread-pre-split.i> + %.pr.i),+,8}<nw><%for.body4.i> to i64)61; CHECK-NEXT: failed to delinearize62; CHECK-EMPTY:63; CHECK-NEXT: Inst: store i32 %conv.2.i, ptr @c, align 464; CHECK-NEXT: AccessFunction: 065; CHECK-NEXT: failed to delinearize66; CHECK-EMPTY:67; CHECK-NEXT: Inst: store i32 %inc.2.i, ptr @b, align 468; CHECK-NEXT: AccessFunction: 069; CHECK-NEXT: failed to delinearize70; CHECK-EMPTY:71; CHECK-NEXT: Inst: %12 = load i8, ptr %arrayidx.3.i, align 172; CHECK-NEXT: AccessFunction: (sext i32 {({(3 + (%1 * %2)),+,1}<nw><%for.cond2thread-pre-split.i> + %.pr.i),+,8}<nw><%for.body4.i> to i64)73; CHECK-NEXT: failed to delinearize74; CHECK-EMPTY:75; CHECK-NEXT: Inst: store i32 %conv.3.i, ptr @c, align 476; CHECK-NEXT: AccessFunction: 077; CHECK-NEXT: failed to delinearize78; CHECK-EMPTY:79; CHECK-NEXT: Inst: store i32 %inc.3.i, ptr @b, align 480; CHECK-NEXT: AccessFunction: 081; CHECK-NEXT: failed to delinearize82; CHECK-EMPTY:83; CHECK-NEXT: Inst: %13 = load i8, ptr %arrayidx.4.i, align 184; CHECK-NEXT: AccessFunction: (sext i32 {({(4 + (%1 * %2)),+,1}<nw><%for.cond2thread-pre-split.i> + %.pr.i),+,8}<nw><%for.body4.i> to i64)85; CHECK-NEXT: failed to delinearize86; CHECK-EMPTY:87; CHECK-NEXT: Inst: store i32 %conv.4.i, ptr @c, align 488; CHECK-NEXT: AccessFunction: 089; CHECK-NEXT: failed to delinearize90; CHECK-EMPTY:91; CHECK-NEXT: Inst: store i32 %inc.4.i, ptr @b, align 492; CHECK-NEXT: AccessFunction: 093; CHECK-NEXT: failed to delinearize94; CHECK-EMPTY:95; CHECK-NEXT: Inst: %14 = load i8, ptr %arrayidx.5.i, align 196; CHECK-NEXT: AccessFunction: (sext i32 {({(5 + (%1 * %2)),+,1}<nw><%for.cond2thread-pre-split.i> + %.pr.i),+,8}<nw><%for.body4.i> to i64)97; CHECK-NEXT: failed to delinearize98; CHECK-EMPTY:99; CHECK-NEXT: Inst: store i32 %conv.5.i, ptr @c, align 4100; CHECK-NEXT: AccessFunction: 0101; CHECK-NEXT: failed to delinearize102; CHECK-EMPTY:103; CHECK-NEXT: Inst: store i32 %inc.5.i, ptr @b, align 4104; CHECK-NEXT: AccessFunction: 0105; CHECK-NEXT: failed to delinearize106; CHECK-EMPTY:107; CHECK-NEXT: Inst: %15 = load i8, ptr %arrayidx.6.i, align 1108; CHECK-NEXT: AccessFunction: (sext i32 {({(6 + (%1 * %2)),+,1}<nw><%for.cond2thread-pre-split.i> + %.pr.i),+,8}<nw><%for.body4.i> to i64)109; CHECK-NEXT: failed to delinearize110; CHECK-EMPTY:111; CHECK-NEXT: Inst: store i32 %conv.6.i, ptr @c, align 4112; CHECK-NEXT: AccessFunction: 0113; CHECK-NEXT: failed to delinearize114; CHECK-EMPTY:115; CHECK-NEXT: Inst: store i32 %inc.6.i, ptr @b, align 4116; CHECK-NEXT: AccessFunction: 0117; CHECK-NEXT: failed to delinearize118; CHECK-EMPTY:119; CHECK-NEXT: Inst: %16 = load i8, ptr %arrayidx.7.i, align 1120; CHECK-NEXT: AccessFunction: (sext i32 {({(7 + (%1 * %2)),+,1}<nw><%for.cond2thread-pre-split.i> + %.pr.i),+,8}<nw><%for.body4.i> to i64)121; CHECK-NEXT: failed to delinearize122; CHECK-EMPTY:123; CHECK-NEXT: Inst: store i32 %conv.7.i, ptr @c, align 4124; CHECK-NEXT: AccessFunction: 0125; CHECK-NEXT: failed to delinearize126; CHECK-EMPTY:127; CHECK-NEXT: Inst: store i32 %inc.7.i, ptr @b, align 4128; CHECK-NEXT: AccessFunction: 0129; CHECK-NEXT: failed to delinearize130; CHECK-EMPTY:131; CHECK-NEXT: Inst: %21 = load i8, ptr %arrayidx.ur.i, align 1132; CHECK-NEXT: AccessFunction: (sext i32 {({(%1 * %2),+,1}<nw><%for.cond2thread-pre-split.i> + %.ph),+,1}<nw><%for.body4.ur.i> to i64)133; CHECK-NEXT: failed to delinearize134; CHECK-EMPTY:135; CHECK-NEXT: Inst: store i32 %conv.ur.i, ptr @c, align 4136; CHECK-NEXT: AccessFunction: 0137; CHECK-NEXT: failed to delinearize138; CHECK-EMPTY:139; CHECK-NEXT: Inst: store i32 %inc.ur.i, ptr @b, align 4140; CHECK-NEXT: AccessFunction: 0141; CHECK-NEXT: failed to delinearize142;143entry:144 %.pr = load i32, ptr @d, align 4145 %phitmp = icmp eq i32 %.pr, 0146 br label %for.cond147 148for.cond:149 %0 = phi i1 [ true, %for.cond ], [ %phitmp, %entry ]150 br i1 %0, label %for.cond, label %for.cond2thread-pre-split.preheader.i151 152for.cond2thread-pre-split.preheader.i:153 %1 = load i32, ptr @g, align 4154 %2 = load i32, ptr @h, align 4155 %mul = mul nsw i32 %2, %1156 %3 = load ptr, ptr @f, align 4157 %.pr.pre.i = load i32, ptr @b, align 4158 br label %for.cond2thread-pre-split.i159 160for.cond2thread-pre-split.i:161 %.pr.i = phi i32 [ 0, %for.inc5.i ], [ %.pr.pre.i, %for.cond2thread-pre-split.preheader.i ]162 %storemerge.i = phi i32 [ %inc6.i, %for.inc5.i ], [ 0, %for.cond2thread-pre-split.preheader.i ]163 store i32 %storemerge.i, ptr @a, align 4164 %tobool31.i = icmp eq i32 %.pr.i, 0165 br i1 %tobool31.i, label %for.inc5.i, label %for.body4.preheader.i166 167for.body4.preheader.i:168 %4 = icmp slt i32 %.pr.i, -7169 %add.i = add i32 %storemerge.i, %mul170 br i1 %4, label %for.body4.i.preheader, label %for.body4.ur.i.preheader171 172for.body4.i.preheader:173 %5 = sub i32 -8, %.pr.i174 %6 = lshr i32 %5, 3175 %7 = mul i32 %6, 8176 br label %for.body4.i177 178for.body4.i:179 %8 = phi i32 [ %inc.7.i, %for.body4.i ], [ %.pr.i, %for.body4.i.preheader ]180 %arrayidx.sum1 = add i32 %add.i, %8181 %arrayidx.i = getelementptr inbounds i8, ptr %3, i32 %arrayidx.sum1182 %9 = load i8, ptr %arrayidx.i, align 1183 %conv.i = sext i8 %9 to i32184 store i32 %conv.i, ptr @c, align 4185 %inc.i = add nsw i32 %8, 1186 store i32 %inc.i, ptr @b, align 4187 %arrayidx.sum2 = add i32 %add.i, %inc.i188 %arrayidx.1.i = getelementptr inbounds i8, ptr %3, i32 %arrayidx.sum2189 %10 = load i8, ptr %arrayidx.1.i, align 1190 %conv.1.i = sext i8 %10 to i32191 store i32 %conv.1.i, ptr @c, align 4192 %inc.1.i = add nsw i32 %8, 2193 store i32 %inc.1.i, ptr @b, align 4194 %arrayidx.sum3 = add i32 %add.i, %inc.1.i195 %arrayidx.2.i = getelementptr inbounds i8, ptr %3, i32 %arrayidx.sum3196 %11 = load i8, ptr %arrayidx.2.i, align 1197 %conv.2.i = sext i8 %11 to i32198 store i32 %conv.2.i, ptr @c, align 4199 %inc.2.i = add nsw i32 %8, 3200 store i32 %inc.2.i, ptr @b, align 4201 %arrayidx.sum4 = add i32 %add.i, %inc.2.i202 %arrayidx.3.i = getelementptr inbounds i8, ptr %3, i32 %arrayidx.sum4203 %12 = load i8, ptr %arrayidx.3.i, align 1204 %conv.3.i = sext i8 %12 to i32205 store i32 %conv.3.i, ptr @c, align 4206 %inc.3.i = add nsw i32 %8, 4207 store i32 %inc.3.i, ptr @b, align 4208 %arrayidx.sum5 = add i32 %add.i, %inc.3.i209 %arrayidx.4.i = getelementptr inbounds i8, ptr %3, i32 %arrayidx.sum5210 %13 = load i8, ptr %arrayidx.4.i, align 1211 %conv.4.i = sext i8 %13 to i32212 store i32 %conv.4.i, ptr @c, align 4213 %inc.4.i = add nsw i32 %8, 5214 store i32 %inc.4.i, ptr @b, align 4215 %arrayidx.sum6 = add i32 %add.i, %inc.4.i216 %arrayidx.5.i = getelementptr inbounds i8, ptr %3, i32 %arrayidx.sum6217 %14 = load i8, ptr %arrayidx.5.i, align 1218 %conv.5.i = sext i8 %14 to i32219 store i32 %conv.5.i, ptr @c, align 4220 %inc.5.i = add nsw i32 %8, 6221 store i32 %inc.5.i, ptr @b, align 4222 %arrayidx.sum7 = add i32 %add.i, %inc.5.i223 %arrayidx.6.i = getelementptr inbounds i8, ptr %3, i32 %arrayidx.sum7224 %15 = load i8, ptr %arrayidx.6.i, align 1225 %conv.6.i = sext i8 %15 to i32226 store i32 %conv.6.i, ptr @c, align 4227 %inc.6.i = add nsw i32 %8, 7228 store i32 %inc.6.i, ptr @b, align 4229 %arrayidx.sum8 = add i32 %add.i, %inc.6.i230 %arrayidx.7.i = getelementptr inbounds i8, ptr %3, i32 %arrayidx.sum8231 %16 = load i8, ptr %arrayidx.7.i, align 1232 %conv.7.i = sext i8 %16 to i32233 store i32 %conv.7.i, ptr @c, align 4234 %inc.7.i = add nsw i32 %8, 8235 store i32 %inc.7.i, ptr @b, align 4236 %tobool3.7.i = icmp sgt i32 %inc.7.i, -8237 br i1 %tobool3.7.i, label %for.inc5.loopexit.ur-lcssa.i, label %for.body4.i238 239for.inc5.loopexit.ur-lcssa.i:240 %17 = add i32 %.pr.i, 8241 %18 = add i32 %17, %7242 %19 = icmp eq i32 %18, 0243 br i1 %19, label %for.inc5.i, label %for.body4.ur.i.preheader244 245for.body4.ur.i.preheader:246 %.ph = phi i32 [ %18, %for.inc5.loopexit.ur-lcssa.i ], [ %.pr.i, %for.body4.preheader.i ]247 br label %for.body4.ur.i248 249for.body4.ur.i:250 %20 = phi i32 [ %inc.ur.i, %for.body4.ur.i ], [ %.ph, %for.body4.ur.i.preheader ]251 %arrayidx.sum = add i32 %add.i, %20252 %arrayidx.ur.i = getelementptr inbounds i8, ptr %3, i32 %arrayidx.sum253 %21 = load i8, ptr %arrayidx.ur.i, align 1254 %conv.ur.i = sext i8 %21 to i32255 store i32 %conv.ur.i, ptr @c, align 4256 %inc.ur.i = add nsw i32 %20, 1257 store i32 %inc.ur.i, ptr @b, align 4258 %tobool3.ur.i = icmp eq i32 %inc.ur.i, 0259 br i1 %tobool3.ur.i, label %for.inc5.i.loopexit, label %for.body4.ur.i260 261for.inc5.i.loopexit:262 br label %for.inc5.i263 264for.inc5.i:265 %inc6.i = add nsw i32 %storemerge.i, 1266 br label %for.cond2thread-pre-split.i267}268