summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Doerfert <doerfert@cs.uni-saarland.de>2015-11-03 19:15:33 +0000
committerJohannes Doerfert <doerfert@cs.uni-saarland.de>2015-11-03 19:15:33 +0000
commit22892687f7954142c33242e83d505c20d7fba575 (patch)
treed5dfbd027e927b0d7524483a5f7092003acca522
parent856b7afe60efa9beaefe11c12a0c7e641c4110eb (diff)
downloadbcm5719-llvm-22892687f7954142c33242e83d505c20d7fba575.tar.gz
bcm5719-llvm-22892687f7954142c33242e83d505c20d7fba575.zip
[FIX] Simplify and correct preloading of base pointer origin
To simplify and correct the preloading of a base pointer origin, e.g., the base pointer for the current indirect invariant load, we now just check if there is an invariant access class that involves the base pointer of the current class. llvm-svn: 251962
-rw-r--r--polly/lib/CodeGen/IslNodeBuilder.cpp11
-rw-r--r--polly/test/Isl/CodeGen/inv-load-lnt-crash-wrong-order-3.ll73
2 files changed, 75 insertions, 9 deletions
diff --git a/polly/lib/CodeGen/IslNodeBuilder.cpp b/polly/lib/CodeGen/IslNodeBuilder.cpp
index 930302a114f..6dc1678c6cf 100644
--- a/polly/lib/CodeGen/IslNodeBuilder.cpp
+++ b/polly/lib/CodeGen/IslNodeBuilder.cpp
@@ -941,15 +941,8 @@ void IslNodeBuilder::preloadInvariantEquivClass(
// If the base pointer of this class is dependent on another one we have to
// make sure it was preloaded already.
auto *SAI = S.getScopArrayInfo(MA->getBaseAddr());
- if (auto *BasePtrOriginSAI = SAI->getBasePtrOriginSAI()) {
- auto *BasePtrOriginBasePtr = BasePtrOriginSAI->getBasePtr();
- auto *BasePtrOriginBasePtrSCEV = SE.getSCEV(BasePtrOriginBasePtr);
-
- const auto &InvariantEquivClasses = S.getInvariantAccesses();
- for (const auto &OtherIAClass : InvariantEquivClasses)
- if (std::get<0>(OtherIAClass) == BasePtrOriginBasePtrSCEV)
- preloadInvariantEquivClass(OtherIAClass);
- }
+ if (const auto *BaseIAClass = S.lookupInvariantEquivClass(SAI->getBasePtr()))
+ preloadInvariantEquivClass(*BaseIAClass);
Instruction *AccInst = MA->getAccessInstruction();
Type *AccInstTy = AccInst->getType();
diff --git a/polly/test/Isl/CodeGen/inv-load-lnt-crash-wrong-order-3.ll b/polly/test/Isl/CodeGen/inv-load-lnt-crash-wrong-order-3.ll
new file mode 100644
index 00000000000..9c52862d51d
--- /dev/null
+++ b/polly/test/Isl/CodeGen/inv-load-lnt-crash-wrong-order-3.ll
@@ -0,0 +1,73 @@
+; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s
+;
+; This crashed our codegen at some point, verify it runs through
+;
+; CHECK: polly.start
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+%struct.colocated_params = type { i32, i32, i32, [6 x [33 x i64]], i8***, i64***, i16****, i8**, [6 x [33 x i64]], i8***, i64***, i16****, i8**, [6 x [33 x i64]], i8***, i64***, i16****, i8**, i8, i8** }
+%struct.storable_picture9 = type { i32, i32, i32, i32, i32, [50 x [6 x [33 x i64]]], [50 x [6 x [33 x i64]]], [50 x [6 x [33 x i64]]], [50 x [6 x [33 x i64]]], i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i16**, i16***, i8*, i16**, i8***, i64***, i64***, i16****, i8**, i8**, %struct.storable_picture9*, %struct.storable_picture9*, %struct.storable_picture9*, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [2 x i32], i32, %struct.DecRefPicMarking_s*, i32 }
+%struct.DecRefPicMarking_s = type { i32, i32, i32, i32, i32, %struct.DecRefPicMarking_s* }
+
+; Function Attrs: nounwind uwtable
+define void @compute_colocated(%struct.colocated_params* %p) #0 {
+entry:
+ %tmp = load %struct.storable_picture9*, %struct.storable_picture9** undef, align 8
+ br label %for.body.393
+
+for.body.393: ; preds = %if.end.549, %entry
+ br i1 undef, label %if.then.397, label %if.else.643
+
+if.then.397: ; preds = %for.body.393
+ %ref_idx456 = getelementptr inbounds %struct.storable_picture9, %struct.storable_picture9* %tmp, i64 0, i32 36
+ %tmp1 = load i8***, i8**** %ref_idx456, align 8
+ %tmp2 = load i8**, i8*** %tmp1, align 8
+ %arrayidx458 = getelementptr inbounds i8*, i8** %tmp2, i64 0
+ %tmp3 = load i8*, i8** %arrayidx458, align 8
+ %arrayidx459 = getelementptr inbounds i8, i8* %tmp3, i64 0
+ %tmp4 = load i8, i8* %arrayidx459, align 1
+ %cmp461 = icmp eq i8 %tmp4, -1
+ br i1 %cmp461, label %if.then.463, label %if.else.476
+
+if.then.463: ; preds = %if.then.397
+ br label %if.end.501
+
+if.else.476: ; preds = %if.then.397
+ %ref_id491 = getelementptr inbounds %struct.storable_picture9, %struct.storable_picture9* %tmp, i64 0, i32 38
+ %tmp5 = load i64***, i64**** %ref_id491, align 8
+ br label %if.end.501
+
+if.end.501: ; preds = %if.else.476, %if.then.463
+ %tmp6 = load i8***, i8**** %ref_idx456, align 8
+ %arrayidx505 = getelementptr inbounds i8**, i8*** %tmp6, i64 1
+ %tmp7 = load i8**, i8*** %arrayidx505, align 8
+ %arrayidx506 = getelementptr inbounds i8*, i8** %tmp7, i64 0
+ %tmp8 = load i8*, i8** %arrayidx506, align 8
+ %arrayidx507 = getelementptr inbounds i8, i8* %tmp8, i64 0
+ %tmp9 = load i8, i8* %arrayidx507, align 1
+ %cmp509 = icmp eq i8 %tmp9, -1
+ %ref_idx514 = getelementptr inbounds %struct.colocated_params, %struct.colocated_params* %p, i64 0, i32 4
+ %tmp10 = load i8***, i8**** %ref_idx514, align 8
+ %arrayidx515 = getelementptr inbounds i8**, i8*** %tmp10, i64 1
+ %tmp11 = load i8**, i8*** %arrayidx515, align 8
+ %arrayidx516 = getelementptr inbounds i8*, i8** %tmp11, i64 0
+ %tmp12 = load i8*, i8** %arrayidx516, align 8
+ %arrayidx517 = getelementptr inbounds i8, i8* %tmp12, i64 0
+ br i1 %cmp509, label %if.then.511, label %if.else.524
+
+if.then.511: ; preds = %if.end.501
+ br label %if.end.549
+
+if.else.524: ; preds = %if.end.501
+ store i8 %tmp9, i8* %arrayidx517, align 1
+ %ref_id539 = getelementptr inbounds %struct.storable_picture9, %struct.storable_picture9* %tmp, i64 0, i32 38
+ %tmp13 = load i64***, i64**** %ref_id539, align 8
+ br label %if.end.549
+
+if.end.549: ; preds = %if.else.524, %if.then.511
+ br label %for.body.393
+
+if.else.643: ; preds = %for.body.393
+ unreachable
+}
OpenPOWER on IntegriCloud