[polly] r360454 - [ZoneAlgo] Fix PHI inconsistency in invalid contexts.

Eli Friedman via llvm-commits llvm-commits at lists.llvm.org
Thu May 16 16:01:43 PDT 2019


This is causing a bunch of crashes on the polly AOSP buildbot (http://lab.llvm.org:8011/builders/aosp-O3-polly-before-vectorizer-unprofitable ).  I'm seeing an IR verifier failure: "PHINode should have one entry for each predecessor of its parent basic block".

Testcase attached.  Reproduce with "opt -polly-delicm -polly-codegen -polly-process-unprofitable"

-Eli

> -----Original Message-----
> From: llvm-commits <llvm-commits-bounces at lists.llvm.org> On Behalf Of
> Michael Kruse via llvm-commits
> Sent: Friday, May 10, 2019 11:38 AM
> To: llvm-commits at lists.llvm.org
> Subject: [EXT] [polly] r360454 - [ZoneAlgo] Fix PHI inconsistency in invalid
> contexts.
> 
> Author: meinersbur
> Date: Fri May 10 11:38:13 2019
> New Revision: 360454
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=360454&view=rev
> Log:
> [ZoneAlgo] Fix PHI inconsistency in invalid contexts.
> 
> PHI nodes (reads) could point to multiple instances of predecessor
> blocks (PHI writes) when in an invalid context. Fix by removing PHI
> instances that are in an invalid or ouside assumed context.
> 
> This fixes llvm.org/PR41656.
> 
> Added:
>     polly/trunk/test/DeLICM/pr41656.ll
> Modified:
>     polly/trunk/include/polly/Support/ISLTools.h
>     polly/trunk/lib/Support/ISLTools.cpp
>     polly/trunk/lib/Transform/ZoneAlgo.cpp
>     polly/trunk/test/DeLICM/reduction_looprotate_hoisted.ll
>     polly/trunk/test/ScopInfo/stmt_with_read_but_without_sideffect.ll
> 
> Modified: polly/trunk/include/polly/Support/ISLTools.h
> URL: http://llvm.org/viewvc/llvm-
> project/polly/trunk/include/polly/Support/ISLTools.h?rev=360454&r1=360453&r
> 2=360454&view=diff
> =================================================================
> =============
> --- polly/trunk/include/polly/Support/ISLTools.h (original)
> +++ polly/trunk/include/polly/Support/ISLTools.h Fri May 10 11:38:13 2019
> @@ -463,6 +463,21 @@ isl::union_map applyDomainRange(isl::uni
>  /// @return { Domain[] -> Range[] }
>  isl::map intersectRange(isl::map Map, isl::union_set Range);
> 
> +/// Subtract the parameter space @p Params from @p Map.
> +/// This is akin to isl::map::intersect_params.
> +///
> +/// Example:
> +///   subtractParams(
> +///     { [i] -> [i] },
> +///     [x] -> { : x < 0 }
> +///   ) = [x] -> { [i] -> [i] : x >= 0 }
> +///
> +/// @param Map    Remove the conditions of @p Params from this map.
> +/// @param Params Parameter set to subtract.
> +///
> +/// @param The map with the parameter conditions removed.
> +isl::map subtractParams(isl::map Map, isl::set Params);
> +
>  /// If @p PwAff maps to a constant, return said constant. If @p Max/@p Min, it
>  /// can also be a piecewise constant and it would return the
> minimum/maximum
>  /// value. Otherwise, return NaN.
> 
> Modified: polly/trunk/lib/Support/ISLTools.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/polly/trunk/lib/Support/ISLTools.cpp?rev=360454&r1=360453&r2=3604
> 54&view=diff
> =================================================================
> =============
> --- polly/trunk/lib/Support/ISLTools.cpp (original)
> +++ polly/trunk/lib/Support/ISLTools.cpp Fri May 10 11:38:13 2019
> @@ -507,6 +507,12 @@ isl::map polly::intersectRange(isl::map
>    return Map.intersect_range(RangeSet);
>  }
> 
> +isl::map polly::subtractParams(isl::map Map, isl::set Params) {
> +  auto MapSpace = Map.get_space();
> +  auto ParamsMap = isl::map::universe(MapSpace).intersect_params(Params);
> +  return Map.subtract(ParamsMap);
> +}
> +
>  isl::val polly::getConstant(isl::pw_aff PwAff, bool Max, bool Min) {
>    assert(!Max || !Min); // Cannot return min and max at the same time.
>    isl::val Result;
> 
> Modified: polly/trunk/lib/Transform/ZoneAlgo.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/polly/trunk/lib/Transform/ZoneAlgo.cpp?rev=360454&r1=360453&r2=3
> 60454&view=diff
> =================================================================
> =============
> --- polly/trunk/lib/Transform/ZoneAlgo.cpp (original)
> +++ polly/trunk/lib/Transform/ZoneAlgo.cpp Fri May 10 11:38:13 2019
> @@ -563,6 +563,11 @@ isl::union_map ZoneAlgorithm::computePer
> 
>    // { DomainPHIRead[] -> Scatter[] }
>    isl::map PHIWriteTimes = BeforeRead.intersect_range(WriteTimes);
> +
> +  // Remove instances outside the context.
> +  PHIWriteTimes = PHIWriteTimes.intersect_params(S->getAssumedContext());
> +  PHIWriteTimes = subtractParams(PHIWriteTimes, S->getInvalidContext());
> +
>    isl::map LastPerPHIWrites = PHIWriteTimes.lexmax();
> 
>    // { DomainPHIRead[] -> DomainPHIWrite[] }
> 
> Added: polly/trunk/test/DeLICM/pr41656.ll
> URL: http://llvm.org/viewvc/llvm-
> project/polly/trunk/test/DeLICM/pr41656.ll?rev=360454&view=auto
> =================================================================
> =============
> --- polly/trunk/test/DeLICM/pr41656.ll (added)
> +++ polly/trunk/test/DeLICM/pr41656.ll Fri May 10 11:38:13 2019
> @@ -0,0 +1,89 @@
> +; RUN: opt %loadPolly -polly-delicm -analyze < %s | FileCheck %s
> +;
> +; llvm.org/PR41656
> +;
> +; This test case has an InvalidContext such that part of the predecessors
> +; of for.body.us.i lie within the invalid context. This causes a
> +; consistency check withing the invalid context of PR41656 to fail.
> +;
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +
> +define dso_local void @main() local_unnamed_addr #0 {
> +entry:
> +  %call24 = tail call i32 @av_get_channel_layout_nb_channels() #2
> +  br label %if.end30
> +
> +if.end30:                                         ; preds = %entry
> +  br i1 undef, label %if.then40, label %do.body.preheader
> +
> +do.body.preheader:                                ; preds = %if.end30
> +  %idx.ext.i = sext i32 %call24 to i64
> +  %wide.trip.count.i = zext i32 %call24 to i64
> +  %0 = load double*, double** undef, align 8, !tbaa !1
> +  br label %for.body.us.preheader.i
> +
> +if.then40:                                        ; preds = %if.end30
> +  unreachable
> +
> +for.body.us.preheader.i:                          ; preds = %do.body.preheader
> +  br i1 false, label %for.body.us.i.us, label %for.body.us.i
> +
> +for.body.us.i.us:                                 ; preds = %for.body.us.preheader.i
> +  br label %fill_samples.exit
> +
> +for.body.us.i:                                    ; preds = %for.cond2.for.end_crit_edge.us.i,
> %for.body.us.preheader.i
> +  %t.1 = phi double [ undef, %for.cond2.for.end_crit_edge.us.i ], [
> 0.000000e+00, %for.body.us.preheader.i ]
> +  %i.05.us.i = phi i32 [ %inc8.us.i, %for.cond2.for.end_crit_edge.us.i ], [ 0,
> %for.body.us.preheader.i ]
> +  %dstp.03.us.i = phi double* [ %add.ptr.us.i, %for.cond2.for.end_crit_edge.us.i
> ], [ %0, %for.body.us.preheader.i ]
> +  %mul.us.i = fmul nsz double %t.1, 0x40A59933FC6A96C1
> +  %1 = call nsz double @llvm.sin.f64(double %mul.us.i) #2
> +  store double %1, double* %dstp.03.us.i, align 8, !tbaa !5
> +  %2 = bitcast double* %dstp.03.us.i to i64*
> +  br label %for.body5.us.for.body5.us_crit_edge.i
> +
> +for.body5.us.for.body5.us_crit_edge.i:            ; preds =
> %for.body5.us.for.body5.us_crit_edge.i.for.body5.us.for.body5.us_crit_edge.i_
> crit_edge, %for.body.us.i
> +  %indvars.iv.next.i66 = phi i64 [ 2, %for.body.us.i ], [ %indvars.iv.next.i,
> %for.body5.us.for.body5.us_crit_edge.i.for.body5.us.for.body5.us_crit_edge.i_
> crit_edge ]
> +  %indvars.iv.next.i = add nuw nsw i64 %indvars.iv.next.i66, 1
> +  %exitcond.i = icmp eq i64 %indvars.iv.next.i, %wide.trip.count.i
> +  br i1 %exitcond.i, label %for.cond2.for.end_crit_edge.us.i, label
> %for.body5.us.for.body5.us_crit_edge.i.for.body5.us.for.body5.us_crit_edge.i_
> crit_edge
> +
> +for.body5.us.for.body5.us_crit_edge.i.for.body5.us.for.body5.us_crit_edge.i_c
> rit_edge: ; preds = %for.body5.us.for.body5.us_crit_edge.i
> +  %.pre10.i.pre = load i64, i64* %2, align 8, !tbaa !5
> +  br label %for.body5.us.for.body5.us_crit_edge.i
> +
> +for.cond2.for.end_crit_edge.us.i:                 ; preds =
> %for.body5.us.for.body5.us_crit_edge.i
> +  %add.ptr.us.i = getelementptr inbounds double, double* %dstp.03.us.i, i64
> %idx.ext.i
> +  %inc8.us.i = add nuw nsw i32 %i.05.us.i, 1
> +  %exitcond7.i = icmp eq i32 %inc8.us.i, 1024
> +  br i1 %exitcond7.i, label %fill_samples.exit, label %for.body.us.i
> +
> +fill_samples.exit:                                ; preds = %for.cond2.for.end_crit_edge.us.i,
> %for.body.us.i.us
> +  ret void
> +}
> +
> +declare dso_local i32 @av_get_channel_layout_nb_channels()
> local_unnamed_addr #0
> +
> +; Function Attrs: nounwind readnone speculatable
> +declare double @llvm.sin.f64(double) #1
> +
> +attributes #0 = { "use-soft-float"="false" }
> +attributes #1 = { nounwind readnone speculatable }
> +attributes #2 = { nounwind }
> +
> +!llvm.ident = !{!0}
> +
> +!0 = !{!"clang version 9.0.0 (https://github.com/llvm/llvm-project.git
> 2436237895b70ed44cf256f67eb2f74e147eb559)"}
> +!1 = !{!2, !2, i64 0}
> +!2 = !{!"any pointer", !3, i64 0}
> +!3 = !{!"omnipotent char", !4, i64 0}
> +!4 = !{!"Simple C/C++ TBAA"}
> +!5 = !{!6, !6, i64 0}
> +!6 = !{!"double", !3, i64 0}
> +
> +
> +; Only write to scalar if call24 >= 3 (i.e. not in invalid context)
> +; Since it should be never executed otherwise, the condition is not strictly
> necessary.
> +; CHECK:          Stmt_for_body_us_preheader_i
> +; CHECK-NEXT:            MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
> +; CHECK-NEXT:                 [call24] -> { Stmt_for_body_us_preheader_i[] ->
> MemRef_t_1__phi[] };
> +; CHECK-NEXT:            new: [call24] -> { Stmt_for_body_us_preheader_i[] ->
> MemRef1[0, 0] : call24 >= 3 };
> 
> Modified: polly/trunk/test/DeLICM/reduction_looprotate_hoisted.ll
> URL: http://llvm.org/viewvc/llvm-
> project/polly/trunk/test/DeLICM/reduction_looprotate_hoisted.ll?rev=360454&
> r1=360453&r2=360454&view=diff
> =================================================================
> =============
> --- polly/trunk/test/DeLICM/reduction_looprotate_hoisted.ll (original)
> +++ polly/trunk/test/DeLICM/reduction_looprotate_hoisted.ll Fri May 10
> 11:38:13 2019
> @@ -70,7 +70,7 @@ return:
>  ; CHECK-NEXT:     Stmt_reduction_preheader
>  ; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
>  ; CHECK-NEXT:                 [Start] -> { Stmt_reduction_preheader[i0] ->
> MemRef_phi__phi[] };
> -; CHECK-NEXT:            new: [Start] -> { Stmt_reduction_preheader[i0] ->
> MemRef_A[i0] };
> +; CHECK-NEXT:            new: [Start] -> { Stmt_reduction_preheader[i0] ->
> MemRef_A[i0] : Start >= 2147483648 or Start <= 2147483646 };
>  ; CHECK-NEXT:     Stmt_reduction_for
>  ; CHECK-NEXT:             ReadAccess :=    [Reduction Type: NONE] [Scalar: 1]
>  ; CHECK-NEXT:                 [Start] -> { Stmt_reduction_for[i0, i1] ->
> MemRef_phi__phi[] };
> 
> Modified: polly/trunk/test/ScopInfo/stmt_with_read_but_without_sideffect.ll
> URL: http://llvm.org/viewvc/llvm-
> project/polly/trunk/test/ScopInfo/stmt_with_read_but_without_sideffect.ll?rev
> =360454&r1=360453&r2=360454&view=diff
> =================================================================
> =============
> --- polly/trunk/test/ScopInfo/stmt_with_read_but_without_sideffect.ll (original)
> +++ polly/trunk/test/ScopInfo/stmt_with_read_but_without_sideffect.ll Fri May
> 10 11:38:13 2019
> @@ -86,7 +86,7 @@ for.inc.1:
>  ; CHECK-NEXT:     Stmt_if_else_1_last
>  ; CHECK-NEXT:             MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]
>  ; CHECK-NEXT:                 [p_0] -> { Stmt_if_else_1_last[i0] ->
> MemRef_min_1_1__phi[] };
> -; CHECK-NEXT:            new: [p_0] -> { Stmt_if_else_1_last[i0] -> MemRef_ath[i0]
> };
> +; CHECK-NEXT:            new: [p_0] -> { Stmt_if_else_1_last[i0] ->
> MemRef_ath[i0] : p_0 <= 576460752303423487 };
>  ; CHECK-NEXT:     Stmt_for_inc_1
>  ; CHECK-NEXT:             ReadAccess :=       [Reduction Type: NONE] [Scalar: 1]
>  ; CHECK-NEXT:                 [p_0] -> { Stmt_for_inc_1[i0] ->
> MemRef_min_1_1__phi[] };
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
-------------- next part --------------
A non-text attachment was scrubbed...
Name: polly-crash-20190516.ll
Type: application/octet-stream
Size: 880 bytes
Desc: polly-crash-20190516.ll
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190516/ca12b61e/attachment.obj>


More information about the llvm-commits mailing list