[polly] r265775 - [FIX] Look through div & srem instructions in SCEVs

Tobias Grosser via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 8 09:41:11 PDT 2016


On 04/08/2016 12:25 PM, Johannes Doerfert via llvm-commits wrote:
> Author: jdoerfert
> Date: Fri Apr  8 05:25:58 2016
> New Revision: 265775
>
> URL: http://llvm.org/viewvc/llvm-project?rev=265775&view=rev
> Log:
> [FIX] Look through div & srem instructions in SCEVs
>
>    The findValues() function did not look through div & srem instructions
>    that were part of the argument SCEV. However, in different other
>    places we already look through it. This mismatch caused us to preload
>    values in the wrong order.

It seems one of these commits (265775, 265776, 265777) broke our 
parallel buildbot. I did not have time to reproduce this, but here is 
the link to the first failing build:
	
http://lab.llvm.org:8011/builders/perf-x86_64-penryn-O3-polly-parallel-fast/builds/17537

Best,
Tobias
>
>
> Added:
>      polly/trunk/test/Isl/CodeGen/scev-division-invariant-load.ll
> Modified:
>      polly/trunk/include/polly/Support/SCEVValidator.h
>      polly/trunk/lib/Analysis/ScopInfo.cpp
>      polly/trunk/lib/CodeGen/IslNodeBuilder.cpp
>      polly/trunk/lib/Support/SCEVValidator.cpp
>
> Modified: polly/trunk/include/polly/Support/SCEVValidator.h
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/Support/SCEVValidator.h?rev=265775&r1=265774&r2=265775&view=diff
> ==============================================================================
> --- polly/trunk/include/polly/Support/SCEVValidator.h (original)
> +++ polly/trunk/include/polly/Support/SCEVValidator.h Fri Apr  8 05:25:58 2016
> @@ -37,9 +37,11 @@ void findLoops(const llvm::SCEV *Expr,
>   /// @brief Find the values referenced by SCEVUnknowns in a given SCEV
>   /// expression.
>   ///
> -/// @param Expr The SCEV expression to scan for SCEVUnknowns.
> -/// @param Expr A vector into which the found values are inserted.
> -void findValues(const llvm::SCEV *Expr, llvm::SetVector<llvm::Value *> &Values);
> +/// @param Expr   The SCEV expression to scan for SCEVUnknowns.
> +/// @param SE     The ScalarEvolution analysis for this function.
> +/// @param Values A vector into which the found values are inserted.
> +void findValues(const llvm::SCEV *Expr, llvm::ScalarEvolution &SE,
> +                llvm::SetVector<llvm::Value *> &Values);
>
>   /// Returns true when the SCEV contains references to instructions within the
>   /// region.
>
> Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=265775&r1=265774&r2=265775&view=diff
> ==============================================================================
> --- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
> +++ polly/trunk/lib/Analysis/ScopInfo.cpp Fri Apr  8 05:25:58 2016
> @@ -3063,7 +3063,7 @@ void Scop::addInvariantLoads(ScopStmt &S
>         SetVector<Value *> Values;
>         for (const SCEV *Parameter : Parameters) {
>           Values.clear();
> -        findValues(Parameter, Values);
> +        findValues(Parameter, *SE, Values);
>           if (!Values.count(AccInst))
>             continue;
>
>
> Modified: polly/trunk/lib/CodeGen/IslNodeBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/IslNodeBuilder.cpp?rev=265775&r1=265774&r2=265775&view=diff
> ==============================================================================
> --- polly/trunk/lib/CodeGen/IslNodeBuilder.cpp (original)
> +++ polly/trunk/lib/CodeGen/IslNodeBuilder.cpp Fri Apr  8 05:25:58 2016
> @@ -304,7 +304,7 @@ void IslNodeBuilder::getReferencesInSubt
>     addReferencesFromStmtUnionSet(Schedule, References);
>
>     for (const SCEV *Expr : SCEVs) {
> -    findValues(Expr, Values);
> +    findValues(Expr, SE, Values);
>       findLoops(Expr, Loops);
>     }
>
> @@ -852,7 +852,7 @@ bool IslNodeBuilder::materializeValue(is
>       // check if any value refered to in ParamSCEV is an invariant load
>       // and if so make sure its equivalence class is preloaded.
>       SetVector<Value *> Values;
> -    findValues(ParamSCEV, Values);
> +    findValues(ParamSCEV, SE, Values);
>       for (auto *Val : Values) {
>
>         // Check if the value is an instruction in a dead block within the SCoP
>
> Modified: polly/trunk/lib/Support/SCEVValidator.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Support/SCEVValidator.cpp?rev=265775&r1=265774&r2=265775&view=diff
> ==============================================================================
> --- polly/trunk/lib/Support/SCEVValidator.cpp (original)
> +++ polly/trunk/lib/Support/SCEVValidator.cpp Fri Apr  8 05:25:58 2016
> @@ -560,21 +560,45 @@ void findLoops(const SCEV *Expr, SetVect
>
>   /// Find all values referenced in SCEVUnknowns.
>   class SCEVFindValues {
> +  ScalarEvolution &SE;
>     SetVector<Value *> &Values;
>
>   public:
> -  SCEVFindValues(SetVector<Value *> &Values) : Values(Values) {}
> +  SCEVFindValues(ScalarEvolution &SE, SetVector<Value *> &Values)
> +      : SE(SE), Values(Values) {}
>
>     bool follow(const SCEV *S) {
> -    if (const SCEVUnknown *Unknown = dyn_cast<SCEVUnknown>(S))
> +    const SCEVUnknown *Unknown = dyn_cast<SCEVUnknown>(S);
> +    if (!Unknown)
> +      return true;
> +
> +    Instruction *Inst = dyn_cast<Instruction>(Unknown->getValue());
> +    if (!Inst || (Inst->getOpcode() != Instruction::SRem &&
> +                  Inst->getOpcode() != Instruction::SDiv)) {
> +      Values.insert(Unknown->getValue());
> +      return false;
> +    }
> +
> +    auto *Dividend = SE.getSCEV(Inst->getOperand(1));
> +    if (!isa<SCEVConstant>(Dividend)) {
>         Values.insert(Unknown->getValue());
> -    return true;
> +      return false;
> +    }
> +
> +    auto *Divisor = SE.getSCEV(Inst->getOperand(0));
> +    SCEVFindValues FindValues(SE, Values);
> +    SCEVTraversal<SCEVFindValues> ST(FindValues);
> +    ST.visitAll(Dividend);
> +    ST.visitAll(Divisor);
> +
> +    return false;
>     }
>     bool isDone() { return false; }
>   };
>
> -void findValues(const SCEV *Expr, SetVector<Value *> &Values) {
> -  SCEVFindValues FindValues(Values);
> +void findValues(const SCEV *Expr, ScalarEvolution &SE,
> +                SetVector<Value *> &Values) {
> +  SCEVFindValues FindValues(SE, Values);
>     SCEVTraversal<SCEVFindValues> ST(FindValues);
>     ST.visitAll(Expr);
>   }
>
> Added: polly/trunk/test/Isl/CodeGen/scev-division-invariant-load.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/scev-division-invariant-load.ll?rev=265775&view=auto
> ==============================================================================
> --- polly/trunk/test/Isl/CodeGen/scev-division-invariant-load.ll (added)
> +++ polly/trunk/test/Isl/CodeGen/scev-division-invariant-load.ll Fri Apr  8 05:25:58 2016
> @@ -0,0 +1,51 @@
> +; RUN: opt %loadPolly -S -polly-codegen < %s
> +;
> +; Check that we generate valid code as we did not use the preloaded
> +; value of %tmp1 for the access function of the preloaded %tmp4.
> +;
> +; ModuleID = 'bug.ll'
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +
> +%struct.frame_store = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, %struct.picture*, %struct.picture*, %struct.picture* }
> +%struct.picture = type { i32, i32, i32, i32, i32, i32, [6 x [33 x i64]], [6 x [33 x i64]], [6 x [33 x i64]], [6 x [33 x i64]], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i16**, i16*, i16*, i16**, i16**, i16***, i8*, i16***, i64***, i64***, i16****, i8**, i8**, %struct.picture*, %struct.picture*, %struct.picture*, i32, i32, i32, i32, i32, i32, i32 }
> +
> +define void @dpb_split_field(%struct.frame_store* %fs) {
> +entry:
> +  br label %for.body544
> +
> +for.body544:                                      ; preds = %if.end908, %for.body544.lr.ph
> +  %indvars.iv87 = phi i64 [ 0, %entry ], [ %indvars.iv.next88, %if.end908 ]
> +  %tmp = phi %struct.picture* [ undef, %entry ], [ %tmp6, %if.end908 ]
> +  br label %land.lhs.true563
> +
> +land.lhs.true563:                                 ; preds = %for.body544
> +  %size_x551 = getelementptr inbounds %struct.picture, %struct.picture* %tmp, i64 0, i32 18
> +  %tmp1 = load i32, i32* %size_x551, align 8
> +  %div552 = sdiv i32 %tmp1, 16
> +  %tmp2 = trunc i64 %indvars.iv87 to i32
> +  %div554 = sdiv i32 %tmp2, 4
> +  %mul555 = mul i32 %div552, %div554
> +  %tmp9 = add i32 %mul555, 0
> +  %tmp10 = shl i32 %tmp9, 1
> +  %add559 = add i32 %tmp10, 0
> +  %idxprom564 = sext i32 %add559 to i64
> +  %mb_field566 = getelementptr inbounds %struct.picture, %struct.picture* %tmp, i64 0, i32 31
> +  %tmp3 = load i8*, i8** %mb_field566, align 8
> +  %arrayidx567 = getelementptr inbounds i8, i8* %tmp3, i64 %idxprom564
> +  %tmp4 = load i8, i8* %arrayidx567, align 1
> +  %tobool569 = icmp eq i8 %tmp4, 0
> +  br i1 %tobool569, label %if.end908, label %if.then570
> +
> +if.then570:                                       ; preds = %land.lhs.true563
> +  %frame = getelementptr inbounds %struct.frame_store, %struct.frame_store* %fs, i64 0, i32 10
> +  %tmp5 = load %struct.picture*, %struct.picture** %frame, align 8
> +  br label %if.end908
> +
> +if.end908:                                        ; preds = %if.then570, %land.lhs.true563
> +  %tmp6 = phi %struct.picture* [ %tmp, %land.lhs.true563 ], [ undef, %if.then570 ]
> +  %indvars.iv.next88 = add nuw nsw i64 %indvars.iv87, 1
> +  br i1 undef, label %for.body544, label %for.inc912
> +
> +for.inc912:                                       ; preds = %if.end908
> +  ret void
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>



More information about the llvm-commits mailing list