From 3b7ac0a691196cb4a242033a66dc42b3fb6eb499 Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Mon, 25 Jul 2016 12:40:59 +0000 Subject: [PATCH] [GSoC] Do not process SCoPs with infeasible runtime context Do not process SCoPs with infeasible runtime context in the new ScopInfoWrapperPass. Do not compute dependences for such SCoPs in the new DependenceInfoWrapperPass. Patch by Utpal Bora Differential Revision: https://reviews.llvm.org/D22402 llvm-svn: 276631 --- polly/lib/Analysis/DependenceInfo.cpp | 4 +- polly/lib/Analysis/ScopInfo.cpp | 5 +- polly/test/DependenceInfo/infeasible_context.ll | 69 +++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 polly/test/DependenceInfo/infeasible_context.ll diff --git a/polly/lib/Analysis/DependenceInfo.cpp b/polly/lib/Analysis/DependenceInfo.cpp index fc8c98e..aa5eadc 100644 --- a/polly/lib/Analysis/DependenceInfo.cpp +++ b/polly/lib/Analysis/DependenceInfo.cpp @@ -830,8 +830,10 @@ const Dependences &DependenceInfoWrapperPass::recomputeDependences( bool DependenceInfoWrapperPass::runOnFunction(Function &F) { auto &SI = getAnalysis(); - for (auto &It : SI) + for (auto &It : SI) { + assert(It.second && "Invalid SCoP object!"); recomputeDependences(It.second.get(), Dependences::AL_Access); + } return false; } diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 04d6cad..a569341 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -4273,8 +4273,11 @@ bool ScopInfoWrapperPass::runOnFunction(Function &F) { continue; ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE); + std::unique_ptr S = SB.getScop(); + if (!S) + continue; bool Inserted = - RegionToScopMap.insert(std::make_pair(R, SB.getScop())).second; + RegionToScopMap.insert(std::make_pair(R, std::move(S))).second; assert(Inserted && "Building Scop for the same region twice!"); (void)Inserted; } diff --git a/polly/test/DependenceInfo/infeasible_context.ll b/polly/test/DependenceInfo/infeasible_context.ll new file mode 100644 index 0000000..a111ed0 --- /dev/null +++ b/polly/test/DependenceInfo/infeasible_context.ll @@ -0,0 +1,69 @@ +; RUN: opt %loadPolly -polly-function-scops -analyze < %s \ +; RUN: | FileCheck %s -check-prefix=FUNC-SCOP +; RUN: opt %loadPolly -polly-function-dependences -analyze < %s \ +; RUN: | FileCheck %s -check-prefix=FUNC-DEPS +; +; FUNC-SCOP-NOT: Statement +; FUNC-DEPS-LABEL: Printing analysis 'Polly - Calculate dependences for all the SCoPs of a function' for function 'readgeo' +; FUNC-DEPS-NOT: RAW dependences +; +; Due to an infeasible run-time check, scop object is empty and we do not compute dependences. +; +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +%struct.tnode.1.7.13.67.121.175.217.307.325.337.349.367.379.391.433.445.667.727.733.739 = type { i32, i32, %struct.tnode.1.7.13.67.121.175.217.307.325.337.349.367.379.391.433.445.667.727.733.739*, %struct.tnode.1.7.13.67.121.175.217.307.325.337.349.367.379.391.433.445.667.727.733.739*, %struct.tnode.1.7.13.67.121.175.217.307.325.337.349.367.379.391.433.445.667.727.733.739*, %struct.tnode.1.7.13.67.121.175.217.307.325.337.349.367.379.391.433.445.667.727.733.739*, %struct.tnode.1.7.13.67.121.175.217.307.325.337.349.367.379.391.433.445.667.727.733.739*, i32, i32, %struct.plist.0.6.12.66.120.174.216.306.324.336.348.366.378.390.432.444.666.726.732.738* } +%struct.plist.0.6.12.66.120.174.216.306.324.336.348.366.378.390.432.444.666.726.732.738 = type { i32, %struct.plist.0.6.12.66.120.174.216.306.324.336.348.366.378.390.432.444.666.726.732.738* } + +@vFixedEdgeRoot = external global %struct.tnode.1.7.13.67.121.175.217.307.325.337.349.367.379.391.433.445.667.727.733.739*, align 8 +@hEdgeRoot = external global %struct.tnode.1.7.13.67.121.175.217.307.325.337.349.367.379.391.433.445.667.727.733.739*, align 8 + +; Function Attrs: nounwind uwtable +define void @readgeo() #0 { +entry: + %vx = alloca i32, align 4 + br label %if.end64 + +if.end64: ; preds = %entry + br label %for.body73 + +for.body73: ; preds = %for.inc216, %if.end64 + %v.0101 = phi i32 [ 0, %for.inc216 ], [ 1, %if.end64 ] + br i1 undef, label %if.then93, label %if.else + +if.then93: ; preds = %for.body73 + br label %for.inc216 + +if.else: ; preds = %for.body73 + br i1 undef, label %if.then111, label %if.end116 + +if.then111: ; preds = %if.else + br label %if.end116 + +if.end116: ; preds = %if.then111, %if.else + %rippleCount.2 = phi i32 [ 1, %if.then111 ], [ undef, %if.else ] + %rem11790 = and i32 %v.0101, 1 + %cmp118 = icmp eq i32 %rem11790, 0 + br i1 %cmp118, label %if.then120, label %if.else154 + +if.then120: ; preds = %if.end116 + call void @tinsert() + br label %if.end193 + +if.else154: ; preds = %if.end116 + call void @tinsert() + br label %if.end193 + +if.end193: ; preds = %if.else154, %if.then120 + %0 = load i32, i32* %vx, align 4 + br label %for.inc216 + +for.inc216: ; preds = %if.end193, %if.then93 + %rippleCount.3 = phi i32 [ undef, %if.then93 ], [ %rippleCount.2, %if.end193 ] + %ux.2 = phi i32 [ undef, %if.then93 ], [ %0, %if.end193 ] + br i1 undef, label %for.body73, label %for.end218 + +for.end218: ; preds = %for.inc216 + unreachable +} + +declare void @tinsert() -- 2.7.4