[PATCH] D45649: [Polly][ScopDetect] Reject loop with multiple exit blocks.

Michael Kruse via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 13 17:44:00 PDT 2018


Meinersbur created this revision.
Meinersbur added reviewers: grosser, jdoerfert, efriedma.
Meinersbur added a project: Polly.
Herald added a reviewer: bollu.

The current statement domain derivation algorithm does not (always) consider that different exit blocks of a loop can have different conditions to be reached.

>From the code

    for (int i = n; ; i-=2) {
      if (i <= 0) goto even;
      if (i <= 1) goto odd;
      A[i] = i;
    }
  even:
    A[0] = 42;
    return;
  odd:
    A[1] = 21;
    return;

Polly currently derives the following domains:

  Stmt_even_critedge
      Domain :=
          [n] -> { Stmt_even_critedge[] };
  Stmt_odd
      Domain :=
          [n] -> { Stmt_odd[] : (1 + n) mod 2 = 0 and n > 0 };

while the domain for the odd case is correct, Stmt_even is assumed to be executed unconditionally, which is obviously wrong. While projecting out the loop dimension in `adjustDomainDimensions`, it does not consider that there are other exit condition that have matched before.

I don't know a how to fix this without changing a lot of code. Therefore I suggest to disable multiple loop exits to fix the miscompile of test-suite's uuencode.

The odd condition is transformed by LLVM to `%cmp1 = icmp eq i64 %indvars.iv, 1` such that the project_out in `adjustDomainDimensions` indeed only matches for odd `n` (using this condition only, we'd have an infinite loop otherwise).

The even condition manifests as `%cmp = icmp slt i64 %indvars.iv, 3`. Because `buildDomainsWithBranchConstraints` does not consider other exit conditions, it has to assume that the induction variable will eventually be lower than 3 and taking this exit.

IMHO we need to reuse the algorithm that determines the number of iterations (`addLoopBoundsToHeaderDomain`) to determine which exit condition applies first. It has to happen in `buildDomainsWithBranchConstraints` because the result will need to propagate to successor BBs. Currently `addLoopBoundsToHeaderDomain` just look for union of all backedge conditions (which means leaving not the loop here). The patch in [[ llvm.org/PR35465 | PR35465 ]] changes it to look for exit conditions instead. This is required because there might be other exit conditions that do not alternatively go back to the loop header.


Repository:
  rPLO Polly

https://reviews.llvm.org/D45649

Files:
  include/polly/ScopDetectionDiagnostic.h
  lib/Analysis/ScopDetection.cpp
  lib/Analysis/ScopDetectionDiagnostic.cpp
  test/ScopDetect/index_from_unpredictable_loop.ll
  test/ScopDetect/index_from_unpredictable_loop2.ll
  test/ScopDetectionDiagnostics/loop_has_multiple_exits.ll
  test/ScopInfo/NonAffine/non_affine_region_guaranteed_non-entry.ll
  test/ScopInfo/complex-loop-nesting.ll
  test/ScopInfo/isl_trip_count_multiple_exiting_blocks.ll
  test/ScopInfo/loop-multiexit-succ-cond.ll
  test/ScopInfo/multiple_exiting_blocks.ll
  test/ScopInfo/multiple_exiting_blocks_two_loop.ll
  test/ScopInfo/schedule-const-post-dominator-walk-2.ll
  test/ScopInfo/schedule-const-post-dominator-walk.ll
  test/ScopInfo/switch-5.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D45649.142490.patch
Type: text/x-patch
Size: 37593 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180414/d9c99648/attachment.bin>


More information about the llvm-commits mailing list