Author: erichkeane Date: Wed Dec 12 12:30:53 2018 New Revision: 348969 URL: http://llvm.org/viewvc/llvm-project?rev=348969&view=rev Log: Teach __builtin_unpredictable to work through implicit casts.
The __builtin_unpredictable implementation is confused by any implicit casts, which happen in C++. This patch strips those off so that if/switch statements now work with it in C++. Change-Id: I73c3bf4f1775cd906703880944f4fcdc29fffb0a Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp cfe/trunk/test/CodeGen/builtin-unpredictable.c Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=348969&r1=348968&r2=348969&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Wed Dec 12 12:30:53 2018 @@ -1701,7 +1701,7 @@ void CodeGenFunction::EmitBranchOnBoolEx // create metadata that specifies that the branch is unpredictable. // Don't bother if not optimizing because that metadata would not be used. llvm::MDNode *Unpredictable = nullptr; - auto *Call = dyn_cast<CallExpr>(Cond); + auto *Call = dyn_cast<CallExpr>(Cond->IgnoreImpCasts()); if (Call && CGM.getCodeGenOpts().OptimizationLevel != 0) { auto *FD = dyn_cast_or_null<FunctionDecl>(Call->getCalleeDecl()); if (FD && FD->getBuiltinID() == Builtin::BI__builtin_unpredictable) { Modified: cfe/trunk/test/CodeGen/builtin-unpredictable.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtin-unpredictable.c?rev=348969&r1=348968&r2=348969&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/builtin-unpredictable.c (original) +++ cfe/trunk/test/CodeGen/builtin-unpredictable.c Wed Dec 12 12:30:53 2018 @@ -1,10 +1,15 @@ -// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-passes -o - %s -O1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-passes -o - %s -O1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-passes -o - -x c++ %s -O1 | FileCheck %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O0 | FileCheck %s --check-prefix=CHECK_O0 // When optimizing, the builtin should be converted to metadata. // When not optimizing, there should be no metadata created for the builtin. // In both cases, the builtin should be removed from the code. +#ifdef __cplusplus +extern "C" { +#endif + void foo(); void branch(int x) { // CHECK-LABEL: define void @branch( @@ -42,5 +47,10 @@ int unpredictable_switch(int x) { return 0; } +#ifdef __cplusplus +} +#endif + + // CHECK: [[METADATA]] = !{} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits