; RUN: opt %loadPolly  %defaultOpts -polly-analyze-ir  -print-top-scop-only -analyze %s | FileCheck %s
; XFAIL: *
; ModuleID = './linear-algebra/solvers/ludcmp/ludcmp_with_param.ll'
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-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"

%struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i64, i32, [20 x i8] }
%struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 }

@x = common global [1025 x double] zeroinitializer, align 32
@b = common global [1025 x double] zeroinitializer, align 32
@a = common global [1025 x [1025 x double]] zeroinitializer, align 32
@stderr = external global %struct._IO_FILE*
@.str = private constant [8 x i8] c"%0.2lf \00", align 1
@w = common global double 0.000000e+00
@y = common global [1025 x double] zeroinitializer, align 32

define void @scop_func(i64 %n) nounwind {
entry:
  store double 1.000000e+00, double* getelementptr inbounds ([1025 x double]* @b, i64 0, i64 0), align 32
  %0 = icmp sgt i64 %n, 0
  br i1 %0, label %bb.nph81, label %bb14

bb.nph43:                                         ; preds = %bb5.preheader
  %1 = icmp sgt i64 %storemerge60, 0
  br i1 %1, label %bb.nph43.split.us, label %bb4.preheader

bb4.preheader:                                    ; preds = %bb.nph43
  br label %bb4

bb.nph43.split.us:                                ; preds = %bb.nph43
  br label %bb.nph35.us

bb4.us:                                           ; preds = %bb2.us
  %.lcssa63 = phi double [ %9, %bb2.us ]
  %2 = load double* %scevgep110, align 8
  %3 = fdiv double %.lcssa63, %2
  store double %3, double* %scevgep148, align 8
  %4 = icmp sgt i64 %storemerge5.us, %n
  br i1 %4, label %bb11.loopexit.loopexit1, label %bb.nph35.us

bb2.us:                                           ; preds = %bb.nph35.us, %bb2.us
  %5 = phi double [ %11, %bb.nph35.us ], [ %9, %bb2.us ]
  %storemerge834.us = phi i64 [ 0, %bb.nph35.us ], [ %10, %bb2.us ]
  %scevgep141 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 %tmp96, i64 %storemerge834.us
  %scevgep136 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 %storemerge834.us, i64 %storemerge60
  %6 = load double* %scevgep141, align 8
  %7 = load double* %scevgep136, align 8
  %8 = fmul double %6, %7
  %9 = fsub double %5, %8
  %10 = add nsw i64 %storemerge834.us, 1
  %exitcond64 = icmp eq i64 %10, %storemerge60
  br i1 %exitcond64, label %bb4.us, label %bb2.us

bb.nph35.us:                                      ; preds = %bb4.us, %bb.nph43.split.us
  %indvar137 = phi i64 [ %tmp146, %bb4.us ], [ 0, %bb.nph43.split.us ]
  %storemerge5.us = add i64 %tmp, %indvar137
  %tmp93 = add i64 %indvar137, 1
  %scevgep148 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 %tmp93, i64 %tmp87
  %tmp96 = add i64 %storemerge538, %indvar137
  %tmp146 = add i64 %indvar137, 1
  %11 = load double* %scevgep148, align 8
  br label %bb2.us

bb4:                                              ; preds = %bb4.preheader, %bb4
  %indvar152 = phi i64 [ %indvar.next153, %bb4 ], [ 0, %bb4.preheader ]
  %tmp99 = add i64 %indvar152, 1
  %scevgep157 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 %tmp99, i64 %tmp87
  %storemerge5 = add i64 %tmp, %indvar152
  %12 = load double* %scevgep157, align 8
  %13 = load double* %scevgep110, align 8
  %14 = fdiv double %12, %13
  store double %14, double* %scevgep157, align 8
  %15 = icmp sgt i64 %storemerge5, %n
  %indvar.next153 = add i64 %indvar152, 1
  br i1 %15, label %bb11.loopexit.loopexit, label %bb4

bb.nph56:                                         ; preds = %bb11.loopexit
  br i1 false, label %bb10.us.preheader, label %bb.nph47.preheader

bb10.us.preheader:                                ; preds = %bb.nph56
  br label %bb10.us

bb.nph47.preheader:                               ; preds = %bb.nph56
  br label %bb.nph47

bb10.us:                                          ; preds = %bb10.us.preheader, %bb10.us
  %indvar122 = phi i64 [ %indvar.next123, %bb10.us ], [ 0, %bb10.us.preheader ]
  %storemerge6.us = add i64 %tmp, %indvar122
  %tmp89 = add i64 %tmp88, %indvar122
  %scevgep128 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 1, i64 %tmp89
  %16 = load double* %scevgep128, align 8
  store double %16, double* %scevgep128, align 8
  %17 = icmp sgt i64 %storemerge6.us, %n
  %indvar.next123 = add i64 %indvar122, 1
  br i1 %17, label %bb13.loopexit.loopexit2, label %bb10.us

bb.nph47:                                         ; preds = %bb.nph47.preheader, %bb10
  %indvar162 = phi i64 [ %indvar.next163, %bb10 ], [ 0, %bb.nph47.preheader ]
  %storemerge6 = add i64 %tmp, %indvar162
  %tmp104 = add i64 %tmp88, %indvar162
  %scevgep180 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 1, i64 %tmp104
  %tmp107 = add i64 %storemerge538, %indvar162
  %18 = load double* %scevgep180, align 8
  br label %bb8

bb8:                                              ; preds = %bb8, %bb.nph47
  %w.tmp.048 = phi double [ %18, %bb.nph47 ], [ %22, %bb8 ]
  %storemerge746 = phi i64 [ 0, %bb.nph47 ], [ %23, %bb8 ]
  %scevgep166 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 %storemerge746, i64 %tmp107
  %scevgep167 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 %storemerge538, i64 %storemerge746
  %19 = load double* %scevgep167, align 8
  %20 = load double* %scevgep166, align 8
  %21 = fmul double %19, %20
  %22 = fsub double %w.tmp.048, %21
  %23 = add nsw i64 %storemerge746, 1
  %exitcond = icmp eq i64 %23, %smax
  br i1 %exitcond, label %bb10, label %bb8

bb10:                                             ; preds = %bb8
  %.lcssa40 = phi double [ %22, %bb8 ]
  store double %.lcssa40, double* %scevgep180, align 8
  %24 = icmp sgt i64 %storemerge6, %n
  %indvar.next163 = add i64 %indvar162, 1
  br i1 %24, label %bb13.loopexit.loopexit, label %bb.nph47

bb11.loopexit.loopexit:                           ; preds = %bb4
  %.lcssa57 = phi double [ %12, %bb4 ]
  br label %bb11.loopexit

bb11.loopexit.loopexit1:                          ; preds = %bb4.us
  %.lcssa63.lcssa = phi double [ %.lcssa63, %bb4.us ]
  br label %bb11.loopexit

bb11.loopexit:                                    ; preds = %bb11.loopexit.loopexit1, %bb11.loopexit.loopexit, %bb5.preheader
  %w.tmp.082 = phi double [ %w.tmp.1, %bb5.preheader ], [ %.lcssa57, %bb11.loopexit.loopexit ], [ %.lcssa63.lcssa, %bb11.loopexit.loopexit1 ]
  %25 = icmp sgt i64 %storemerge538, %n
  br i1 %25, label %bb13.loopexit, label %bb.nph56

bb13.loopexit.loopexit:                           ; preds = %bb10
  %.lcssa40.lcssa = phi double [ %.lcssa40, %bb10 ]
  br label %bb13.loopexit

bb13.loopexit.loopexit2:                          ; preds = %bb10.us
  %.lcssa77 = phi double [ %16, %bb10.us ]
  br label %bb13.loopexit

bb13.loopexit:                                    ; preds = %bb13.loopexit.loopexit2, %bb13.loopexit.loopexit, %bb11.loopexit
  %w.tmp.2 = phi double [ %w.tmp.082, %bb11.loopexit ], [ %.lcssa40.lcssa, %bb13.loopexit.loopexit ], [ %.lcssa77, %bb13.loopexit.loopexit2 ]
  %indvar.next42 = add i64 %storemerge60, 1
  %exitcond84 = icmp ne i64 %indvar.next42, %n
  br i1 %exitcond84, label %bb5.preheader, label %bb13.bb14_crit_edge

bb13.bb14_crit_edge:                              ; preds = %bb13.loopexit
  %w.tmp.2.lcssa = phi double [ %w.tmp.2, %bb13.loopexit ]
  store double %w.tmp.2.lcssa, double* @w
  br label %bb14

bb.nph81:                                         ; preds = %entry
  %w.promoted = load double* @w
  br label %bb5.preheader

bb5.preheader:                                    ; preds = %bb.nph81, %bb13.loopexit
  %storemerge60 = phi i64 [ 0, %bb.nph81 ], [ %indvar.next42, %bb13.loopexit ]
  %w.tmp.1 = phi double [ %w.promoted, %bb.nph81 ], [ %w.tmp.2, %bb13.loopexit ]
  %tmp = add i64 %storemerge60, 2
  %tmp87 = mul i64 %storemerge60, 1026
  %tmp88 = add i64 %tmp87, 1
  %storemerge538 = add i64 %storemerge60, 1
  %scevgep110 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 0, i64 %tmp87
  %tmp44 = icmp sgt i64 %storemerge538, 1
  %smax = select i1 %tmp44, i64 %storemerge538, i64 1
  %26 = icmp sgt i64 %storemerge538, %n
  br i1 %26, label %bb11.loopexit, label %bb.nph43

bb14:                                             ; preds = %bb13.bb14_crit_edge, %entry
  store double 1.000000e+00, double* getelementptr inbounds ([1025 x double]* @y, i64 0, i64 0), align 32
  %27 = icmp slt i64 %n, 1
  br i1 %27, label %bb20, label %bb15.preheader

bb15.preheader:                                   ; preds = %bb14
  br label %bb15

bb15:                                             ; preds = %bb15.preheader, %bb18
  %indvar111 = phi i64 [ %28, %bb18 ], [ 0, %bb15.preheader ]
  %storemerge126 = add i64 %indvar111, 1
  %tmp117 = add i64 %indvar111, 2
  %scevgep119 = getelementptr [1025 x double]* @b, i64 0, i64 %storemerge126
  %scevgep118 = getelementptr [1025 x double]* @y, i64 0, i64 %storemerge126
  %28 = add i64 %indvar111, 1
  %29 = load double* %scevgep119, align 8
  %30 = icmp sgt i64 %storemerge126, 0
  br i1 %30, label %bb16.preheader, label %bb18

bb16.preheader:                                   ; preds = %bb15
  br label %bb16

bb16:                                             ; preds = %bb16.preheader, %bb16
  %31 = phi double [ %35, %bb16 ], [ %29, %bb16.preheader ]
  %storemerge423 = phi i64 [ %36, %bb16 ], [ 0, %bb16.preheader ]
  %scevgep114 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 %storemerge126, i64 %storemerge423
  %scevgep113 = getelementptr [1025 x double]* @y, i64 0, i64 %storemerge423
  %32 = load double* %scevgep114, align 8
  %33 = load double* %scevgep113, align 8
  %34 = fmul double %32, %33
  %35 = fsub double %31, %34
  %36 = add nsw i64 %storemerge423, 1
  %exitcond4 = icmp eq i64 %36, %storemerge126
  br i1 %exitcond4, label %bb18.loopexit, label %bb16

bb18.loopexit:                                    ; preds = %bb16
  %.lcssa = phi double [ %35, %bb16 ]
  br label %bb18

bb18:                                             ; preds = %bb18.loopexit, %bb15
  %w.tmp.032 = phi double [ %29, %bb15 ], [ %.lcssa, %bb18.loopexit ]
  store double %w.tmp.032, double* %scevgep118, align 8
  %37 = icmp sgt i64 %tmp117, %n
  br i1 %37, label %bb19.bb20_crit_edge, label %bb15

bb19.bb20_crit_edge:                              ; preds = %bb18
  %w.tmp.032.lcssa = phi double [ %w.tmp.032, %bb18 ]
  store double %w.tmp.032.lcssa, double* @w
  br label %bb20

bb20:                                             ; preds = %bb19.bb20_crit_edge, %bb14
  %38 = getelementptr inbounds [1025 x double]* @y, i64 0, i64 %n
  %39 = load double* %38, align 8
  %40 = getelementptr inbounds [1025 x [1025 x double]]* @a, i64 0, i64 %n, i64 %n
  %41 = load double* %40, align 8
  %42 = fdiv double %39, %41
  %43 = getelementptr inbounds [1025 x double]* @x, i64 0, i64 %n
  store double %42, double* %43, align 8
  %44 = add nsw i64 %n, -1
  %45 = icmp slt i64 %44, 0
  br i1 %45, label %return, label %bb.nph19

bb.nph19:                                         ; preds = %bb20
  %tmp86 = mul i64 %n, 1026
  %tmp90 = add i64 %n, 1
  %tmp94 = add i64 %tmp86, -1
  %tmp34 = add i64 %n, -1
  br label %bb21

bb21:                                             ; preds = %bb24, %bb.nph19
  %storemerge211 = phi i64 [ 0, %bb.nph19 ], [ %46, %bb24 ]
  %tmp23 = mul i64 %storemerge211, -1026
  %tmp24 = add i64 %tmp86, %tmp23
  %tmp27 = mul i64 %storemerge211, -1
  %tmp106 = add i64 %n, %tmp27
  %tmp31 = add i64 %tmp90, %tmp27
  %tmp109 = add i64 %storemerge211, 1
  %tmp35 = add i64 %tmp34, %tmp27
  %scevgep100 = getelementptr [1025 x double]* @y, i64 0, i64 %tmp35
  %scevgep99 = getelementptr [1025 x double]* @x, i64 0, i64 %tmp35
  %tmp38 = add i64 %tmp94, %tmp23
  %scevgep96 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 -1, i64 %tmp38
  %46 = add i64 %storemerge211, 1
  %47 = load double* %scevgep100, align 8
  %48 = icmp sgt i64 %tmp106, %n
  br i1 %48, label %bb24, label %bb22.preheader

bb22.preheader:                                   ; preds = %bb21
  br label %bb22

bb22:                                             ; preds = %bb22.preheader, %bb22
  %indvar = phi i64 [ %indvar.next, %bb22 ], [ 0, %bb22.preheader ]
  %w.tmp.0 = phi double [ %52, %bb22 ], [ %47, %bb22.preheader ]
  %tmp25 = add i64 %tmp24, %indvar
  %scevgep89 = getelementptr [1025 x [1025 x double]]* @a, i64 0, i64 -1, i64 %tmp25
  %tmp29 = add i64 %tmp106, %indvar
  %scevgep = getelementptr [1025 x double]* @x, i64 0, i64 %tmp29
  %tmp92 = add i64 %tmp31, %indvar
  %49 = load double* %scevgep89, align 8
  %50 = load double* %scevgep, align 8
  %51 = fmul double %49, %50
  %52 = fsub double %w.tmp.0, %51
  %53 = icmp sgt i64 %tmp92, %n
  %indvar.next = add i64 %indvar, 1
  br i1 %53, label %bb24.loopexit, label %bb22

bb24.loopexit:                                    ; preds = %bb22
  %.lcssa12 = phi double [ %52, %bb22 ]
  br label %bb24

bb24:                                             ; preds = %bb24.loopexit, %bb21
  %w.tmp.021 = phi double [ %47, %bb21 ], [ %.lcssa12, %bb24.loopexit ]
  %54 = load double* %scevgep96, align 8
  %55 = fdiv double %w.tmp.021, %54
  store double %55, double* %scevgep99, align 8
  %56 = icmp slt i64 %44, %tmp109
  br i1 %56, label %bb25.return_crit_edge, label %bb21

bb25.return_crit_edge:                            ; preds = %bb24
  %w.tmp.021.lcssa = phi double [ %w.tmp.021, %bb24 ]
  store double %w.tmp.021.lcssa, double* @w
  ret void

return:                                           ; preds = %bb20
  ret void
}
