diff options
4 files changed, 64 insertions, 8 deletions
diff --git a/polly/lib/CodeGen/IslNodeBuilder.cpp b/polly/lib/CodeGen/IslNodeBuilder.cpp index 72553907ee6..439367b7aa0 100644 --- a/polly/lib/CodeGen/IslNodeBuilder.cpp +++ b/polly/lib/CodeGen/IslNodeBuilder.cpp @@ -960,8 +960,16 @@ void IslNodeBuilder::preloadInvariantEquivClass( auto *SAI = S.getScopArrayInfo(MA->getBaseAddr()); for (auto *DerivedSAI : SAI->getDerivedSAIs()) { Value *BasePtr = DerivedSAI->getBasePtr(); - BasePtr = Builder.CreateBitOrPointerCast(PreloadVal, BasePtr->getType()); - DerivedSAI->setBasePtr(BasePtr); + + // As the derived SAI information is quite coarse, any load from the current + // SAI could be the base pointer of the derived SAI, however we should only + // change the base pointer of the derived SAI if we actually preloaded it. + for (const MemoryAccess *MA : MAs) { + if (BasePtr != MA->getBaseAddr()) + continue; + BasePtr = Builder.CreateBitOrPointerCast(PreloadVal, BasePtr->getType()); + DerivedSAI->setBasePtr(BasePtr); + } } BasicBlock *EntryBB = &Builder.GetInsertBlock()->getParent()->getEntryBlock(); diff --git a/polly/test/Isl/CodeGen/conflict-between-loop-invariant-code-hosting-and-escape-map-computation.ll b/polly/test/Isl/CodeGen/conflict-between-loop-invariant-code-hosting-and-escape-map-computation.ll new file mode 100644 index 00000000000..94d1427f1fa --- /dev/null +++ b/polly/test/Isl/CodeGen/conflict-between-loop-invariant-code-hosting-and-escape-map-computation.ll @@ -0,0 +1,50 @@ +; RUN: opt %loadPolly -polly-process-unprofitable -analyze -polly-codegen < %s +; +; CHECK: store i32 %tmp14_p_scalar_, i32* %tmp14.s2a +; CHECK: %tmp14.final_reload = load i32, i32* %tmp14.s2a +; CHECK: %tmp17b.final_reload = load i32, i32* %tmp17b.preload.s2a +; CHECK: %tmp17.final_reload = load i32, i32* %tmp17.preload.s2a +; +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +; Function Attrs: nounwind uwtable +define void @hoge(i8* %arg, i32 %arg4) #0 { +bb: + br label %bb5 + +bb5: ; preds = %bb + br i1 undef, label %bb6, label %bb18 + +bb6: ; preds = %bb5 + %tmp7 = getelementptr i8, i8* %arg, i64 0 + %tmp8 = getelementptr inbounds i8, i8* %tmp7, i64 4 + %tmp9 = getelementptr inbounds i8, i8* %tmp8, i64 20 + br label %bb10 + +bb10: ; preds = %bb10, %bb6 + %tmp11 = phi i32 [ %tmp12, %bb10 ], [ 2, %bb6 ] + %tmp12 = add nuw nsw i32 %tmp11, 1 + br i1 false, label %bb10, label %bb13 + +bb13: ; preds = %bb10 + %tmp = bitcast i8* %tmp9 to i32* + %tmp14 = load i32, i32* %tmp, align 4 + %tmp15 = getelementptr inbounds i8, i8* %tmp9, i64 4 + %tmp16 = bitcast i8* %tmp15 to i32* + %tmp17 = load i32, i32* %tmp16, align 4 + store i32 %tmp17, i32* %tmp, align 4 + %tmp15b = getelementptr inbounds i8, i8* %tmp9, i64 8 + %tmp16b = bitcast i8* %tmp15b to i32* + %tmp17b = load i32, i32* %tmp16b, align 4 + store i32 %tmp17b, i32* %tmp, align 4 + br label %bb19 + +bb18: ; preds = %bb5 + br label %bb19 + +bb19: ; preds = %bb18, %bb13 + %tmp20 = phi i32 [ %tmp14, %bb13 ], [ %arg4, %bb18 ] + %tmp21 = phi i32 [ %tmp17, %bb13 ], [ %arg4, %bb18 ] + %tmp22 = phi i32 [ %tmp17b, %bb13 ], [ %arg4, %bb18 ] + unreachable +} diff --git a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_escaping.ll b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_escaping.ll index e1059204688..90d09bd89dc 100644 --- a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_escaping.ll +++ b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_escaping.ll @@ -45,12 +45,10 @@ ; ; CODEGEN: polly.preload.begin: ; CODEGEN: %.load = load i32, i32* getelementptr inbounds (%struct.anon, %struct.anon* @S, i32 0, i32 0) -; CODEGEN: %0 = bitcast i32 %.load to float ; CODEGEN: store i32 %.load, i32* %S.a.preload.s2a ; CODEGEN: %.load1 = load i32, i32* getelementptr (i32, i32* getelementptr inbounds (%struct.anon, %struct.anon* @S, i32 0, i32 0), i64 1) -; CODEGEN: %1 = bitcast i32 %.load1 to float -; CODEGEN: %2 = bitcast float %1 to i32 -; CODEGEN: store float %1, float* %S.b.preload.s2a +; CODEGEN: %0 = bitcast i32 %.load1 to float +; CODEGEN: store float %0, float* %S.b.preload.s2a ; ; CODEGEN: polly.merge_new_and_old: ; CODEGEN-DAG: %S.b.merge = phi float [ %S.b.final_reload, %polly.loop_exit ], [ %S.b, %do.cond ] diff --git a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer_escaping.ll b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer_escaping.ll index 84ac67a15b1..9fe6e0dc492 100644 --- a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer_escaping.ll +++ b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer_escaping.ll @@ -42,12 +42,12 @@ ; ; CODEGEN: polly.merge_new_and_old: ; CODEGEN-DAG: %U.f.merge = phi float [ %U.f.final_reload, %polly.loop_exit ], [ %U.f, %do.cond ] -; CODEGEN-DAG: %U.i.merge = phi i32 [ %7, %polly.loop_exit ], [ %U.i, %do.cond ] +; CODEGEN-DAG: %U.i.merge = phi i32 [ %6, %polly.loop_exit ], [ %U.i, %do.cond ] ; ; CODEGEN: polly.loop_exit: ; CODEGEN-DAG: %U.f.final_reload = load float, float* %U.f.preload.s2a ; CODEGEN-DAG: %U.i.final_reload = load float, float* %U.f.preload.s2a -; CODEGEN-DAG: %7 = bitcast float %U.i.final_reload to i32 +; CODEGEN-DAG: %6 = bitcast float %U.i.final_reload to i32 ; ; CODEGEN: polly.stmt.do.body: ; CODEGEN: %p_conv = fptosi float %0 to i32 |