172 lines · plain
1; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-modref-calls -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s2; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-nonaffine -polly-invariant-load-hoisting=true -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE3 4; TODO: We should delinearize the accesses despite the use in a call to a5; readonly function. For now we verify we do not delinearize them though.6 7; CHECK: Function: ham8; CHECK-NEXT: Region: %bb12---%bb289; CHECK-NEXT: Max Loop Depth: 110; CHECK-NEXT: Invariant Accesses: {11; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]12; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb12[] -> MemRef_arg1[0] };13; CHECK-NEXT: Execution Context: [tmp14, p_1] -> { : }14; CHECK-NEXT: }15; CHECK-NEXT: Context:16; CHECK-NEXT: [tmp14, p_1] -> { : -9223372036854775808 <= tmp14 <= 9223372036854775807 and -9223372036854775808 <= p_1 <= 9223372036854775807 }17; CHECK-NEXT: Assumed Context:18; CHECK-NEXT: [tmp14, p_1] -> { : }19; CHECK-NEXT: Invalid Context:20; CHECK-NEXT: [tmp14, p_1] -> { : tmp14 > 0 and (p_1 <= -1152921504606846977 or tmp14 >= 1152921504606846977 or p_1 >= 1152921504606846977 - tmp14) }21; CHECK: p0: %tmp1422; CHECK-NEXT: p1: {0,+,(0 smax %tmp)}<%bb12>23; CHECK-NEXT: Arrays {24; CHECK-NEXT: i64 MemRef_arg1[*]; // Element size 825; CHECK-NEXT: i64 MemRef_tmp13; // Element size 826; CHECK-NEXT: ptr MemRef_arg4[*]; // Element size 827; CHECK-NEXT: }28; CHECK-NEXT: Arrays (Bounds as pw_affs) {29; CHECK-NEXT: i64 MemRef_arg1[*]; // Element size 830; CHECK-NEXT: i64 MemRef_tmp13; // Element size 831; CHECK-NEXT: ptr MemRef_arg4[*]; // Element size 832; CHECK-NEXT: }33; CHECK-NEXT: Alias Groups (0):34; CHECK-NEXT: n/a35; CHECK-NEXT: Statements {36; CHECK-NEXT: Stmt_bb1237; CHECK-NEXT: Domain :=38; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb12[] };39; CHECK-NEXT: Schedule :=40; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb12[] -> [0, 0] };41; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]42; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb12[] -> MemRef_tmp13[] };43; CHECK-NEXT: Stmt_bb1744; CHECK-NEXT: Domain :=45; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb17[i0] : 0 <= i0 < tmp14 };46; CHECK-NEXT: Schedule :=47; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb17[i0] -> [1, i0] };48; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]49; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb17[i0] -> MemRef_arg4[o0] };50; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]51; CHECK-NEXT: [tmp14, p_1] -> { Stmt_bb17[i0] -> MemRef_arg4[p_1 + i0] };52; CHECK-NEXT: }53 54 55; NONAFFINE: Function: ham56; NONAFFINE-NEXT: Region: %bb5---%bb3257; NONAFFINE-NEXT: Max Loop Depth: 258; NONAFFINE-NEXT: Invariant Accesses: {59; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]60; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb5[] -> MemRef_arg[0] };61; NONAFFINE-NEXT: Execution Context: [tmp9, tmp14] -> { : }62; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]63; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb12[i0] -> MemRef_arg1[0] };64; NONAFFINE-NEXT: Execution Context: [tmp9, tmp14] -> { : }65; NONAFFINE-NEXT: }66; NONAFFINE-NEXT: Context:67; NONAFFINE-NEXT: [tmp9, tmp14] -> { : -9223372036854775808 <= tmp9 <= 9223372036854775807 and -9223372036854775808 <= tmp14 <= 9223372036854775807 }68; NONAFFINE-NEXT: Assumed Context:69; NONAFFINE-NEXT: [tmp9, tmp14] -> { : }70; NONAFFINE-NEXT: Invalid Context:71; NONAFFINE-NEXT: [tmp9, tmp14] -> { : false }72; NONAFFINE: p0: %tmp973; NONAFFINE-NEXT: p1: %tmp1474; NONAFFINE-NEXT: Arrays {75; NONAFFINE-NEXT: i64 MemRef_arg[*]; // Element size 876; NONAFFINE-NEXT: i64 MemRef_arg1[*]; // Element size 877; NONAFFINE-NEXT: i64 MemRef_tmp7; // Element size 878; NONAFFINE-NEXT: i64 MemRef_tmp8; // Element size 879; NONAFFINE-NEXT: ptr MemRef_arg4[*]; // Element size 880; NONAFFINE-NEXT: }81; NONAFFINE-NEXT: Arrays (Bounds as pw_affs) {82; NONAFFINE-NEXT: i64 MemRef_arg[*]; // Element size 883; NONAFFINE-NEXT: i64 MemRef_arg1[*]; // Element size 884; NONAFFINE-NEXT: i64 MemRef_tmp7; // Element size 885; NONAFFINE-NEXT: i64 MemRef_tmp8; // Element size 886; NONAFFINE-NEXT: ptr MemRef_arg4[*]; // Element size 887; NONAFFINE-NEXT: }88; NONAFFINE-NEXT: Alias Groups (0):89; NONAFFINE-NEXT: n/a90; NONAFFINE-NEXT: Statements {91; NONAFFINE-NEXT: Stmt_bb592; NONAFFINE-NEXT: Domain :=93; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb5[] };94; NONAFFINE-NEXT: Schedule :=95; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb5[] -> [0, 0, 0] };96; NONAFFINE-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]97; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb5[] -> MemRef_tmp7[] };98; NONAFFINE-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]99; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb5[] -> MemRef_tmp8[] };100; NONAFFINE-NEXT: Stmt_bb17101; NONAFFINE-NEXT: Domain :=102; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] : 0 <= i0 < tmp9 and 0 <= i1 < tmp14 };103; NONAFFINE-NEXT: Schedule :=104; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> [1, i0, i1] };105; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]106; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> MemRef_tmp7[] };107; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]108; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> MemRef_tmp8[] };109; NONAFFINE-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]110; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> MemRef_arg4[o0] };111; NONAFFINE-NEXT: MayWriteAccess := [Reduction Type: NONE] [Scalar: 0]112; NONAFFINE-NEXT: [tmp9, tmp14] -> { Stmt_bb17[i0, i1] -> MemRef_arg4[o0] };113; NONAFFINE-NEXT: }114 115target 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"116 117define void @ham(ptr noalias %arg, ptr noalias %arg1, ptr noalias %arg2, ptr noalias %arg3, ptr noalias %arg4) gc "dummy" {118bb:119 br label %bb5120 121bb5: ; preds = %bb122 %tmp = load i64, ptr %arg1, align 8123 %tmp6 = icmp slt i64 %tmp, 0124 %tmp7 = select i1 %tmp6, i64 0, i64 %tmp125 %tmp8 = xor i64 %tmp7, -1126 %tmp9 = load i64, ptr %arg, align 8127 %tmp10 = icmp sgt i64 %tmp9, 0128 br i1 %tmp10, label %bb11, label %bb32129 130bb11: ; preds = %bb5131 br label %bb12132 133bb12: ; preds = %bb28, %bb11134 %tmp13 = phi i64 [ %tmp30, %bb28 ], [ 1, %bb11 ]135 %tmp14 = load i64, ptr %arg1, align 8136 %tmp15 = icmp sgt i64 %tmp14, 0137 br i1 %tmp15, label %bb16, label %bb28138 139bb16: ; preds = %bb12140 br label %bb17141 142bb17: ; preds = %bb17, %bb16143 %tmp18 = phi i64 [ %tmp26, %bb17 ], [ 1, %bb16 ]144 %tmp19 = mul i64 %tmp13, %tmp7145 %tmp20 = add i64 %tmp19, %tmp8146 %tmp21 = add i64 %tmp20, %tmp18147 %tmp22 = add i64 %tmp18, %tmp13148 %tmp23 = sitofp i64 %tmp22 to double149 %tmp24 = getelementptr [1000 x double], ptr %arg4, i64 0, i64 %tmp21150 %dummy = call ptr @llvm.gcread(ptr %tmp24, ptr null)151 store double %tmp23, ptr %tmp24, align 8152 %tmp25 = icmp eq i64 %tmp18, %tmp14153 %tmp26 = add i64 %tmp18, 1154 br i1 %tmp25, label %bb27, label %bb17155 156bb27: ; preds = %bb17157 br label %bb28158 159bb28: ; preds = %bb27, %bb12160 %tmp29 = icmp eq i64 %tmp13, %tmp9161 %tmp30 = add i64 %tmp13, 1162 br i1 %tmp29, label %bb31, label %bb12163 164bb31: ; preds = %bb28165 br label %bb32166 167bb32: ; preds = %bb31, %bb5168 ret void169}170 171declare ptr @llvm.gcread(ptr, ptr)172