240 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \3; RUN: | FileCheck %s4;; Check that this code doesn't abort. Test case is reduced version of lnt Polybench benchmark test case dynprog.5 6target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"7target triple = "x86_64-unknown-linux-gnu"8 9@sum_c = common global [10 x [10 x [10 x i32]]] zeroinitializer10@c = common global [10 x [10 x i32]] zeroinitializer11@W = common global [10 x [10 x i32]] zeroinitializer12@out_l = common global i32 013 14; Function Attrs: nounwind uwtable15define void @dep_constraint_crash_test(i32 %M, i32 %N) {16; CHECK-LABEL: 'dep_constraint_crash_test'17; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: %out_l.promoted = load i32, ptr @out_l, align 418; CHECK-NEXT: da analyze - none!19; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: store i32 0, ptr %13, align 420; CHECK-NEXT: da analyze - none!21; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: %18 = load i32, ptr %17, align 422; CHECK-NEXT: da analyze - none!23; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: %20 = load i32, ptr %19, align 424; CHECK-NEXT: da analyze - none!25; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: %23 = load i32, ptr %22, align 426; CHECK-NEXT: da analyze - none!27; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: store i32 %24, ptr %25, align 428; CHECK-NEXT: da analyze - none!29; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: %27 = load i32, ptr %26, align 430; CHECK-NEXT: da analyze - none!31; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: %29 = load i32, ptr %28, align 432; CHECK-NEXT: da analyze - none!33; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: store i32 %30, ptr %31, align 434; CHECK-NEXT: da analyze - none!35; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: %32 = load i32, ptr %6, align 436; CHECK-NEXT: da analyze - none!37; CHECK-NEXT: Src: %out_l.promoted = load i32, ptr @out_l, align 4 --> Dst: store i32 %33, ptr @out_l, align 438; CHECK-NEXT: da analyze - consistent anti [|<]!39; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: store i32 0, ptr %13, align 440; CHECK-NEXT: da analyze - output [S * *]!41; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: %18 = load i32, ptr %17, align 442; CHECK-NEXT: da analyze - flow [S * *|<]!43; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: %20 = load i32, ptr %19, align 444; CHECK-NEXT: da analyze - none!45; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: %23 = load i32, ptr %22, align 446; CHECK-NEXT: da analyze - none!47; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: store i32 %24, ptr %25, align 448; CHECK-NEXT: da analyze - output [S * *|<]!49; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: %27 = load i32, ptr %26, align 450; CHECK-NEXT: da analyze - flow [S * *|<]!51; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: %29 = load i32, ptr %28, align 452; CHECK-NEXT: da analyze - none!53; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: store i32 %30, ptr %31, align 454; CHECK-NEXT: da analyze - none!55; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: %32 = load i32, ptr %6, align 456; CHECK-NEXT: da analyze - none!57; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: store i32 %33, ptr @out_l, align 458; CHECK-NEXT: da analyze - none!59; CHECK-NEXT: Src: %18 = load i32, ptr %17, align 4 --> Dst: %18 = load i32, ptr %17, align 460; CHECK-NEXT: da analyze - input [S * * *]!61; CHECK-NEXT: Src: %18 = load i32, ptr %17, align 4 --> Dst: %20 = load i32, ptr %19, align 462; CHECK-NEXT: da analyze - none!63; CHECK-NEXT: Src: %18 = load i32, ptr %17, align 4 --> Dst: %23 = load i32, ptr %22, align 464; CHECK-NEXT: da analyze - none!65; CHECK-NEXT: Src: %18 = load i32, ptr %17, align 4 --> Dst: store i32 %24, ptr %25, align 466; CHECK-NEXT: da analyze - anti [S * * *|<]!67; CHECK-NEXT: Src: %18 = load i32, ptr %17, align 4 --> Dst: %27 = load i32, ptr %26, align 468; CHECK-NEXT: da analyze - input [S * *|<]!69; CHECK-NEXT: Src: %18 = load i32, ptr %17, align 4 --> Dst: %29 = load i32, ptr %28, align 470; CHECK-NEXT: da analyze - none!71; CHECK-NEXT: Src: %18 = load i32, ptr %17, align 4 --> Dst: store i32 %30, ptr %31, align 472; CHECK-NEXT: da analyze - none!73; CHECK-NEXT: Src: %18 = load i32, ptr %17, align 4 --> Dst: %32 = load i32, ptr %6, align 474; CHECK-NEXT: da analyze - none!75; CHECK-NEXT: Src: %18 = load i32, ptr %17, align 4 --> Dst: store i32 %33, ptr @out_l, align 476; CHECK-NEXT: da analyze - none!77; CHECK-NEXT: Src: %20 = load i32, ptr %19, align 4 --> Dst: %20 = load i32, ptr %19, align 478; CHECK-NEXT: da analyze - input [S * S *]!79; CHECK-NEXT: Src: %20 = load i32, ptr %19, align 4 --> Dst: %23 = load i32, ptr %22, align 480; CHECK-NEXT: da analyze - input [S * * *|<]!81; CHECK-NEXT: Src: %20 = load i32, ptr %19, align 4 --> Dst: store i32 %24, ptr %25, align 482; CHECK-NEXT: da analyze - none!83; CHECK-NEXT: Src: %20 = load i32, ptr %19, align 4 --> Dst: %27 = load i32, ptr %26, align 484; CHECK-NEXT: da analyze - none!85; CHECK-NEXT: Src: %20 = load i32, ptr %19, align 4 --> Dst: %29 = load i32, ptr %28, align 486; CHECK-NEXT: da analyze - none!87; CHECK-NEXT: Src: %20 = load i32, ptr %19, align 4 --> Dst: store i32 %30, ptr %31, align 488; CHECK-NEXT: da analyze - anti [S * *|<]!89; CHECK-NEXT: Src: %20 = load i32, ptr %19, align 4 --> Dst: %32 = load i32, ptr %6, align 490; CHECK-NEXT: da analyze - input [S|<]!91; CHECK-NEXT: Src: %20 = load i32, ptr %19, align 4 --> Dst: store i32 %33, ptr @out_l, align 492; CHECK-NEXT: da analyze - none!93; CHECK-NEXT: Src: %23 = load i32, ptr %22, align 4 --> Dst: %23 = load i32, ptr %22, align 494; CHECK-NEXT: da analyze - input [S * * *]!95; CHECK-NEXT: Src: %23 = load i32, ptr %22, align 4 --> Dst: store i32 %24, ptr %25, align 496; CHECK-NEXT: da analyze - none!97; CHECK-NEXT: Src: %23 = load i32, ptr %22, align 4 --> Dst: %27 = load i32, ptr %26, align 498; CHECK-NEXT: da analyze - none!99; CHECK-NEXT: Src: %23 = load i32, ptr %22, align 4 --> Dst: %29 = load i32, ptr %28, align 4100; CHECK-NEXT: da analyze - none!101; CHECK-NEXT: Src: %23 = load i32, ptr %22, align 4 --> Dst: store i32 %30, ptr %31, align 4102; CHECK-NEXT: da analyze - anti [S * *|<]!103; CHECK-NEXT: Src: %23 = load i32, ptr %22, align 4 --> Dst: %32 = load i32, ptr %6, align 4104; CHECK-NEXT: da analyze - input [S|<]!105; CHECK-NEXT: Src: %23 = load i32, ptr %22, align 4 --> Dst: store i32 %33, ptr @out_l, align 4106; CHECK-NEXT: da analyze - none!107; CHECK-NEXT: Src: store i32 %24, ptr %25, align 4 --> Dst: store i32 %24, ptr %25, align 4108; CHECK-NEXT: da analyze - output [S * * *]!109; CHECK-NEXT: Src: store i32 %24, ptr %25, align 4 --> Dst: %27 = load i32, ptr %26, align 4110; CHECK-NEXT: da analyze - flow [S * *|<]!111; CHECK-NEXT: Src: store i32 %24, ptr %25, align 4 --> Dst: %29 = load i32, ptr %28, align 4112; CHECK-NEXT: da analyze - none!113; CHECK-NEXT: Src: store i32 %24, ptr %25, align 4 --> Dst: store i32 %30, ptr %31, align 4114; CHECK-NEXT: da analyze - none!115; CHECK-NEXT: Src: store i32 %24, ptr %25, align 4 --> Dst: %32 = load i32, ptr %6, align 4116; CHECK-NEXT: da analyze - none!117; CHECK-NEXT: Src: store i32 %24, ptr %25, align 4 --> Dst: store i32 %33, ptr @out_l, align 4118; CHECK-NEXT: da analyze - none!119; CHECK-NEXT: Src: %27 = load i32, ptr %26, align 4 --> Dst: %27 = load i32, ptr %26, align 4120; CHECK-NEXT: da analyze - input [S * *]!121; CHECK-NEXT: Src: %27 = load i32, ptr %26, align 4 --> Dst: %29 = load i32, ptr %28, align 4122; CHECK-NEXT: da analyze - none!123; CHECK-NEXT: Src: %27 = load i32, ptr %26, align 4 --> Dst: store i32 %30, ptr %31, align 4124; CHECK-NEXT: da analyze - none!125; CHECK-NEXT: Src: %27 = load i32, ptr %26, align 4 --> Dst: %32 = load i32, ptr %6, align 4126; CHECK-NEXT: da analyze - none!127; CHECK-NEXT: Src: %27 = load i32, ptr %26, align 4 --> Dst: store i32 %33, ptr @out_l, align 4128; CHECK-NEXT: da analyze - none!129; CHECK-NEXT: Src: %29 = load i32, ptr %28, align 4 --> Dst: %29 = load i32, ptr %28, align 4130; CHECK-NEXT: da analyze - input [S * *]!131; CHECK-NEXT: Src: %29 = load i32, ptr %28, align 4 --> Dst: store i32 %30, ptr %31, align 4132; CHECK-NEXT: da analyze - none!133; CHECK-NEXT: Src: %29 = load i32, ptr %28, align 4 --> Dst: %32 = load i32, ptr %6, align 4134; CHECK-NEXT: da analyze - none!135; CHECK-NEXT: Src: %29 = load i32, ptr %28, align 4 --> Dst: store i32 %33, ptr @out_l, align 4136; CHECK-NEXT: da analyze - none!137; CHECK-NEXT: Src: store i32 %30, ptr %31, align 4 --> Dst: store i32 %30, ptr %31, align 4138; CHECK-NEXT: da analyze - output [S * *]!139; CHECK-NEXT: Src: store i32 %30, ptr %31, align 4 --> Dst: %32 = load i32, ptr %6, align 4140; CHECK-NEXT: da analyze - flow [S|<]!141; CHECK-NEXT: Src: store i32 %30, ptr %31, align 4 --> Dst: store i32 %33, ptr @out_l, align 4142; CHECK-NEXT: da analyze - none!143; CHECK-NEXT: Src: %32 = load i32, ptr %6, align 4 --> Dst: %32 = load i32, ptr %6, align 4144; CHECK-NEXT: da analyze - consistent input [S]!145; CHECK-NEXT: Src: %32 = load i32, ptr %6, align 4 --> Dst: store i32 %33, ptr @out_l, align 4146; CHECK-NEXT: da analyze - none!147; CHECK-NEXT: Src: store i32 %33, ptr @out_l, align 4 --> Dst: store i32 %33, ptr @out_l, align 4148; CHECK-NEXT: da analyze - none!149;150 %1 = icmp sgt i32 %N, 0151 br i1 %1, label %.preheader.lr.ph, label %35152 153.preheader.lr.ph: ; preds = %0154 %2 = add nsw i32 %M, -2155 %3 = icmp slt i32 %M, 2156 %4 = add nsw i32 %M, -1157 %5 = sext i32 %4 to i64158 %6 = getelementptr inbounds [10 x [10 x i32]], ptr @c, i64 0, i64 0, i64 %5159 %7 = add nsw i32 %M, -1160 %out_l.promoted = load i32, ptr @out_l161 %8 = sext i32 %7 to i64162 %9 = sext i32 %2 to i64163 br label %.preheader164 165.preheader: ; preds = %._crit_edge7, %.preheader.lr.ph166 %10 = phi i32 [ %out_l.promoted, %.preheader.lr.ph ], [ %33, %._crit_edge7 ]167 %iter.08 = phi i32 [ 0, %.preheader.lr.ph ], [ %34, %._crit_edge7 ]168 br i1 %3, label %._crit_edge7, label %.lr.ph6169 170.loopexit: ; preds = %._crit_edge, %.lr.ph6171 %11 = icmp slt i64 %indvars.iv23, %9172 %indvars.iv.next18 = add nuw nsw i64 %indvars.iv17, 1173 %indvars.iv.next14 = add nuw i32 %indvars.iv13, 1174 br i1 %11, label %.lr.ph6, label %._crit_edge7175 176.lr.ph6: ; preds = %.preheader, %.loopexit177 %indvars.iv23 = phi i64 [ %indvars.iv.next24, %.loopexit ], [ 0, %.preheader ]178 %indvars.iv17 = phi i64 [ %indvars.iv.next18, %.loopexit ], [ 1, %.preheader ]179 %indvars.iv13 = phi i32 [ %indvars.iv.next14, %.loopexit ], [ 1, %.preheader ]180 %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1181 %12 = icmp slt i64 %indvars.iv23, %8182 br i1 %12, label %.lr.ph4, label %.loopexit183 184.lr.ph4: ; preds = %.lr.ph6, %._crit_edge185 %indvars.iv19 = phi i64 [ %indvars.iv.next20, %._crit_edge ], [ %indvars.iv17, %.lr.ph6 ]186 %indvars.iv15 = phi i32 [ %indvars.iv.next16, %._crit_edge ], [ %indvars.iv13, %.lr.ph6 ]187 %13 = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr @sum_c, i64 0, i64 %indvars.iv23, i64 %indvars.iv19, i64 %indvars.iv23188 store i32 0, ptr %13189 %14 = add nsw i64 %indvars.iv19, -1190 %15 = icmp slt i64 %indvars.iv23, %14191 br i1 %15, label %.lr.ph, label %._crit_edge192 193.lr.ph: ; preds = %.lr.ph4, %.lr.ph194 %indvars.iv11 = phi i64 [ %indvars.iv.next12, %.lr.ph ], [ %indvars.iv17, %.lr.ph4 ]195 %16 = add nsw i64 %indvars.iv11, -1196 %17 = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr @sum_c, i64 0, i64 %indvars.iv23, i64 %indvars.iv19, i64 %16197 %18 = load i32, ptr %17198 %19 = getelementptr inbounds [10 x [10 x i32]], ptr @c, i64 0, i64 %indvars.iv23, i64 %indvars.iv11199 %20 = load i32, ptr %19200 %21 = add nsw i32 %20, %18201 %22 = getelementptr inbounds [10 x [10 x i32]], ptr @c, i64 0, i64 %indvars.iv11, i64 %indvars.iv19202 %23 = load i32, ptr %22203 %24 = add nsw i32 %21, %23204 %25 = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr @sum_c, i64 0, i64 %indvars.iv23, i64 %indvars.iv19, i64 %indvars.iv11205 store i32 %24, ptr %25206 %indvars.iv.next12 = add nuw nsw i64 %indvars.iv11, 1207 %lftr.wideiv = trunc i64 %indvars.iv.next12 to i32208 %exitcond = icmp eq i32 %lftr.wideiv, %indvars.iv15209 br i1 %exitcond, label %._crit_edge, label %.lr.ph210 211._crit_edge: ; preds = %.lr.ph, %.lr.ph4212 %26 = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr @sum_c, i64 0, i64 %indvars.iv23, i64 %indvars.iv19, i64 %14213 %27 = load i32, ptr %26214 %28 = getelementptr inbounds [10 x [10 x i32]], ptr @W, i64 0, i64 %indvars.iv23, i64 %indvars.iv19215 %29 = load i32, ptr %28216 %30 = add nsw i32 %29, %27217 %31 = getelementptr inbounds [10 x [10 x i32]], ptr @c, i64 0, i64 %indvars.iv23, i64 %indvars.iv19218 store i32 %30, ptr %31219 %indvars.iv.next16 = add nuw i32 %indvars.iv15, 1220 %indvars.iv.next20 = add nuw nsw i64 %indvars.iv19, 1221 %lftr.wideiv21 = trunc i64 %indvars.iv.next20 to i32222 %exitcond22 = icmp eq i32 %lftr.wideiv21, %M223 br i1 %exitcond22, label %.loopexit, label %.lr.ph4224 225._crit_edge7: ; preds = %.loopexit, %.preheader226 %32 = load i32, ptr %6227 %33 = add nsw i32 %10, %32228 %34 = add nuw nsw i32 %iter.08, 1229 %exitcond25 = icmp eq i32 %34, %N230 br i1 %exitcond25, label %._crit_edge9, label %.preheader231 232._crit_edge9: ; preds = %._crit_edge7233 store i32 %33, ptr @out_l234 br label %35235 236; <label>:35 ; preds = %._crit_edge9, %0237 ret void238}239 240