; RUN: opt %loadPolly -analyze -polly-scops \ ; RUN: -polly-invariant-load-hoisting=true < %s | FileCheck %s ; ; Check that propagation of domains from A(X) to A(X+1) will keep the ; domains small and concise. ; ; CHECK: Assumed Context: ; CHECK-NEXT: [tmp5, tmp, tmp8, tmp11, tmp14, tmp17, tmp20, tmp23, tmp26] -> { : } ; CHECK-NEXT: Invalid Context: ; CHECK-NEXT: [tmp5, tmp, tmp8, tmp11, tmp14, tmp17, tmp20, tmp23, tmp26] -> { : 1 = 0 } ; ; CHECK: Stmt_FINAL ; CHECK-NEXT: Domain := ; CHECK-NEXT: [tmp5, tmp, tmp8, tmp11, tmp14, tmp17, tmp20, tmp23, tmp26] -> { Stmt_FINAL[] }; ; CHECK-NEXT: Schedule := ; CHECK-NEXT: [tmp5, tmp, tmp8, tmp11, tmp14, tmp17, tmp20, tmp23, tmp26] -> { Stmt_FINAL[] -> [16] }; ; ; ; void f(short *restrict In, int *restrict Out) { ; int InV, V, Idx; ; Idx = 0; ; V = 999; ; ; A0: ; InV = In[Idx++]; ; if (InV < V + 42) { ; B0: ; V = V + 42; ; Out[V]++; ; } else { ; C0: ; V = InV; ; Out[V]--; ; } ; ; A1: ; InV = In[Idx++]; ; if (InV < V + 42) { ; B1: ; V = V + 42; ; Out[V]++; ; } else { ; C1: ; V = InV; ; Out[V]--; ; } ; V = 999; ; ; A2: ; InV = In[Idx++]; ; if (InV < V + 42) { ; B2: ; V = V + 42; ; Out[V]++; ; } else { ; C2: ; V = InV; ; Out[V]--; ; } ; ; A3: ; InV = In[Idx++]; ; if (InV < V + 42) { ; B3: ; V = V + 42; ; Out[V]++; ; } else { ; C3: ; V = InV; ; Out[V]--; ; } ; V = 999; ; ; A4: ; InV = In[Idx++]; ; if (InV < V + 42) { ; B4: ; V = V + 42; ; Out[V]++; ; } else { ; C4: ; V = InV; ; Out[V]--; ; } ; ; A5: ; InV = In[Idx++]; ; if (InV < V + 42) { ; B5: ; V = V + 42; ; Out[V]++; ; } else { ; C5: ; V = InV; ; Out[V]--; ; } ; V = 999; ; ; A6: ; InV = In[Idx++]; ; if (InV < V + 42) { ; B6: ; V = V + 42; ; Out[V]++; ; } else { ; C6: ; V = InV; ; Out[V]--; ; } ; ; A7: ; InV = In[Idx++]; ; if (InV < V + 42) { ; B7: ; V = V + 42; ; Out[V]++; ; } else { ; C7: ; V = InV; ; Out[V]--; ; } ; V = 999; ; ; A8: ; InV = In[Idx++]; ; if (InV < V + 42) { ; B8: ; V = V + 42; ; Out[V]++; ; } else { ; C8: ; V = InV; ; Out[V]--; ; } ; FINAL: ; Out[V]++; ; ; ScopExit: ; return; ; } ; target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" define void @f(i16* noalias %In, i32* noalias %Out) { entry: %tmp = load i16, i16* %In, align 2 %conv = sext i16 %tmp to i32 %cmp = icmp slt i16 %tmp, 1041 br i1 %cmp, label %B0, label %C0 B0: ; preds = %entry %arrayidx4 = getelementptr inbounds i32, i32* %Out, i64 1041 %tmp3 = load i32, i32* %arrayidx4, align 4 %inc5 = add nsw i32 %tmp3, 1 store i32 %inc5, i32* %arrayidx4, align 4 br label %A1 C0: ; preds = %entry %idxprom6 = sext i16 %tmp to i64 %arrayidx7 = getelementptr inbounds i32, i32* %Out, i64 %idxprom6 %tmp4 = load i32, i32* %arrayidx7, align 4 %dec = add nsw i32 %tmp4, -1 store i32 %dec, i32* %arrayidx7, align 4 br label %A1 A1: ; preds = %B0, %C0 %V.0 = phi i32 [ 1041, %B0 ], [ %conv, %C0 ] %arrayidx10 = getelementptr inbounds i16, i16* %In, i64 1 %tmp5 = load i16, i16* %arrayidx10, align 2 %conv11 = sext i16 %tmp5 to i32 %add12 = add nsw i32 %V.0, 42 %cmp13 = icmp slt i32 %conv11, %add12 br i1 %cmp13, label %B1, label %C1 B1: ; preds = %A1 %add16 = add nsw i32 %V.0, 42 %idxprom17 = sext i32 %add16 to i64 %arrayidx18 = getelementptr inbounds i32, i32* %Out, i64 %idxprom17 %tmp6 = load i32, i32* %arrayidx18, align 4 %inc19 = add nsw i32 %tmp6, 1 store i32 %inc19, i32* %arrayidx18, align 4 br label %A2 C1: ; preds = %A1 %idxprom21 = sext i16 %tmp5 to i64 %arrayidx22 = getelementptr inbounds i32, i32* %Out, i64 %idxprom21 %tmp7 = load i32, i32* %arrayidx22, align 4 %dec23 = add nsw i32 %tmp7, -1 store i32 %dec23, i32* %arrayidx22, align 4 br label %A2 A2: ; preds = %B1, %C1 %arrayidx27 = getelementptr inbounds i16, i16* %In, i64 2 %tmp8 = load i16, i16* %arrayidx27, align 2 %conv28 = sext i16 %tmp8 to i32 %cmp30 = icmp slt i16 %tmp8, 1041 br i1 %cmp30, label %B2, label %C2 B2: ; preds = %A2 %arrayidx35 = getelementptr inbounds i32, i32* %Out, i64 1041 %tmp9 = load i32, i32* %arrayidx35, align 4 %inc36 = add nsw i32 %tmp9, 1 store i32 %inc36, i32* %arrayidx35, align 4 br label %A3 C2: ; preds = %A2 %idxprom38 = sext i16 %tmp8 to i64 %arrayidx39 = getelementptr inbounds i32, i32* %Out, i64 %idxprom38 %tmp10 = load i32, i32* %arrayidx39, align 4 %dec40 = add nsw i32 %tmp10, -1 store i32 %dec40, i32* %arrayidx39, align 4 br label %A3 A3: ; preds = %B2, %C2 %V.1 = phi i32 [ 1041, %B2 ], [ %conv28, %C2 ] %arrayidx44 = getelementptr inbounds i16, i16* %In, i64 3 %tmp11 = load i16, i16* %arrayidx44, align 2 %conv45 = sext i16 %tmp11 to i32 %add46 = add nsw i32 %V.1, 42 %cmp47 = icmp slt i32 %conv45, %add46 br i1 %cmp47, label %B3, label %C3 B3: ; preds = %A3 %add50 = add nsw i32 %V.1, 42 %idxprom51 = sext i32 %add50 to i64 %arrayidx52 = getelementptr inbounds i32, i32* %Out, i64 %idxprom51 %tmp12 = load i32, i32* %arrayidx52, align 4 %inc53 = add nsw i32 %tmp12, 1 store i32 %inc53, i32* %arrayidx52, align 4 br label %A4 C3: ; preds = %A3 %idxprom55 = sext i16 %tmp11 to i64 %arrayidx56 = getelementptr inbounds i32, i32* %Out, i64 %idxprom55 %tmp13 = load i32, i32* %arrayidx56, align 4 %dec57 = add nsw i32 %tmp13, -1 store i32 %dec57, i32* %arrayidx56, align 4 br label %A4 A4: ; preds = %B3, %C3 %arrayidx61 = getelementptr inbounds i16, i16* %In, i64 4 %tmp14 = load i16, i16* %arrayidx61, align 2 %conv62 = sext i16 %tmp14 to i32 %cmp64 = icmp slt i16 %tmp14, 1041 br i1 %cmp64, label %B4, label %C4 B4: ; preds = %A4 %arrayidx69 = getelementptr inbounds i32, i32* %Out, i64 1041 %tmp15 = load i32, i32* %arrayidx69, align 4 %inc70 = add nsw i32 %tmp15, 1 store i32 %inc70, i32* %arrayidx69, align 4 br label %A5 C4: ; preds = %A4 %idxprom72 = sext i16 %tmp14 to i64 %arrayidx73 = getelementptr inbounds i32, i32* %Out, i64 %idxprom72 %tmp16 = load i32, i32* %arrayidx73, align 4 %dec74 = add nsw i32 %tmp16, -1 store i32 %dec74, i32* %arrayidx73, align 4 %phitmp = add nsw i32 %conv62, 42 br label %A5 A5: ; preds = %B4, %C4 %V.2 = phi i32 [ 1083, %B4 ], [ %phitmp, %C4 ] %arrayidx78 = getelementptr inbounds i16, i16* %In, i64 5 %tmp17 = load i16, i16* %arrayidx78, align 2 %conv79 = sext i16 %tmp17 to i32 %cmp81 = icmp slt i32 %conv79, %V.2 br i1 %cmp81, label %B5, label %C5 B5: ; preds = %A5 %idxprom85 = sext i32 %V.2 to i64 %arrayidx86 = getelementptr inbounds i32, i32* %Out, i64 %idxprom85 %tmp18 = load i32, i32* %arrayidx86, align 4 %inc87 = add nsw i32 %tmp18, 1 store i32 %inc87, i32* %arrayidx86, align 4 br label %A6 C5: ; preds = %A5 %idxprom89 = sext i16 %tmp17 to i64 %arrayidx90 = getelementptr inbounds i32, i32* %Out, i64 %idxprom89 %tmp19 = load i32, i32* %arrayidx90, align 4 %dec91 = add nsw i32 %tmp19, -1 store i32 %dec91, i32* %arrayidx90, align 4 br label %A6 A6: ; preds = %B5, %C5 %arrayidx95 = getelementptr inbounds i16, i16* %In, i64 6 %tmp20 = load i16, i16* %arrayidx95, align 2 %conv96 = sext i16 %tmp20 to i32 %cmp98 = icmp slt i16 %tmp20, 1041 br i1 %cmp98, label %B6, label %C6 B6: ; preds = %A6 %arrayidx103 = getelementptr inbounds i32, i32* %Out, i64 1041 %tmp21 = load i32, i32* %arrayidx103, align 4 %inc104 = add nsw i32 %tmp21, 1 store i32 %inc104, i32* %arrayidx103, align 4 br label %A7 C6: ; preds = %A6 %idxprom106 = sext i16 %tmp20 to i64 %arrayidx107 = getelementptr inbounds i32, i32* %Out, i64 %idxprom106 %tmp22 = load i32, i32* %arrayidx107, align 4 %dec108 = add nsw i32 %tmp22, -1 store i32 %dec108, i32* %arrayidx107, align 4 %phitmp1 = add nsw i32 %conv96, 42 br label %A7 A7: ; preds = %B6, %C6 %V.3 = phi i32 [ 1083, %B6 ], [ %phitmp1, %C6 ] %arrayidx112 = getelementptr inbounds i16, i16* %In, i64 7 %tmp23 = load i16, i16* %arrayidx112, align 2 %conv113 = sext i16 %tmp23 to i32 %cmp115 = icmp slt i32 %conv113, %V.3 br i1 %cmp115, label %B7, label %C7 B7: ; preds = %A7 %idxprom119 = sext i32 %V.3 to i64 %arrayidx120 = getelementptr inbounds i32, i32* %Out, i64 %idxprom119 %tmp24 = load i32, i32* %arrayidx120, align 4 %inc121 = add nsw i32 %tmp24, 1 store i32 %inc121, i32* %arrayidx120, align 4 br label %A8 C7: ; preds = %A7 %idxprom123 = sext i16 %tmp23 to i64 %arrayidx124 = getelementptr inbounds i32, i32* %Out, i64 %idxprom123 %tmp25 = load i32, i32* %arrayidx124, align 4 %dec125 = add nsw i32 %tmp25, -1 store i32 %dec125, i32* %arrayidx124, align 4 br label %A8 A8: ; preds = %B7, %C7 %arrayidx129 = getelementptr inbounds i16, i16* %In, i64 8 %tmp26 = load i16, i16* %arrayidx129, align 2 %cmp132 = icmp slt i16 %tmp26, 1041 br i1 %cmp132, label %B8, label %C8 B8: ; preds = %A8 %arrayidx137 = getelementptr inbounds i32, i32* %Out, i64 1041 %tmp27 = load i32, i32* %arrayidx137, align 4 %inc138 = add nsw i32 %tmp27, 1 store i32 %inc138, i32* %arrayidx137, align 4 br label %FINAL C8: ; preds = %A8 %idxprom140 = sext i16 %tmp26 to i64 %arrayidx141 = getelementptr inbounds i32, i32* %Out, i64 %idxprom140 %tmp28 = load i32, i32* %arrayidx141, align 4 %dec142 = add nsw i32 %tmp28, -1 store i32 %dec142, i32* %arrayidx141, align 4 %phitmp2 = sext i16 %tmp26 to i64 br label %FINAL FINAL: ; preds = %C8, %B8 %V.4 = phi i64 [ 1041, %B8 ], [ %phitmp2, %C8 ] %arrayidx145 = getelementptr inbounds i32, i32* %Out, i64 %V.4 %tmp29 = load i32, i32* %arrayidx145, align 4 %inc146 = add nsw i32 %tmp29, 1 store i32 %inc146, i32* %arrayidx145, align 4 br label %ScopExit ScopExit: ret void }