[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