https://llvm.org/bugs/show_bug.cgi?id=25507

            Bug ID: 25507
           Summary: [Polly] Unnecessarily complicated schedule
           Product: Projects
           Version: unspecified
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Polly
          Assignee: polly-...@googlegroups.com
          Reporter: l...@meinersbur.de
                CC: llvm-bugs@lists.llvm.org
    Classification: Unclassified

Created attachment 15279
  --> https://llvm.org/bugs/attachment.cgi?id=15279&action=edit
Extract from MultiSource/Benchmark/Ptrdist/bc/number.c

$ clang loopschedule.c -c -O3 -mllvm -polly -mllvm -debug -mllvm
-debug-only=polly-ast -mllvm -polly-process-unprofitable

emits the following schedule for the loop "while.body => while.end"

      for (int c0 = 0; c0 < min(n2, n1); c0 += 1)
        Stmt_while_body(c0);
      if (n1 <= 0) {
        Stmt_while_body(0);
      } else if (n2 <= 0)
        Stmt_while_body(0);

    Context:
    [n2, n1] -> {  : n2 >= -2147483648 and n2 <= 2147483647 and n1 >=
-2147483648 and n1 <= 2147483647 }
    Assumed Context:
    [n2, n1] -> {  :  }
    Boundary Context:
    [n2, n1] -> {  :  }
    Statements
        Stmt_while_body
            Domain :=
                [n2, n1] -> { Stmt_while_body[i0] : i0 >= 0 and i0 <= -1 + n1
and i0 <= -1 + n2; Stmt_while_body[0] : n1 <= 0 or (n2 <= 0 and n1 >= 1) };



The initial loop condition is hoisted outside of the scop, i.e

if ((n1 > 0) && (n2 > 0)) {
  // Scop
}


1) The generated schedule has two conditions (n1 <= 0) and (n2 <= 0) that are
never evaluated code, i.e. 2/3 of the generated code is effectively dead.


2) After passing the hoisted initial condition, the BasicBlock while.body must
be executed at least once before the condition is checked again. Still, CodeGen
inserts a second initial check into "polly.loop_if". It results into an
additional branch that is not optimized away by later LLVM passes and
potentially "undef" to appear after -mem2reg.


We might analyze the hoisted condition to translate into additional assumptions
(Here: n1 > 0 && n2 > 0). Unfortunately, there is no LLVM analysis to tell the
the possible range of a value.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to