; RUN: opt %loadPolly  %defaultOpts -polly-analyze-ir  -print-top-scop-only -analyze %s | FileCheck %s
; XFAIL: *
; ModuleID = './stencils/adi/adi_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 [1024 x [1024 x double]] zeroinitializer, align 32
@A = common global [1024 x [1024 x double]] zeroinitializer, align 32
@B = common global [1024 x [1024 x double]] zeroinitializer, align 32
@stderr = external global %struct._IO_FILE*
@.str = private constant [8 x i8] c"%0.2lf \00", align 1

define void @scop_func(i64 %n) nounwind {
bb.nph81:
  %0 = icmp sgt i64 %n, 0
  %1 = icmp sgt i64 %n, 1
  %2 = add nsw i64 %n, -2
  %3 = icmp sgt i64 %2, 0
  %4 = add nsw i64 %n, -3
  %tmp = add i64 %n, -1
  br label %bb5.preheader

bb.nph:                                           ; preds = %bb.nph.preheader, %bb4
  %storemerge112 = phi i64 [ %16, %bb4 ], [ 0, %bb.nph.preheader ]
  %scevgep86.phi.trans.insert = getelementptr [1024 x [1024 x double]]* @B, i64 0, i64 %storemerge112, i64 0
  %scevgep85.phi.trans.insert = getelementptr [1024 x [1024 x double]]* @X, i64 0, i64 %storemerge112, i64 0
  %.pre = load double* %scevgep85.phi.trans.insert, align 32
  %.pre149 = load double* %scevgep86.phi.trans.insert, align 32
  br label %bb2

bb2:                                              ; preds = %bb2, %bb.nph
  %5 = phi double [ %.pre149, %bb.nph ], [ %15, %bb2 ]
  %6 = phi double [ %.pre, %bb.nph ], [ %11, %bb2 ]
  %indvar = phi i64 [ 0, %bb.nph ], [ %tmp90, %bb2 ]
  %tmp42 = add i64 %indvar, 1
  %scevgep84 = getelementptr [1024 x [1024 x double]]* @B, i64 0, i64 %storemerge112, i64 %tmp42
  %scevgep83 = getelementptr [1024 x [1024 x double]]* @A, i64 0, i64 %storemerge112, i64 %tmp42
  %scevgep = getelementptr [1024 x [1024 x double]]* @X, i64 0, i64 %storemerge112, i64 %tmp42
  %tmp90 = add i64 %indvar, 1
  %7 = load double* %scevgep, align 8
  %8 = load double* %scevgep83, align 8
  %9 = fmul double %6, %8
  %10 = fdiv double %9, %5
  %11 = fsub double %7, %10
  store double %11, double* %scevgep, align 8
  %12 = load double* %scevgep84, align 8
  %13 = fmul double %8, %8
  %14 = fdiv double %13, %5
  %15 = fsub double %12, %14
  store double %15, double* %scevgep84, align 8
  %exitcond37 = icmp eq i64 %tmp90, %tmp
  br i1 %exitcond37, label %bb4, label %bb2

bb4:                                              ; preds = %bb2
  %16 = add nsw i64 %storemerge112, 1
  %exitcond = icmp eq i64 %16, %n
  br i1 %exitcond, label %bb8.loopexit.loopexit, label %bb.nph

bb.nph16:                                         ; preds = %bb5.preheader
  br i1 %1, label %bb.nph.preheader, label %bb8.loopexit

bb.nph.preheader:                                 ; preds = %bb.nph16
  br label %bb.nph

bb7:                                              ; preds = %bb7.preheader, %bb7
  %storemerge217 = phi i64 [ %20, %bb7 ], [ 0, %bb7.preheader ]
  %scevgep96 = getelementptr [1024 x [1024 x double]]* @B, i64 0, i64 %storemerge217, i64 %tmp
  %scevgep95 = getelementptr [1024 x [1024 x double]]* @X, i64 0, i64 %storemerge217, i64 %tmp
  %17 = load double* %scevgep95, align 8
  %18 = load double* %scevgep96, align 8
  %19 = fdiv double %17, %18
  store double %19, double* %scevgep95, align 8
  %20 = add nsw i64 %storemerge217, 1
  %exitcond18 = icmp eq i64 %20, %n
  br i1 %exitcond18, label %bb14.loopexit, label %bb7

bb8.loopexit.loopexit:                            ; preds = %bb4
  br label %bb8.loopexit

bb8.loopexit:                                     ; preds = %bb8.loopexit.loopexit, %bb.nph16
  br i1 %0, label %bb7.preheader, label %bb20.loopexit

bb7.preheader:                                    ; preds = %bb8.loopexit
  br label %bb7

bb11:                                             ; preds = %bb12.preheader, %bb11
  %storemerge920 = phi i64 [ %28, %bb11 ], [ 0, %bb12.preheader ]
  %tmp30 = mul i64 %storemerge920, -1
  %tmp31 = add i64 %4, %tmp30
  %scevgep104 = getelementptr [1024 x [1024 x double]]* @B, i64 0, i64 %storemerge323, i64 %tmp31
  %scevgep103 = getelementptr [1024 x [1024 x double]]* @A, i64 0, i64 %storemerge323, i64 %tmp31
  %scevgep102 = getelementptr [1024 x [1024 x double]]* @X, i64 0, i64 %storemerge323, i64 %tmp31
  %tmp35 = add i64 %2, %tmp30
  %scevgep100 = getelementptr [1024 x [1024 x double]]* @X, i64 0, i64 %storemerge323, i64 %tmp35
  %21 = load double* %scevgep100, align 8
  %22 = load double* %scevgep102, align 8
  %23 = load double* %scevgep103, align 8
  %24 = fmul double %22, %23
  %25 = fsub double %21, %24
  %26 = load double* %scevgep104, align 8
  %27 = fdiv double %25, %26
  store double %27, double* %scevgep100, align 8
  %28 = add nsw i64 %storemerge920, 1
  %exitcond21 = icmp eq i64 %28, %2
  br i1 %exitcond21, label %bb13, label %bb11

bb13:                                             ; preds = %bb11
  %29 = add nsw i64 %storemerge323, 1
  %exitcond29 = icmp eq i64 %29, %n
  br i1 %exitcond29, label %bb20.loopexit.loopexit, label %bb12.preheader

bb14.loopexit:                                    ; preds = %bb7
  %.not = xor i1 %0, true
  %.not150 = xor i1 %3, true
  %brmerge = or i1 %.not, %.not150
  br i1 %brmerge, label %bb20.loopexit, label %bb12.preheader.preheader

bb12.preheader.preheader:                         ; preds = %bb14.loopexit
  br label %bb12.preheader

bb12.preheader:                                   ; preds = %bb12.preheader.preheader, %bb13
  %storemerge323 = phi i64 [ %29, %bb13 ], [ 0, %bb12.preheader.preheader ]
  br label %bb11

bb17:                                             ; preds = %bb18.preheader, %bb17
  %storemerge828 = phi i64 [ %41, %bb17 ], [ 0, %bb18.preheader ]
  %scevgep119 = getelementptr [1024 x [1024 x double]]* @B, i64 0, i64 %indvar114, i64 %storemerge828
  %scevgep118 = getelementptr [1024 x [1024 x double]]* @X, i64 0, i64 %indvar114, i64 %storemerge828
  %scevgep121 = getelementptr [1024 x [1024 x double]]* @B, i64 0, i64 %tmp11, i64 %storemerge828
  %scevgep120 = getelementptr [1024 x [1024 x double]]* @A, i64 0, i64 %tmp11, i64 %storemerge828
  %scevgep117 = getelementptr [1024 x [1024 x double]]* @X, i64 0, i64 %tmp11, i64 %storemerge828
  %30 = load double* %scevgep117, align 8
  %31 = load double* %scevgep118, align 8
  %32 = load double* %scevgep120, align 8
  %33 = fmul double %31, %32
  %34 = load double* %scevgep119, align 8
  %35 = fdiv double %33, %34
  %36 = fsub double %30, %35
  store double %36, double* %scevgep117, align 8
  %37 = load double* %scevgep121, align 8
  %38 = fmul double %32, %32
  %39 = fdiv double %38, %34
  %40 = fsub double %37, %39
  store double %40, double* %scevgep121, align 8
  %41 = add nsw i64 %storemerge828, 1
  %exitcond1 = icmp eq i64 %41, %n
  br i1 %exitcond1, label %bb19, label %bb17

bb19:                                             ; preds = %bb17
  %tmp125 = add i64 %indvar114, 1
  %exitcond8 = icmp eq i64 %tmp125, %tmp
  br i1 %exitcond8, label %bb23.loopexit.loopexit, label %bb18.preheader

bb20.loopexit.loopexit:                           ; preds = %bb13
  br label %bb20.loopexit

bb20.loopexit:                                    ; preds = %bb20.loopexit.loopexit, %bb5.preheader, %bb14.loopexit, %bb8.loopexit
  br i1 %1, label %bb.nph34, label %bb23.loopexit

bb.nph34:                                         ; preds = %bb20.loopexit
  br i1 %0, label %bb18.preheader.preheader, label %bb29.loopexit

bb18.preheader.preheader:                         ; preds = %bb.nph34
  br label %bb18.preheader

bb18.preheader:                                   ; preds = %bb18.preheader.preheader, %bb19
  %indvar114 = phi i64 [ %tmp125, %bb19 ], [ 0, %bb18.preheader.preheader ]
  %tmp11 = add i64 %indvar114, 1
  br label %bb17

bb22:                                             ; preds = %bb22.preheader, %bb22
  %storemerge535 = phi i64 [ %45, %bb22 ], [ 0, %bb22.preheader ]
  %scevgep131 = getelementptr [1024 x [1024 x double]]* @B, i64 0, i64 %tmp, i64 %storemerge535
  %scevgep130 = getelementptr [1024 x [1024 x double]]* @X, i64 0, i64 %tmp, i64 %storemerge535
  %42 = load double* %scevgep130, align 8
  %43 = load double* %scevgep131, align 8
  %44 = fdiv double %42, %43
  store double %44, double* %scevgep130, align 8
  %45 = add nsw i64 %storemerge535, 1
  %exitcond15 = icmp eq i64 %45, %n
  br i1 %exitcond15, label %bb29.loopexit.loopexit, label %bb22

bb23.loopexit.loopexit:                           ; preds = %bb19
  br label %bb23.loopexit

bb23.loopexit:                                    ; preds = %bb23.loopexit.loopexit, %bb20.loopexit
  br i1 %0, label %bb22.preheader, label %bb29.loopexit

bb22.preheader:                                   ; preds = %bb23.loopexit
  br label %bb22

bb26:                                             ; preds = %bb27.preheader, %bb26
  %storemerge737 = phi i64 [ %53, %bb26 ], [ 0, %bb27.preheader ]
  %scevgep138 = getelementptr [1024 x [1024 x double]]* @A, i64 0, i64 %tmp58, i64 %storemerge737
  %scevgep137 = getelementptr [1024 x [1024 x double]]* @X, i64 0, i64 %tmp58, i64 %storemerge737
  %scevgep139 = getelementptr [1024 x [1024 x double]]* @B, i64 0, i64 %tmp61, i64 %storemerge737
  %scevgep135 = getelementptr [1024 x [1024 x double]]* @X, i64 0, i64 %tmp61, i64 %storemerge737
  %46 = load double* %scevgep135, align 8
  %47 = load double* %scevgep137, align 8
  %48 = load double* %scevgep138, align 8
  %49 = fmul double %47, %48
  %50 = fsub double %46, %49
  %51 = load double* %scevgep139, align 8
  %52 = fdiv double %50, %51
  store double %52, double* %scevgep135, align 8
  %53 = add nsw i64 %storemerge737, 1
  %exitcond48 = icmp eq i64 %53, %n
  br i1 %exitcond48, label %bb28, label %bb26

bb28:                                             ; preds = %bb26
  %54 = add nsw i64 %storemerge640, 1
  %exitcond56 = icmp eq i64 %54, %2
  br i1 %exitcond56, label %bb30.loopexit, label %bb27.preheader

bb29.loopexit.loopexit:                           ; preds = %bb22
  br label %bb29.loopexit

bb29.loopexit:                                    ; preds = %bb29.loopexit.loopexit, %bb23.loopexit, %bb.nph34
  %.not151 = xor i1 %3, true
  %.not152 = xor i1 %0, true
  %brmerge153 = or i1 %.not151, %.not152
  br i1 %brmerge153, label %bb30, label %bb27.preheader.preheader

bb27.preheader.preheader:                         ; preds = %bb29.loopexit
  br label %bb27.preheader

bb27.preheader:                                   ; preds = %bb27.preheader.preheader, %bb28
  %storemerge640 = phi i64 [ %54, %bb28 ], [ 0, %bb27.preheader.preheader ]
  %tmp57 = mul i64 %storemerge640, -1
  %tmp58 = add i64 %4, %tmp57
  %tmp61 = add i64 %2, %tmp57
  br label %bb26

bb30.loopexit:                                    ; preds = %bb28
  br label %bb30

bb30:                                             ; preds = %bb30.loopexit, %bb29.loopexit
  %55 = add nsw i64 %storemerge46, 1
  %exitcond64 = icmp eq i64 %55, 10
  br i1 %exitcond64, label %return, label %bb5.preheader

bb5.preheader:                                    ; preds = %bb30, %bb.nph81
  %storemerge46 = phi i64 [ 0, %bb.nph81 ], [ %55, %bb30 ]
  br i1 %0, label %bb.nph16, label %bb20.loopexit

return:                                           ; preds = %bb30
  ret void
}
