Home | History | Annotate | Download | only in Delinearization
      1 ; RUN: opt < %s -analyze -delinearize | FileCheck %s
      2 ; XFAIL: *
      3 ; We do not recognize anymore variable size arrays.
      4 
      5 ; extern void bar(long n, long m, double A[n][m]);
      6 ;
      7 ; void foo(long a, long b) {
      8 ;   for (long n = 1; n < a; ++n)
      9 ;   for (long m = 1; m < b; ++m) {
     10 ;     double A[n][m];
     11 ;     for (long i = 0; i < n; i++)
     12 ;       for (long j = 0; j < m; j++)
     13 ;         A[i][j] = 1.0;
     14 ;     bar(n, m, A);
     15 ;   }
     16 ; }
     17 
     18 ; AddRec: {{%vla.us,+,{8,+,8}<%for.cond7.preheader.lr.ph.split.us.us>}<%for.body9.lr.ph.us.us>,+,8}<%for.body9.us.us>
     19 ; CHECK: Base offset: %vla.us
     20 ; CHECK: ArrayDecl[UnknownSize][{1,+,1}<%for.cond7.preheader.lr.ph.split.us.us>] with elements of sizeof(double) bytes.
     21 ; CHECK: ArrayRef[{0,+,1}<nuw><nsw><%for.body9.lr.ph.us.us>][{0,+,1}<nuw><nsw><%for.body9.us.us>]
     22 
     23 define void @foo(i64 %a, i64 %b) nounwind uwtable {
     24 entry:
     25   %cmp43 = icmp sgt i64 %a, 1
     26   br i1 %cmp43, label %for.cond1.preheader.lr.ph, label %for.end19
     27 
     28 for.cond1.preheader.lr.ph:                        ; preds = %entry
     29   %cmp224 = icmp sgt i64 %b, 1
     30   br label %for.cond1.preheader
     31 
     32 for.cond1.preheader:                              ; preds = %for.inc17, %for.cond1.preheader.lr.ph
     33   %indvars.iv51 = phi i64 [ 1, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next52, %for.inc17 ]
     34   br i1 %cmp224, label %for.cond7.preheader.lr.ph.split.us.us, label %for.inc17
     35 
     36 for.end13.us:                                     ; preds = %for.inc11.us.us
     37   call void @bar(i64 %indvars.iv51, i64 %indvars.iv48, double* %vla.us) nounwind
     38   call void @llvm.stackrestore(i8* %1)
     39   %indvars.iv.next49 = add i64 %indvars.iv48, 1
     40   %exitcond54 = icmp eq i64 %indvars.iv.next49, %b
     41   br i1 %exitcond54, label %for.inc17, label %for.cond7.preheader.lr.ph.split.us.us
     42 
     43 for.inc11.us.us:                                  ; preds = %for.body9.us.us
     44   %inc12.us.us = add nsw i64 %i.023.us.us, 1
     45   %exitcond53 = icmp eq i64 %inc12.us.us, %indvars.iv51
     46   br i1 %exitcond53, label %for.end13.us, label %for.body9.lr.ph.us.us
     47 
     48 for.body9.lr.ph.us.us:                            ; preds = %for.cond7.preheader.lr.ph.split.us.us, %for.inc11.us.us
     49   %i.023.us.us = phi i64 [ 0, %for.cond7.preheader.lr.ph.split.us.us ], [ %inc12.us.us, %for.inc11.us.us ]
     50   %0 = mul nsw i64 %i.023.us.us, %indvars.iv48
     51   br label %for.body9.us.us
     52 
     53 for.body9.us.us:                                  ; preds = %for.body9.us.us, %for.body9.lr.ph.us.us
     54   %j.021.us.us = phi i64 [ 0, %for.body9.lr.ph.us.us ], [ %inc.us.us, %for.body9.us.us ]
     55   %arrayidx.sum.us.us = add i64 %j.021.us.us, %0
     56   %arrayidx10.us.us = getelementptr inbounds double, double* %vla.us, i64 %arrayidx.sum.us.us
     57   store double 1.000000e+00, double* %arrayidx10.us.us, align 8
     58   %inc.us.us = add nsw i64 %j.021.us.us, 1
     59   %exitcond50 = icmp eq i64 %inc.us.us, %indvars.iv48
     60   br i1 %exitcond50, label %for.inc11.us.us, label %for.body9.us.us
     61 
     62 for.cond7.preheader.lr.ph.split.us.us:            ; preds = %for.cond1.preheader, %for.end13.us
     63   %indvars.iv48 = phi i64 [ %indvars.iv.next49, %for.end13.us ], [ 1, %for.cond1.preheader ]
     64   %1 = call i8* @llvm.stacksave()
     65   %2 = mul nuw i64 %indvars.iv48, %indvars.iv51
     66   %vla.us = alloca double, i64 %2, align 16
     67   br label %for.body9.lr.ph.us.us
     68 
     69 for.inc17:                                        ; preds = %for.end13.us, %for.cond1.preheader
     70   %indvars.iv.next52 = add i64 %indvars.iv51, 1
     71   %exitcond55 = icmp eq i64 %indvars.iv.next52, %a
     72   br i1 %exitcond55, label %for.end19, label %for.cond1.preheader
     73 
     74 for.end19:                                        ; preds = %for.inc17, %entry
     75   ret void
     76 }
     77 
     78 declare i8* @llvm.stacksave() nounwind
     79 declare void @bar(i64, i64, double*)
     80 declare void @llvm.stackrestore(i8*) nounwind
     81