r358104 - Don't emit an unreachable return block.

John McCall via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 10 20:05:38 PDT 2019



On 10 Apr 2019, at 21:50, wolfgang.pieb at 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 <cfe-commits-bounces at lists.llvm.org> On Behalf Of 
> John McCall via cfe-commits
> Sent: Wednesday, April 10, 2019 10:03 AM
> To: cfe-commits at 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<llvm::AllocaInst>(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<llvm::AllocaInst>(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 @@ int main() {
>
>  // CHECK-NOT: call i32 @__kmpc_reduce
>
> -// CHECK: ret void
> +// CHECK: }
>
>  // CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()  // CHECK: 
> [[TEST:%.+]] = alloca [[S_INT_TY]],
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list