diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 7efebe18dcc4..805b52318df0 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -2590,12 +2590,19 @@ void Scop::addInvariantLoads(ScopStmt &Stmt, MemoryAccessList &InvMAs) { for (MemoryAccess *MA : InvMAs) { Instruction *AccInst = MA->getAccessInstruction(); if (SE->isSCEVable(AccInst->getType())) { - isl_id *ParamId = getIdForParam(SE->getSCEV(AccInst)); - if (ParamId) { - int Dim = isl_set_find_dim_by_id(DomainCtx, isl_dim_param, ParamId); - DomainCtx = isl_set_eliminate(DomainCtx, isl_dim_param, Dim, 1); + SetVector Values; + for (const SCEV *Parameter : Parameters) { + Values.clear(); + findValues(Parameter, Values); + if (!Values.count(AccInst)) + continue; + + if (isl_id *ParamId = getIdForParam(Parameter)) { + int Dim = isl_set_find_dim_by_id(DomainCtx, isl_dim_param, ParamId); + DomainCtx = isl_set_eliminate(DomainCtx, isl_dim_param, Dim, 1); + isl_id_free(ParamId); + } } - isl_id_free(ParamId); } } diff --git a/polly/test/ScopInfo/invariant_load_zextended_in_own_execution_context.ll b/polly/test/ScopInfo/invariant_load_zextended_in_own_execution_context.ll new file mode 100644 index 000000000000..27a4134d5c1c --- /dev/null +++ b/polly/test/ScopInfo/invariant_load_zextended_in_own_execution_context.ll @@ -0,0 +1,31 @@ +; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -polly-codegen -analyze < %s +; +; CHECK: Execution Context: [p_0] -> { : } +; +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +@currpc = external global i32, align 4 +@inbuff = external global i8*, align 8 + +; Function Attrs: uwtable +define void @_Z13dotableswitchP9Classfile() { +entry: + br i1 undef, label %for.end, label %while.body + +while.body: ; preds = %while.body, %entry + store i8* undef, i8** @inbuff, align 8 + %0 = load i32, i32* @currpc, align 4 + %rem = and i32 %0, 3 + %tobool = icmp eq i32 %rem, 0 + br i1 %tobool, label %while.end, label %while.body + +while.end: ; preds = %while.body + br i1 undef, label %for.end, label %for.body + +for.body: ; preds = %for.body, %while.end + br label %for.body + +for.end: ; preds = %while.end, %entry + ret void +}