<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I reverted this per Gerolf’s request in r324958.<div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Feb 12, 2018, at 3:05 PM, Eric Christopher via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">It fails with clang on linux as well.<div class=""><br class=""></div><div class="">Also, is there no way to do it outside of a builtin?</div><div class=""><br class=""></div><div class="">Probably best to revert for now :)</div><div class=""><br class=""></div><div class="">-eric<br class=""><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Mon, Feb 12, 2018 at 2:37 PM Craig Topper via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">I'm getting a compile eror after this change. It also doesn't seem portable to MSVC<div class=""><br class=""></div><div class=""><div class="">lib/Transforms/Scalar/LoopStrengthReduce.cpp:3944:86: error: cannot initialize a parameter of type 'long long *' with an rvalue of type 'int64_t *' (aka 'long *')</div></div></div><div dir="ltr" class=""><div class=""><div class="">    if (__builtin_saddll_overflow(Imms.begin()->first, std::prev(Imms.end())->first, &Res))</div></div></div><div class="gmail_extra"><br clear="all" class=""><div class=""><div class="m_-3116658983412943037gmail_signature" data-smartmail="gmail_signature">~Craig</div></div></div><div class="gmail_extra">
<br class=""><div class="gmail_quote">On Mon, Feb 12, 2018 at 1:49 PM, Gerolf Hoflehner via llvm-commits <span dir="ltr" class=""><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ghoflehner<br class="">
Date: Mon Feb 12 13:49:32 2018<br class="">
New Revision: 324943<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=324943&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=324943&view=rev</a><br class="">
Log:<br class="">
[LSR] Avoid UB overflow when examining reuse opportunities<br class="">
<br class="">
Added:<br class="">
    llvm/trunk/test/CodeGen/X86/loop-strength-reduce-overflow-check.ll<br class="">
Modified:<br class="">
    llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<br class="">
<br class="">
Modified: llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=324943&r1=324942&r2=324943&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp?rev=324943&r1=324942&r2=324943&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp (original)<br class="">
+++ llvm/trunk/lib/Transforms/Scalar/LoopStrengthReduce.cpp Mon Feb 12 13:49:32 2018<br class="">
@@ -3939,6 +3939,11 @@ void LSRInstance::GenerateCrossUseConsta<br class="">
     if (Imms.size() == 1)<br class="">
       continue;<br class="">
<br class="">
+    // UB: Check for overflow<br class="">
+    int64_t Res;<br class="">
+    if (__builtin_saddll_overflow(Imms.begin()->first, std::prev(Imms.end())->first, &Res))<br class="">
+      continue;<br class="">
+<br class="">
     DEBUG(dbgs() << "Generating cross-use offsets for " << *Reg << ':';<br class="">
           for (const auto &Entry : Imms)<br class="">
             dbgs() << ' ' << Entry.first;<br class="">
<br class="">
Added: llvm/trunk/test/CodeGen/X86/loop-strength-reduce-overflow-check.ll<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/loop-strength-reduce-overflow-check.ll?rev=324943&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/loop-strength-reduce-overflow-check.ll?rev=324943&view=auto</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/test/CodeGen/X86/loop-strength-reduce-overflow-check.ll (added)<br class="">
+++ llvm/trunk/test/CodeGen/X86/loop-strength-reduce-overflow-check.ll Mon Feb 12 13:49:32 2018<br class="">
@@ -0,0 +1,26 @@<br class="">
+; RUN: llc < %s -O1 -mtriple=x86_64-unknown-unknown<br class="">
+<br class="">
+; LSR has to check for overflow to avoid UB when it examines reuse opportunities<br class="">
+; Clang built with UBSan would expose the issue in this test case<br class="">
+<br class="">
+define void @main() {<br class="">
+bb:<br class="">
+  br label %bb1<br class="">
+<br class="">
+bb1:                                              ; preds = %bb1, %bb<br class="">
+  %tmp = phi i64 [ 248268322795906120, %bb ], [ %tmp10, %bb1 ]<br class="">
+  %tmp2 = sub i64 %tmp, 248268322795906120<br class="">
+  %tmp3 = getelementptr i8, i8* undef, i64 %tmp2<br class="">
+  %tmp4 = sub i64 %tmp, 248268322795906120<br class="">
+  %tmp5 = getelementptr i8, i8* undef, i64 %tmp4<br class="">
+  %tmp6 = getelementptr i8, i8* %tmp5, i64 -9086989864993762928<br class="">
+  %tmp7 = load i8, i8* %tmp6, align 1<br class="">
+  %tmp8 = getelementptr i8, i8* %tmp3, i64 -1931736422337600660<br class="">
+  store i8 undef, i8* %tmp8<br class="">
+  %tmp9 = add i64 %tmp, 248268322795906121<br class="">
+  %tmp10 = add i64 %tmp9, -248268322795906120<br class="">
+  br i1 undef, label %bb11, label %bb1<br class="">
+<br class="">
+bb11:                                             ; preds = %bb1<br class="">
+  ret void<br class="">
+}<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
llvm-commits mailing list<br class="">
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="">
</blockquote></div><br class=""></div>
_______________________________________________<br class="">
llvm-commits mailing list<br class="">
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="">
</blockquote></div></div></div>
_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits<br class=""></div></blockquote></div><br class=""></div></body></html>