[llvm-bugs] [Bug 28922] New: Unsigned wrap check conditions falling to original code

via llvm-bugs llvm-bugs at lists.llvm.org
Wed Aug 10 07:46:47 PDT 2016


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

            Bug ID: 28922
           Summary: Unsigned wrap check conditions falling to original
                    code
           Product: Polly
           Version: unspecified
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: normal
          Priority: P
         Component: Optimizer
          Assignee: polly-dev at googlegroups.com
          Reporter: chrisj at codeaurora.org
                CC: llvm-bugs at lists.llvm.org
    Classification: Unclassified

Created attachment 16927
  --> https://llvm.org/bugs/attachment.cgi?id=16927&action=edit
test case

> opt  -polly-process-unprofitable -polly-code-generator=isl -polly-ast -analyze test.ll

Consider the context check below,

:: isl ast :: foo4 :: %entry.split---%for.cond.cleanup

if (1 && 0 == (m >= n + 9223372036854775809 || n >= m + 9223372036854775808 ||
m == -9223372036854775808))
for (int c0 = 0; c0 < -m + n; c0 += 1)
  Stmt_for_body(c0);

else
{  /* original code */ }


Values 9223372036854775809 (0x8000000000000001) and 9223372036854775808
(8000000000000000) are already overflown and having addition operation with
them leads to the result being wrapped.

Hence this would lead to the context condition falling to the original code. On
the other hand, say if the condition were in form where there was no operation
with the max int values it would not wrap. i.e. if the condition were like (m -
n >= 9223372036854775809) or (n - m >= 9223372036854775808). 

> opt  -polly-process-unprofitable -polly-code-generator=isl  -polly-codegen -S  test.ll

--snip--
polly.split_new_and_old:                          ; preds = %entry
  %0 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %n, i64
-9223372036854775807) <===
  %.obit = extractvalue { i64, i1 } %0, 1
  %polly.overflow.state = or i1 false, %.obit
  %.res = extractvalue { i64, i1 } %0, 0
  %1 = icmp sge i64 %m, %.res
  %2 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %m, i64
-9223372036854775808) <===
  %.obit1 = extractvalue { i64, i1 } %2, 1
  %polly.overflow.state2 = or i1 %polly.overflow.state, %.obit1
  %.res3 = extractvalue { i64, i1 } %2, 0
  %3 = icmp sge i64 %n, %.res3
  %4 = or i1 %1, %3
  %5 = icmp eq i64 %m, -9223372036854775808
  %6 = or i1 %4, %5
  %7 = sext i1 %6 to i64
  %8 = icmp eq i64 0, %7
  %9 = and i1 true, %8
  %polly.rtc.overflown = xor i1 %polly.overflow.state2, true
  %polly.rtc.result = and i1 %9, %polly.rtc.overflown
  br i1 %polly.rtc.result, label %polly.start, label %entry.split
--snip--

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160810/06fa0e51/attachment.html>


More information about the llvm-bugs mailing list