summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/lib/CodeGen/IslNodeBuilder.cpp12
-rw-r--r--polly/test/Isl/CodeGen/conflict-between-loop-invariant-code-hosting-and-escape-map-computation.ll50
-rw-r--r--polly/test/ScopInfo/invariant_load_access_classes_different_base_type_escaping.ll6
-rw-r--r--polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer_escaping.ll4
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
OpenPOWER on IntegriCloud