<div dir="ltr">I already committed a fix. Did you still see the failure?<div><br></div><div>David</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 2, 2017 at 5:33 AM, Dimitry Andric <span dir="ltr"><<a href="mailto:dimitry@andric.com" target="_blank">dimitry@andric.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Minimized test case:<br>
<br>
/* clang -cc1 -triple x86_64 -S -O1 test-int128.c */<br>
__int128 a;<br>
void c();<br>
void b() {<br>
  if (a == -1)<br>
    c();<br>
}<br>
<br>
Results in:<br>
<br>
Assertion failed: (getActiveBits() <= 64 && "Too many bits for uint64_t"), function getZExtValue, file include/llvm/ADT/APInt.h, line 1526.<br>
<br>
Program received signal SIGABRT, Aborted.<br>
0x00000008046815da in thr_kill () from /lib/libc.so.7<br>
(gdb) bt<br>
#0  0x00000008046815da in thr_kill () from /lib/libc.so.7<br>
#1  0x00000008046815a4 in raise () from /lib/libc.so.7<br>
#2  0x0000000804681519 in abort () from /lib/libc.so.7<br>
#3  0x00000008046fd371 in __assert () from /lib/libc.so.7<br>
#4  0x000000000112cce0 in lowerExpectIntrinsic(llvm::<wbr>Function&) ()<br>
#5  0x0000000000e41b8a in llvm::FPPassManager::<wbr>runOnFunction(llvm::Function&) ()<br>
#6  0x0000000000e41319 in llvm::legacy::<wbr>FunctionPassManagerImpl::run(<wbr>llvm::Function&) ()<br>
#7  0x0000000000e4119c in llvm::legacy::<wbr>FunctionPassManager::run(llvm:<wbr>:Function&) ()<br>
#8  0x00000000013d0dac in clang::EmitBackendOutput(<wbr>clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*, clang::BackendAction, std::__1::unique_ptr<llvm::<wbr>raw_pwrite_stream, std::__1::default_delete<llvm:<wbr>:raw_pwrite_stream> >) ()<br>
#9  0x0000000001a7c2ca in clang::BackendConsumer::<wbr>HandleTranslationUnit(clang::<wbr>ASTContext&) ()<br>
#10 0x0000000001d2cbe2 in clang::ParseAST(clang::Sema&, bool, bool) ()<br>
#11 0x000000000175d99c in clang::FrontendAction::<wbr>Execute() ()<br>
#12 0x0000000001725c31 in clang::CompilerInstance::<wbr>ExecuteAction(clang::<wbr>FrontendAction&) ()<br>
#13 0x00000000017dadb3 in clang::<wbr>ExecuteCompilerInvocation(<wbr>clang::CompilerInstance*) ()<br>
#14 0x0000000000721972 in cc1_main(llvm::ArrayRef<char const*>, char const*, void*) ()<br>
#15 0x000000000071fbc9 in main ()<br>
<span class="HOEnZb"><font color="#888888"><br>
-Dimitry<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
> On 2 Jun 2017, at 00:59, Xinliang David Li via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
><br>
> working on it.<br>
><br>
> On Thu, Jun 1, 2017 at 3:37 PM, Vedant Kumar <<a href="mailto:vsk@apple.com">vsk@apple.com</a>> wrote:<br>
> Hi David,<br>
><br>
> I think this commit is causing a failure in the compiler-rt tests:<br>
> <a href="http://green.lab.llvm.org/green//job/clang-stage1-cmake-RA-expensive/6811" rel="noreferrer" target="_blank">http://green.lab.llvm.org/<wbr>green//job/clang-stage1-cmake-<wbr>RA-expensive/6811</a><br>
><br>
> Could you take a look?<br>
><br>
> thanks,<br>
> vedant<br>
><br>
>> On Jun 1, 2017, at 12:05 PM, Xinliang David Li via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
>><br>
>> Author: davidxl<br>
>> Date: Thu Jun  1 14:05:55 2017<br>
>> New Revision: 304453<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=304453&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=304453&view=rev</a><br>
>> Log:<br>
>> [Profile] Fix builtin_expect lowering bug<br>
>><br>
>> The lowerer wrongly assumes the ICMP instruction<br>
>> 1) always has a constant operand;<br>
>> 2) the operand has value 0.<br>
>><br>
>> It also assumes the expected value can only be one, thus<br>
>> other values other than one will be considered 'zero'.<br>
>><br>
>> This leads to wrong profile annotation when other integer values<br>
>> are used other than 0, 1 in the comparison or in the expect intrinsic.<br>
>><br>
>> Also missing is handling of equal predicate.<br>
>><br>
>> This patch fixes all the above problems.<br>
>><br>
>> Differential Revision: <a href="http://reviews.llvm.org/D33757" rel="noreferrer" target="_blank">http://reviews.llvm.org/D33757</a><br>
>><br>
>> Added:<br>
>>    llvm/trunk/test/Transforms/<wbr>LowerExpectIntrinsic/expect_<wbr>nonboolean.ll<br>
>> Modified:<br>
>>    llvm/trunk/lib/Transforms/<wbr>Scalar/LowerExpectIntrinsic.<wbr>cpp<br>
>><br>
>> Modified: llvm/trunk/lib/Transforms/<wbr>Scalar/LowerExpectIntrinsic.<wbr>cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp?rev=304453&r1=304452&r2=304453&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>Transforms/Scalar/<wbr>LowerExpectIntrinsic.cpp?rev=<wbr>304453&r1=304452&r2=304453&<wbr>view=diff</a><br>
>> ==============================<wbr>==============================<wbr>==================<br>
>> --- llvm/trunk/lib/Transforms/<wbr>Scalar/LowerExpectIntrinsic.<wbr>cpp (original)<br>
>> +++ llvm/trunk/lib/Transforms/<wbr>Scalar/LowerExpectIntrinsic.<wbr>cpp Thu Jun  1 14:05:55 2017<br>
>> @@ -98,11 +98,20 @@ template <class BrSelInst> static bool h<br>
>>   CallInst *CI;<br>
>><br>
>>   ICmpInst *CmpI = dyn_cast<ICmpInst>(BSI.<wbr>getCondition());<br>
>> +  CmpInst::Predicate Predicate;<br>
>> +  uint64_t ValueComparedTo = 0;<br>
>>   if (!CmpI) {<br>
>>     CI = dyn_cast<CallInst>(BSI.<wbr>getCondition());<br>
>> +    Predicate = CmpInst::ICMP_NE;<br>
>> +    ValueComparedTo = 0;<br>
>>   } else {<br>
>> -    if (CmpI->getPredicate() != CmpInst::ICMP_NE)<br>
>> +    Predicate = CmpI->getPredicate();<br>
>> +    if (Predicate != CmpInst::ICMP_NE && Predicate != CmpInst::ICMP_EQ)<br>
>>       return false;<br>
>> +    ConstantInt *CmpConstOperand = dyn_cast<ConstantInt>(CmpI-><wbr>getOperand(1));<br>
>> +    if (!CmpConstOperand)<br>
>> +      return false;<br>
>> +    ValueComparedTo = CmpConstOperand->getZExtValue(<wbr>);<br>
>>     CI = dyn_cast<CallInst>(CmpI-><wbr>getOperand(0));<br>
>>   }<br>
>><br>
>> @@ -121,9 +130,8 @@ template <class BrSelInst> static bool h<br>
>>   MDBuilder MDB(CI->getContext());<br>
>>   MDNode *Node;<br>
>><br>
>> -  // If expect value is equal to 1 it means that we are more likely to take<br>
>> -  // branch 0, in other case more likely is branch 1.<br>
>> -  if (ExpectedValue->isOne())<br>
>> +  if ((ExpectedValue->getZExtValue(<wbr>) == ValueComparedTo) ==<br>
>> +      (Predicate == CmpInst::ICMP_EQ))<br>
>>     Node = MDB.createBranchWeights(<wbr>LikelyBranchWeight, UnlikelyBranchWeight);<br>
>>   else<br>
>>     Node = MDB.createBranchWeights(<wbr>UnlikelyBranchWeight, LikelyBranchWeight);<br>
>><br>
>> Added: llvm/trunk/test/Transforms/<wbr>LowerExpectIntrinsic/expect_<wbr>nonboolean.ll<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LowerExpectIntrinsic/expect_nonboolean.ll?rev=304453&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>Transforms/<wbr>LowerExpectIntrinsic/expect_<wbr>nonboolean.ll?rev=304453&view=<wbr>auto</a><br>
>> ==============================<wbr>==============================<wbr>==================<br>
>> --- llvm/trunk/test/Transforms/<wbr>LowerExpectIntrinsic/expect_<wbr>nonboolean.ll (added)<br>
>> +++ llvm/trunk/test/Transforms/<wbr>LowerExpectIntrinsic/expect_<wbr>nonboolean.ll Thu Jun  1 14:05:55 2017<br>
>> @@ -0,0 +1,104 @@<br>
>> +; RUN: opt -lower-expect  -S -o - < %s | FileCheck %s<br>
>> +; RUN: opt -S -passes='function(lower-<wbr>expect)' < %s | FileCheck %s<br>
>> +<br>
>> +define i32 @foo(i32 %arg) #0 {<br>
>> +; CHECK-LABEL: @foo(i32{{.*}})<br>
>> +bb:<br>
>> +  %tmp = sext i32 %arg to i64<br>
>> +  %tmp1 = call i64 @llvm.expect.i64(i64 %tmp, i64 4)<br>
>> +  %tmp2 = icmp ne i64 %tmp1, 0<br>
>> +  br i1 %tmp2, label %bb3, label %bb5<br>
>> +; CHECK: br i1 %tmp2{{.*}}!prof [[LIKELY:![0-9]+]]<br>
>> +<br>
>> +bb3:                                              ; preds = %bb<br>
>> +  %tmp4 = call i32 (...) @bar()<br>
>> +  br label %bb5<br>
>> +<br>
>> +bb5:                                              ; preds = %bb3, %bb<br>
>> +  ret i32 1<br>
>> +}<br>
>> +<br>
>> +define i32 @foo2(i32 %arg) #0 {<br>
>> +; CHECK-LABEL: @foo2<br>
>> +bb:<br>
>> +  %tmp = sext i32 %arg to i64<br>
>> +  %tmp1 = call i64 @llvm.expect.i64(i64 %tmp, i64 4)<br>
>> +  %tmp2 = icmp eq i64 %tmp1, 2<br>
>> +  br i1 %tmp2, label %bb3, label %bb5<br>
>> +; CHECK: br i1 %tmp2{{.*}}!prof [[UNLIKELY:![0-9]+]]<br>
>> +<br>
>> +bb3:                                              ; preds = %bb<br>
>> +  %tmp4 = call i32 (...) @bar()<br>
>> +  br label %bb5<br>
>> +<br>
>> +bb5:                                              ; preds = %bb3, %bb<br>
>> +  ret i32 1<br>
>> +}<br>
>> +<br>
>> +define i32 @foo3(i32 %arg) #0 {<br>
>> +; CHECK-LABEL: @foo3<br>
>> +bb:<br>
>> +  %tmp = sext i32 %arg to i64<br>
>> +  %tmp1 = call i64 @llvm.expect.i64(i64 %tmp, i64 4)<br>
>> +  %tmp2 = icmp eq i64 %tmp1, 4<br>
>> +  br i1 %tmp2, label %bb3, label %bb5<br>
>> +; CHECK: br i1 %tmp2{{.*}}!prof [[LIKELY]]<br>
>> +<br>
>> +bb3:                                              ; preds = %bb<br>
>> +  %tmp4 = call i32 (...) @bar()<br>
>> +  br label %bb5<br>
>> +<br>
>> +bb5:                                              ; preds = %bb3, %bb<br>
>> +  ret i32 1<br>
>> +}<br>
>> +<br>
>> +define i32 @foo4(i32 %arg) #0 {<br>
>> +; CHECK-LABEL: @foo4<br>
>> +bb:<br>
>> +  %tmp = sext i32 %arg to i64<br>
>> +  %tmp1 = call i64 @llvm.expect.i64(i64 %tmp, i64 4)<br>
>> +  %tmp2 = icmp ne i64 %tmp1, 2<br>
>> +  br i1 %tmp2, label %bb3, label %bb5<br>
>> +; CHECK: br i1 %tmp2{{.*}}!prof [[LIKELY]]<br>
>> +<br>
>> +bb3:                                              ; preds = %bb<br>
>> +  %tmp4 = call i32 (...) @bar()<br>
>> +  br label %bb5<br>
>> +<br>
>> +bb5:                                              ; preds = %bb3, %bb<br>
>> +  ret i32 1<br>
>> +}<br>
>> +<br>
>> +define i32 @foo5(i32 %arg, i32 %arg1) #0 {<br>
>> +; CHECK-LABEL: @foo5<br>
>> +bb:<br>
>> +  %tmp = sext i32 %arg1 to i64<br>
>> +  %tmp2 = call i64 @llvm.expect.i64(i64 %tmp, i64 4)<br>
>> +  %tmp3 = sext i32 %arg to i64<br>
>> +  %tmp4 = icmp ne i64 %tmp2, %tmp3<br>
>> +  br i1 %tmp4, label %bb5, label %bb7<br>
>> +; CHECK-NOT: !prof<br>
>> +<br>
>> +bb5:                                              ; preds = %bb<br>
>> +  %tmp6 = call i32 (...) @bar()<br>
>> +  br label %bb7<br>
>> +<br>
>> +bb7:                                              ; preds = %bb5, %bb<br>
>> +  ret i32 1<br>
>> +}<br>
>> +<br>
>> +declare i64 @llvm.expect.i64(i64, i64) #1<br>
>> +<br>
>> +declare i32 @bar(...) local_unnamed_addr #0<br>
>> +<br>
>> +attributes #0 = { nounwind uwtable }<br>
>> +attributes #1 = { nounwind readnone }<br>
>> +<br>
>> +!llvm.module.flags = !{!0}<br>
>> +!llvm.ident = !{!1}<br>
>> +<br>
>> +!0 = !{i32 1, !"wchar_size", i32 4}<br>
>> +!1 = !{!"clang version 5.0.0 (trunk 304373)"}<br>
>> +; CHECK: [[LIKELY]] = !{!"branch_weights", i32 2000, i32 1}<br>
>> +; CHECK: [[UNLIKELY]] = !{!"branch_weights", i32 1, i32 2000}<br>
>> +<br>
>><br>
>><br>
>> ______________________________<wbr>_________________<br>
>> llvm-commits mailing list<br>
>> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
<br>
</div></div></blockquote></div><br></div>