From 3181c2ef723e4d196f2b6c74b13fda9ae61ba3b1 Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Tue, 3 Nov 2015 01:42:59 +0000 Subject: [PATCH] [FIX] Correctly update SAI base pointer If a base pointer load is preloaded, we have change the base pointer of the derived SAI. However, as the derived SAI relationship is is coarse grained, we need to check if we actually preloaded the base pointer or a different element of the base pointer SAI array. llvm-svn: 251881 --- polly/lib/CodeGen/IslNodeBuilder.cpp | 12 ++++- ...code-hosting-and-escape-map-computation.ll | 50 +++++++++++++++++++ ...ss_classes_different_base_type_escaping.ll | 6 +-- ...fferent_base_type_same_pointer_escaping.ll | 4 +- 4 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 polly/test/Isl/CodeGen/conflict-between-loop-invariant-code-hosting-and-escape-map-computation.ll diff --git a/polly/lib/CodeGen/IslNodeBuilder.cpp b/polly/lib/CodeGen/IslNodeBuilder.cpp index 72553907ee63..439367b7aa0c 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 000000000000..94d1427f1fa5 --- /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 e10592046883..90d09bd89dcb 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 84ac67a15b1c..9fe6e0dc4929 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