1; RUN: opt %loadNPMPolly -disable-output -polly-invariant-load-hoisting \ 2; RUN: -polly-allow-dereference-of-all-function-parameters \ 3; RUN: '-passes=print<polly-function-scops>' < %s 2>&1 | FileCheck %s --check-prefix=SCOP 4 5; RUN: opt %loadNPMPolly -S -polly-invariant-load-hoisting \ 6; RUN: -passes=polly-codegen < %s 2>&1 | FileCheck %s --check-prefix=CODE-RTC 7 8 9; RUN: opt %loadNPMPolly -S -polly-invariant-load-hoisting \ 10; RUN: -polly-allow-dereference-of-all-function-parameters \ 11; RUN: -passes=polly-codegen < %s 2>&1 | FileCheck %s --check-prefix=CODE 12 13; SCOP: Function: hoge 14; SCOP-NEXT: Region: %bb15---%bb37 15; SCOP-NEXT: Max Loop Depth: 2 16; SCOP-NEXT: Invariant Accesses: { 17; SCOP-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 18; SCOP-NEXT: [tmp, tmp17, tmp28] -> { Stmt_bb29[i0] -> MemRef_arg1[0] }; 19; SCOP-NEXT: Execution Context: [tmp, tmp17, tmp28] -> { : } 20; SCOP-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] 21; SCOP-NEXT: [tmp, tmp17, tmp28] -> { Stmt_bb27[] -> MemRef_arg[0] }; 22; SCOP-NEXT: Execution Context: [tmp, tmp17, tmp28] -> { : } 23; SCOP-NEXT: } 24 25; Check that without the option `-polly-allow-dereference-of-all-function-parameters` 26; we do generate the runtime check. 27; CODE-RTC: polly.preload.cond: ; preds = %polly.preload.begin 28; CODE-RTC-NEXT: br i1 %{{[a-zA-Z0-9\.]*}}, label %polly.preload.exec, label %polly.preload.merge 29 30; Check that we don't generate a runtime check because we treat all 31; parameters as dereferenceable. 32; CODE-NOT: polly.preload.cond: ; preds = %polly.preload.begin 33; CODE-NOT: br i1 %{{r1:[a-zA-Z0-9]*}}, label %polly.preload.exec, label %polly.preload.merge 34 35target 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" 36target triple = "x86_64-unknown-linux-gnu" 37 38@global = external global i32 39 40; Function Attrs: nounwind uwtable 41define void @hoge(ptr noalias %arg, ptr noalias %arg1, ptr noalias %arg2, ptr %A) #0 { 42bb: 43 %tmp = load i32, ptr @global, align 4 44 %tmp3 = icmp sgt i32 %tmp, 1 45 br label %bb14 46 47bb14: ; preds = %bb 48 br label %bb15 49 50bb15: ; preds = %bb14 51 br i1 %tmp3, label %bb16, label %bb27 52 53bb16: ; preds = %bb15 54 %tmp17 = load i32, ptr %arg1, align 4 55 br label %bb18 56 57bb18: ; preds = %bb18, %bb16 58 %tmp19 = phi i32 [ %tmp25, %bb18 ], [ 1, %bb16 ] 59 %tmp20 = sext i32 %tmp19 to i64 60 %tmp21 = add nsw i64 %tmp20, -1 61 %tmp22 = getelementptr [0 x double], ptr %arg2, i64 0, i64 %tmp21 62 store i64 undef, ptr %tmp22, align 8 63 %tmp24 = icmp eq i32 %tmp19, %tmp17 64 %tmp25 = add i32 %tmp19, 1 65 br i1 %tmp24, label %bb26, label %bb18 66 67bb26: ; preds = %bb18 68 br label %bb27 69 70bb27: ; preds = %bb26, %bb15 71 %tmp28 = load i32, ptr %arg, align 4 72 store float 42.0, ptr %A 73 br label %bb29 74 75bb29: ; preds = %bb35, %bb27 76 %tmp30 = load i32, ptr %arg1, align 4 77 store float 42.0, ptr %A 78 br label %bb31 79 80bb31: ; preds = %bb31, %bb29 81 %tmp32 = phi i32 [ 1, %bb31 ], [ 1, %bb29 ] 82 store float 42.0, ptr %A 83 %tmp33 = icmp eq i32 %tmp32, %tmp30 84 br i1 %tmp33, label %bb34, label %bb31 85 86bb34: ; preds = %bb31 87 br label %bb35 88 89bb35: ; preds = %bb34 90 %tmp36 = icmp eq i32 0, %tmp28 91 br i1 %tmp36, label %bb37, label %bb29 92 93bb37: ; preds = %bb35 94 ret void 95} 96 97attributes #0 = { nounwind uwtable } 98