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