1; RUN: opt %loadPolly -S -polly-codegen < %s | FileCheck %s 2; 3; int jd(int *restrict A, int x, int N) { 4; for (int i = 1; i < N; i++) 5; for (int j = 3; j < N; j++) 6; x += A[i]; 7; return x; 8; } 9; 10target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 11 12define i32 @jd(i32* noalias %A, i32 %x, i32 %N) { 13entry: 14; CHECK-LABEL: entry: 15; CHECK-DAG: %x.addr.1.lcssa.s2a = alloca i32 16; CHECK-DAG: %x.addr.1.lcssa.phiops = alloca i32 17; CHECK-DAG: %x.addr.1.s2a = alloca i32 18; CHECK-DAG: %x.addr.1.phiops = alloca i32 19; CHECK-DAG: %x.addr.0.s2a = alloca i32 20; CHECK-DAG: %x.addr.0.phiops = alloca i32 21 %tmp = sext i32 %N to i64 22 br label %for.cond 23 24; CHECK-LABEL: polly.merge_new_and_old: 25; CHECK: %x.addr.0.merge = phi i32 [ %x.addr.0.final_reload, %polly.exiting ], [ %x.addr.0, %for.cond ] 26; CHECK: ret i32 %x.addr.0.merge 27 28; CHECK-LABEL: polly.start: 29; CHECK: store i32 %x, i32* %x.addr.0.phiops 30 31; CHECK-LABEL: polly.exiting: 32; CHECK: %x.addr.0.final_reload = load i32, i32* %x.addr.0.s2a 33 34for.cond: ; preds = %for.inc4, %entry 35; CHECK-LABEL: polly.stmt.for.cond{{[0-9]*}}: 36; CHECK: %x.addr.0.phiops.reload[[R1:[0-9]*]] = load i32, i32* %x.addr.0.phiops 37; CHECK: store i32 %x.addr.0.phiops.reload[[R1]], i32* %x.addr.0.s2a 38 %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc4 ], [ 1, %entry ] 39 %x.addr.0 = phi i32 [ %x, %entry ], [ %x.addr.1.lcssa, %for.inc4 ] 40 %cmp = icmp slt i64 %indvars.iv, %tmp 41 br i1 %cmp, label %for.body, label %for.end6 42 43for.body: ; preds = %for.cond 44; CHECK-LABEL: polly.stmt.for.body: 45; CHECK: %x.addr.0.s2a.reload[[R2:[0-9]*]] = load i32, i32* %x.addr.0.s2a 46; CHECK: store i32 %x.addr.0.s2a.reload[[R2]], i32* %x.addr.1.phiops 47 br label %for.cond1 48 49for.cond1: ; preds = %for.inc, %for.body 50; CHECK-LABEL: polly.stmt.for.cond1: 51; CHECK: %x.addr.1.phiops.reload = load i32, i32* %x.addr.1.phiops 52; CHECK: store i32 %x.addr.1.phiops.reload, i32* %x.addr.1.s2a[[R6:[0-9]*]] 53; CHECK: store i32 %x.addr.1.phiops.reload, i32* %x.addr.1.lcssa.phiops 54 %x.addr.1 = phi i32 [ %x.addr.0, %for.body ], [ %add, %for.inc ] 55 %j.0 = phi i32 [ 3, %for.body ], [ %inc, %for.inc ] 56 %exitcond = icmp ne i32 %j.0, %N 57 br i1 %exitcond, label %for.body3, label %for.end 58 59for.inc: ; preds = %for.body3 60; CHECK-LABEL: polly.stmt.for.inc: 61; CHECK: %x.addr.1.s2a.reload[[R3:[0-9]*]] = load i32, i32* %x.addr.1.s2a 62; CHECK: %p_add = add nsw i32 %x.addr.1.s2a.reload[[R3]], %tmp1_p_scalar_ 63; CHECK: store i32 %p_add, i32* %x.addr.1.phiops 64 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv 65 %tmp1 = load i32, i32* %arrayidx, align 4 66 %add = add nsw i32 %x.addr.1, %tmp1 67 %inc = add nsw i32 %j.0, 1 68 br label %for.cond1 69 70for.end: ; preds = %for.cond1 71; CHECK-LABEL: polly.stmt.for.end: 72; CHECK-NEXT: %x.addr.1.lcssa.phiops.reload = load i32, i32* %x.addr.1.lcssa.phiops 73; CHECK-NEXT: store i32 %x.addr.1.lcssa.phiops.reload, i32* %x.addr.1.lcssa.s2a[[R4:[0-9]*]] 74 %x.addr.1.lcssa = phi i32 [ %x.addr.1, %for.cond1 ] 75 br label %for.inc4 76 77for.inc4: ; preds = %for.end 78; CHECK-LABEL: polly.stmt.for.inc4: 79; CHECK: %x.addr.1.lcssa.s2a.reload[[R5:[0-9]*]] = load i32, i32* %x.addr.1.lcssa.s2a[[R4]] 80; CHECK: store i32 %x.addr.1.lcssa.s2a.reload[[R5]], i32* %x.addr.0.phiops 81 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 82 br label %for.cond 83 84for.body3: ; preds = %for.cond1 85 br label %for.inc 86 87for.end6: ; preds = %for.cond 88 ret i32 %x.addr.0 89} 90