1; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-allow-modref-calls \ 2; RUN: -polly-invariant-load-hoisting=true \ 3; RUN: -disable-output < %s 2>&1 | FileCheck %s 4; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-allow-nonaffine \ 5; RUN: -polly-invariant-load-hoisting=true \ 6; RUN: -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE 7 8; TODO: We should delinearize the accesses despite the use in a call to a 9; readonly function. For now we verify we do not delinearize them though. 10 11; CHECK: Function: ham 12; CHECK-NEXT: Region: %bb12---%bb28 13; CHECK-NEXT: Max Loop Depth: 1 14; CHECK-NEXT: Invariant Accesses: { 15; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 16; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb12[] -> MemRef_arg1[0] }; 17; CHECK-NEXT: Execution Context: [tmp14, p_1] -> { : } 18; CHECK-NEXT: } 19; CHECK-NEXT: Context: 20; CHECK-NEXT: [tmp14, p_1] -> { : -9223372036854775808 <= tmp14 <= 9223372036854775807 and -9223372036854775808 <= p_1 <= 9223372036854775807 } 21; CHECK-NEXT: Assumed Context: 22; CHECK-NEXT: [tmp14, p_1] -> { : } 23; CHECK-NEXT: Invalid Context: 24; CHECK-NEXT: [tmp14, p_1] -> { : tmp14 > 0 and (p_1 <= -1152921504606846977 or tmp14 >= 1152921504606846977 or p_1 >= 1152921504606846977 - tmp14) } 25; CHECK: p0: %tmp14 26; CHECK-NEXT: p1: {0,+,(0 smax %tmp)}<%bb12> 27; CHECK-NEXT: Arrays { 28; CHECK-NEXT: i64 MemRef_arg1[*]; // Element size 8 29; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 30; CHECK-NEXT: double MemRef_arg4[*]; // Element size 8 31; CHECK-NEXT: } 32; CHECK-NEXT: Arrays (Bounds as pw_affs) { 33; CHECK-NEXT: i64 MemRef_arg1[*]; // Element size 8 34; CHECK-NEXT: i64 MemRef_tmp13; // Element size 8 35; CHECK-NEXT: double MemRef_arg4[*]; // Element size 8 36; CHECK-NEXT: } 37; CHECK-NEXT: Alias Groups (0): 38; CHECK-NEXT: n/a 39; CHECK-NEXT: Statements { 40; CHECK-NEXT: Stmt_bb12 41; CHECK-NEXT: Domain := 42; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb12[] }; 43; CHECK-NEXT: Schedule := 44; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb12[] -> [0, 0] }; 45; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] 46; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb12[] -> MemRef_tmp13[] }; 47; CHECK-NEXT: Stmt_bb17 48; CHECK-NEXT: Domain := 49; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb17[i0] : 0 <= i0 < tmp14 }; 50; CHECK-NEXT: Schedule := 51; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb17[i0] -> [1, i0] }; 52; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0] 53; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb17[i0] -> MemRef_arg4[p_1 + i0] }; 54; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 55; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb17[i0] -> MemRef_arg1[o0] }; 56; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 57; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb17[i0] -> MemRef_arg4[o0] }; 58; CHECK-NEXT: } 59 60; NONAFFINE: Function: ham 61; NONAFFINE-NEXT: Region: %bb5---%bb32 62; NONAFFINE-NEXT: Max Loop Depth: 2 63; NONAFFINE-NEXT: Invariant Accesses: { 64; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 65; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb5[] -> MemRef_arg[0] }; 66; NONAFFINE-NEXT: Execution Context: [tmp9, tmp14] -> { : } 67; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 68; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb12[i0] -> MemRef_arg1[0] }; 69; NONAFFINE-NEXT: Execution Context: [tmp9, tmp14] -> { : } 70; NONAFFINE-NEXT: } 71; NONAFFINE-NEXT: Context: 72; NONAFFINE-NEXT: [tmp9, tmp14] -> { : -9223372036854775808 <= tmp9 <= 9223372036854775807 and -9223372036854775808 <= tmp14 <= 9223372036854775807 } 73; NONAFFINE-NEXT: Assumed Context: 74; NONAFFINE-NEXT: [tmp9, tmp14] -> { : } 75; NONAFFINE-NEXT: Invalid Context: 76; NONAFFINE-NEXT: [tmp9, tmp14] -> { : false } 77; NONAFFINE: p0: %tmp9 78; NONAFFINE-NEXT: p1: %tmp14 79; NONAFFINE-NEXT: Arrays { 80; NONAFFINE-NEXT: i64 MemRef_arg[*]; // Element size 8 81; NONAFFINE-NEXT: i64 MemRef_arg1[*]; // Element size 8 82; NONAFFINE-NEXT: i64 MemRef_tmp7; // Element size 8 83; NONAFFINE-NEXT: i64 MemRef_tmp8; // Element size 8 84; NONAFFINE-NEXT: double MemRef_arg4[*]; // Element size 8 85; NONAFFINE-NEXT: } 86; NONAFFINE-NEXT: Arrays (Bounds as pw_affs) { 87; NONAFFINE-NEXT: i64 MemRef_arg[*]; // Element size 8 88; NONAFFINE-NEXT: i64 MemRef_arg1[*]; // Element size 8 89; NONAFFINE-NEXT: i64 MemRef_tmp7; // Element size 8 90; NONAFFINE-NEXT: i64 MemRef_tmp8; // Element size 8 91; NONAFFINE-NEXT: double MemRef_arg4[*]; // Element size 8 92; NONAFFINE-NEXT: } 93; NONAFFINE-NEXT: Alias Groups (0): 94; NONAFFINE-NEXT: n/a 95; NONAFFINE-NEXT: Statements { 96; NONAFFINE-NEXT: Stmt_bb5 97; NONAFFINE-NEXT: Domain := 98; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb5[] }; 99; NONAFFINE-NEXT: Schedule := 100; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb5[] -> [0, 0, 0] }; 101; NONAFFINE-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] 102; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb5[] -> MemRef_tmp7[] }; 103; NONAFFINE-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1] 104; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb5[] -> MemRef_tmp8[] }; 105; NONAFFINE-NEXT: Stmt_bb17 106; NONAFFINE-NEXT: Domain := 107; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] : 0 <= i0 < tmp9 and 0 <= i1 < tmp14 }; 108; NONAFFINE-NEXT: Schedule := 109; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> [1, i0, i1] }; 110; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1] 111; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> MemRef_tmp7[] }; 112; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1] 113; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> MemRef_tmp8[] }; 114; NONAFFINE-NEXT: MayWriteAccess := [Reduction Type: NONE] [Scalar: 0] 115; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> MemRef_arg4[o0] }; 116; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 117; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> MemRef_arg[o0] }; 118; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 119; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> MemRef_arg1[o0] }; 120; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 121; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> MemRef_arg4[o0] }; 122; NONAFFINE-NEXT: } 123 124 125target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 126 127define void @ham(ptr noalias %arg, ptr noalias %arg1, ptr noalias %arg2, ptr noalias %arg3, ptr noalias %arg4) unnamed_addr { 128bb: 129 br label %bb5 130 131bb5: ; preds = %bb 132 %tmp = load i64, ptr %arg1, align 8 133 %tmp6 = icmp slt i64 %tmp, 0 134 %tmp7 = select i1 %tmp6, i64 0, i64 %tmp 135 %tmp8 = xor i64 %tmp7, -1 136 %tmp9 = load i64, ptr %arg, align 8 137 %tmp10 = icmp sgt i64 %tmp9, 0 138 br i1 %tmp10, label %bb11, label %bb32 139 140bb11: ; preds = %bb5 141 br label %bb12 142 143bb12: ; preds = %bb28, %bb11 144 %tmp13 = phi i64 [ %tmp30, %bb28 ], [ 1, %bb11 ] 145 %tmp14 = load i64, ptr %arg1, align 8 146 %tmp15 = icmp sgt i64 %tmp14, 0 147 br i1 %tmp15, label %bb16, label %bb28 148 149bb16: ; preds = %bb12 150 br label %bb17 151 152bb17: ; preds = %bb17, %bb16 153 %tmp18 = phi i64 [ %tmp26, %bb17 ], [ 1, %bb16 ] 154 %tmp19 = mul i64 %tmp13, %tmp7 155 %tmp20 = add i64 %tmp19, %tmp8 156 %tmp21 = add i64 %tmp20, %tmp18 157 %tmp22 = add i64 %tmp18, %tmp13 158 %tmp23 = sitofp i64 %tmp22 to double 159 %tmp24 = getelementptr [0 x double], ptr %arg4, i64 0, i64 %tmp21 160 %call = call double @func(ptr %tmp24) #2 161 %sum = fadd double %call, %tmp23 162 store double %sum, ptr %tmp24, align 8 163 %tmp25 = icmp eq i64 %tmp18, %tmp14 164 %tmp26 = add i64 %tmp18, 1 165 br i1 %tmp25, label %bb27, label %bb17 166 167bb27: ; preds = %bb17 168 br label %bb28 169 170bb28: ; preds = %bb27, %bb12 171 %tmp29 = icmp eq i64 %tmp13, %tmp9 172 %tmp30 = add i64 %tmp13, 1 173 br i1 %tmp29, label %bb31, label %bb12 174 175bb31: ; preds = %bb28 176 br label %bb32 177 178bb32: ; preds = %bb31, %bb5 179 ret void 180} 181 182declare double @func(ptr) #1 183 184attributes #1 = { nounwind readonly } 185