Re: r358104 - Don't emit an unreachable return block.
Thanks, your fix looks good to me. - Marco. Il 11/04/19 05:05, John McCall ha scritto: > > > On 10 Apr 2019, at 21:50, wolfgang.p...@sony.com wrote: > >> Hi, >> This commit seems to be causing a test failure on several buildbots >> (e.g. >> http://lab.llvm.org:8011/builders/clang-ppc64be-linux-lnt/builds/26305). >> instrprof-shared-gcov-flush.test is failing because of differences in >> profile info. The test passes when I revert your change, so perhaps >> it's just a case of updating the test. >> Could you please take a look? > > Adjusted the test in r358149 as a hopeful fix. CC'ing Marco since I > believe this was originally his test. > > John. > >> >> Thanks, >> Wolfgang Pieb >> >> -Original Message- >> From: cfe-commits On Behalf Of >> John McCall via cfe-commits >> Sent: Wednesday, April 10, 2019 10:03 AM >> To: cfe-commits@lists.llvm.org >> Subject: r358104 - Don't emit an unreachable return block. >> >> Author: rjmccall >> Date: Wed Apr 10 10:03:09 2019 >> New Revision: 358104 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=358104&view=rev >> Log: >> Don't emit an unreachable return block. >> >> Patch by Brad Moody. >> >> Added: >> cfe/trunk/test/CodeGen/unreachable-ret.c >> Modified: >> cfe/trunk/lib/CodeGen/CGCall.cpp >> cfe/trunk/lib/CodeGen/CodeGenFunction.cpp >> cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp >> >> Modified: cfe/trunk/lib/CodeGen/CGCall.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=358104&r1=358103&r2=358104&view=diff >> == >> >> --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) >> +++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed Apr 10 10:03:09 2019 >> @@ -2873,15 +2873,6 @@ void CodeGenFunction::EmitFunctionEpilog >> RV = SI->getValueOperand(); >> SI->eraseFromParent(); >> >> - // If that was the only use of the return value, nuke it as >> well now. >> - auto returnValueInst = ReturnValue.getPointer(); >> - if (returnValueInst->use_empty()) { >> - if (auto alloca = >> dyn_cast(returnValueInst)) { >> - alloca->eraseFromParent(); >> - ReturnValue = Address::invalid(); >> - } >> - } >> - >> // Otherwise, we have to do a simple load. >> } else { >> RV = Builder.CreateLoad(ReturnValue); >> >> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=358104&r1=358103&r2=358104&view=diff >> == >> >> --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) >> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Wed Apr 10 10:03:09 2019 >> @@ -255,6 +255,7 @@ llvm::DebugLoc CodeGenFunction::EmitRetu >> if (CurBB->empty() || ReturnBlock.getBlock()->use_empty()) { >> ReturnBlock.getBlock()->replaceAllUsesWith(CurBB); >> delete ReturnBlock.getBlock(); >> + ReturnBlock = JumpDest(); >> } else >> EmitBlock(ReturnBlock.getBlock()); >> return llvm::DebugLoc(); >> @@ -274,6 +275,7 @@ llvm::DebugLoc CodeGenFunction::EmitRetu >> Builder.SetInsertPoint(BI->getParent()); >> BI->eraseFromParent(); >> delete ReturnBlock.getBlock(); >> + ReturnBlock = JumpDest(); >> return Loc; >> } >> } >> @@ -448,6 +450,19 @@ void CodeGenFunction::FinishFunction(Sou >> // 5. Width of vector aguments and return types for functions >> called by this >> // function. >> CurFn->addFnAttr("min-legal-vector-width", >> llvm::utostr(LargestVectorWidth)); >> + >> + // If we generated an unreachable return block, delete it now. >> + if (ReturnBlock.isValid() && ReturnBlock.getBlock()->use_empty()) { >> + Builder.ClearInsertionPoint(); >> + ReturnBlock.getBlock()->eraseFromParent(); >> + } >> + if (ReturnValue.isValid()) { >> + auto *RetAlloca = >> dyn_cast(ReturnValue.getPointer()); >> + if (RetAlloca && RetAlloca->use_empty()) { >> + RetAlloca->eraseFromParent(); >> + ReturnValue = Address::invalid(); >> + } >> + } >> } >> >> /// ShouldInstrumentFunction - Return true if the current function >> should be >> >> Added: cfe/trunk/test/CodeGen/unreachable-ret.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/unreachable-ret.c?rev=358104&view=auto >> == >> >> --- cfe/trunk/test/CodeGen/unreachable-ret.c (added) >> +++ cfe/trunk/test/CodeGen/unreachable-ret.c Wed Apr 10 10:03:09 2019 >> @@ -0,0 +1,23 @@ >> +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s >> + >> +extern void abort() __attribute__((noreturn)); >> + >> +void f1() { >> + abort(); >> +} >> +// CHECK-LABEL: define void @f1() >> +// CHECK-NEXT: entry: >> +// CHECK-NEXT: call void @abort() >> +// CHECK-NEXT: unreachable >> +// CHECK-NEXT:
Re: r358104 - Don't emit an unreachable return block.
On 10 Apr 2019, at 21:50, wolfgang.p...@sony.com wrote: Hi, This commit seems to be causing a test failure on several buildbots (e.g. http://lab.llvm.org:8011/builders/clang-ppc64be-linux-lnt/builds/26305). instrprof-shared-gcov-flush.test is failing because of differences in profile info. The test passes when I revert your change, so perhaps it's just a case of updating the test. Could you please take a look? Adjusted the test in r358149 as a hopeful fix. CC'ing Marco since I believe this was originally his test. John. Thanks, Wolfgang Pieb -Original Message- From: cfe-commits On Behalf Of John McCall via cfe-commits Sent: Wednesday, April 10, 2019 10:03 AM To: cfe-commits@lists.llvm.org Subject: r358104 - Don't emit an unreachable return block. Author: rjmccall Date: Wed Apr 10 10:03:09 2019 New Revision: 358104 URL: http://llvm.org/viewvc/llvm-project?rev=358104&view=rev Log: Don't emit an unreachable return block. Patch by Brad Moody. Added: cfe/trunk/test/CodeGen/unreachable-ret.c Modified: cfe/trunk/lib/CodeGen/CGCall.cpp cfe/trunk/lib/CodeGen/CodeGenFunction.cpp cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp Modified: cfe/trunk/lib/CodeGen/CGCall.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=358104&r1=358103&r2=358104&view=diff == --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) +++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed Apr 10 10:03:09 2019 @@ -2873,15 +2873,6 @@ void CodeGenFunction::EmitFunctionEpilog RV = SI->getValueOperand(); SI->eraseFromParent(); -// If that was the only use of the return value, nuke it as well now. -auto returnValueInst = ReturnValue.getPointer(); -if (returnValueInst->use_empty()) { - if (auto alloca = dyn_cast(returnValueInst)) { -alloca->eraseFromParent(); -ReturnValue = Address::invalid(); - } -} - // Otherwise, we have to do a simple load. } else { RV = Builder.CreateLoad(ReturnValue); Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=358104&r1=358103&r2=358104&view=diff == --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Wed Apr 10 10:03:09 2019 @@ -255,6 +255,7 @@ llvm::DebugLoc CodeGenFunction::EmitRetu if (CurBB->empty() || ReturnBlock.getBlock()->use_empty()) { ReturnBlock.getBlock()->replaceAllUsesWith(CurBB); delete ReturnBlock.getBlock(); + ReturnBlock = JumpDest(); } else EmitBlock(ReturnBlock.getBlock()); return llvm::DebugLoc(); @@ -274,6 +275,7 @@ llvm::DebugLoc CodeGenFunction::EmitRetu Builder.SetInsertPoint(BI->getParent()); BI->eraseFromParent(); delete ReturnBlock.getBlock(); + ReturnBlock = JumpDest(); return Loc; } } @@ -448,6 +450,19 @@ void CodeGenFunction::FinishFunction(Sou // 5. Width of vector aguments and return types for functions called by this //function. CurFn->addFnAttr("min-legal-vector-width", llvm::utostr(LargestVectorWidth)); + + // If we generated an unreachable return block, delete it now. + if (ReturnBlock.isValid() && ReturnBlock.getBlock()->use_empty()) { +Builder.ClearInsertionPoint(); +ReturnBlock.getBlock()->eraseFromParent(); + } + if (ReturnValue.isValid()) { +auto *RetAlloca = dyn_cast(ReturnValue.getPointer()); +if (RetAlloca && RetAlloca->use_empty()) { + RetAlloca->eraseFromParent(); + ReturnValue = Address::invalid(); +} + } } /// ShouldInstrumentFunction - Return true if the current function should be Added: cfe/trunk/test/CodeGen/unreachable-ret.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/unreachable-ret.c?rev=358104&view=auto == --- cfe/trunk/test/CodeGen/unreachable-ret.c (added) +++ cfe/trunk/test/CodeGen/unreachable-ret.c Wed Apr 10 10:03:09 2019 @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s + +extern void abort() __attribute__((noreturn)); + +void f1() { + abort(); +} +// CHECK-LABEL: define void @f1() +// CHECK-NEXT: entry: +// CHECK-NEXT: call void @abort() +// CHECK-NEXT: unreachable +// CHECK-NEXT: } + +void *f2() { + abort(); + return 0; +} +// CHECK-LABEL: define i8* @f2() +// CHECK-NEXT: entry: +// CHECK-NEXT: call void @abort() +// CHECK-NEXT: unreachable +// CHECK-NEXT: } + Modified: cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp?rev=358104&r1=358103&r2=358104&view=diff ===
RE: r358104 - Don't emit an unreachable return block.
Hi, This commit seems to be causing a test failure on several buildbots (e.g. http://lab.llvm.org:8011/builders/clang-ppc64be-linux-lnt/builds/26305). instrprof-shared-gcov-flush.test is failing because of differences in profile info. The test passes when I revert your change, so perhaps it's just a case of updating the test. Could you please take a look? Thanks, Wolfgang Pieb -Original Message- From: cfe-commits On Behalf Of John McCall via cfe-commits Sent: Wednesday, April 10, 2019 10:03 AM To: cfe-commits@lists.llvm.org Subject: r358104 - Don't emit an unreachable return block. Author: rjmccall Date: Wed Apr 10 10:03:09 2019 New Revision: 358104 URL: http://llvm.org/viewvc/llvm-project?rev=358104&view=rev Log: Don't emit an unreachable return block. Patch by Brad Moody. Added: cfe/trunk/test/CodeGen/unreachable-ret.c Modified: cfe/trunk/lib/CodeGen/CGCall.cpp cfe/trunk/lib/CodeGen/CodeGenFunction.cpp cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp Modified: cfe/trunk/lib/CodeGen/CGCall.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=358104&r1=358103&r2=358104&view=diff == --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) +++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed Apr 10 10:03:09 2019 @@ -2873,15 +2873,6 @@ void CodeGenFunction::EmitFunctionEpilog RV = SI->getValueOperand(); SI->eraseFromParent(); -// If that was the only use of the return value, nuke it as well now. -auto returnValueInst = ReturnValue.getPointer(); -if (returnValueInst->use_empty()) { - if (auto alloca = dyn_cast(returnValueInst)) { -alloca->eraseFromParent(); -ReturnValue = Address::invalid(); - } -} - // Otherwise, we have to do a simple load. } else { RV = Builder.CreateLoad(ReturnValue); Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=358104&r1=358103&r2=358104&view=diff == --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Wed Apr 10 10:03:09 2019 @@ -255,6 +255,7 @@ llvm::DebugLoc CodeGenFunction::EmitRetu if (CurBB->empty() || ReturnBlock.getBlock()->use_empty()) { ReturnBlock.getBlock()->replaceAllUsesWith(CurBB); delete ReturnBlock.getBlock(); + ReturnBlock = JumpDest(); } else EmitBlock(ReturnBlock.getBlock()); return llvm::DebugLoc(); @@ -274,6 +275,7 @@ llvm::DebugLoc CodeGenFunction::EmitRetu Builder.SetInsertPoint(BI->getParent()); BI->eraseFromParent(); delete ReturnBlock.getBlock(); + ReturnBlock = JumpDest(); return Loc; } } @@ -448,6 +450,19 @@ void CodeGenFunction::FinishFunction(Sou // 5. Width of vector aguments and return types for functions called by this //function. CurFn->addFnAttr("min-legal-vector-width", llvm::utostr(LargestVectorWidth)); + + // If we generated an unreachable return block, delete it now. + if (ReturnBlock.isValid() && ReturnBlock.getBlock()->use_empty()) { +Builder.ClearInsertionPoint(); +ReturnBlock.getBlock()->eraseFromParent(); + } + if (ReturnValue.isValid()) { +auto *RetAlloca = dyn_cast(ReturnValue.getPointer()); +if (RetAlloca && RetAlloca->use_empty()) { + RetAlloca->eraseFromParent(); + ReturnValue = Address::invalid(); +} + } } /// ShouldInstrumentFunction - Return true if the current function should be Added: cfe/trunk/test/CodeGen/unreachable-ret.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/unreachable-ret.c?rev=358104&view=auto == --- cfe/trunk/test/CodeGen/unreachable-ret.c (added) +++ cfe/trunk/test/CodeGen/unreachable-ret.c Wed Apr 10 10:03:09 2019 @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s + +extern void abort() __attribute__((noreturn)); + +void f1() { + abort(); +} +// CHECK-LABEL: define void @f1() +// CHECK-NEXT: entry: +// CHECK-NEXT: call void @abort() +// CHECK-NEXT: unreachable +// CHECK-NEXT: } + +void *f2() { + abort(); + return 0; +} +// CHECK-LABEL: define i8* @f2() +// CHECK-NEXT: entry: +// CHECK-NEXT: call void @abort() +// CHECK-NEXT: unreachable +// CHECK-NEXT: } + Modified: cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp?rev=358104&r1=358103&r2=358104&view=diff == --- cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp Wed Apr 10 +++ 10:03:09 2019 @@ -622,7 +622,7 @@ i