[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
This commit is contained in:
Johannes Doerfert 2015-11-03 01:42:59 +00:00
parent 2a3dc2526b
commit 3181c2ef72
4 changed files with 64 additions and 8 deletions

View File

@ -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();

View File

@ -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
}

View File

@ -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 ]

View File

@ -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