deadalnix added a subscriber: deadalnix. ================ Comment at: lib/CodeGen/CGStmt.cpp:1560-1588 @@ -1560,1 +1559,31 @@ + MDHelper.createUnpredictable()); + } else if (FD->getBuiltinID() == Builtin::BI__builtin_expect) { + + // FIXME: builtin_expect should use the same metadata type as + // builtin_unpredictable and be handled above. For now, we're mimicking + // the LLVM behavior of the 'LowerExpectIntrinsic' pass. + + // HACK: Hardcode the taken/not-taken weights based on the existing LLVM + // default values. This code is expected to be very temporary. Once we + // have prepared LLVM to handle builtin_expect using 'unpredictable' + // metadata, this gets deleted. + + const int LikelyWeight = 64; + const int UnlikelyWeight = 4; + + llvm::Value *ExpectedVal = EmitScalarExpr(Call->getArg(1)); + if (auto *ExpectConst = dyn_cast<llvm::ConstantInt>(ExpectedVal)) { + // The +1 is for the default case. + SmallVector<uint32_t, 16> Weights(SwitchInsn->getNumCases() + 1, + UnlikelyWeight); + auto ExpectedCase = SwitchInsn->findCaseValue(ExpectConst); + if (ExpectedCase == SwitchInsn->case_default()) + Weights[0] = LikelyWeight; + else + Weights[ExpectedCase.getCaseIndex() + 1] = LikelyWeight; + + SwitchInsn->setMetadata(llvm::LLVMContext::MD_prof, + MDHelper.createBranchWeights(Weights)); + } + } } ---------------- If I understand properly this is transitional and eventually, you want to remove the intrinsic ? I think I like it, having 2 ways to hint here is only making things more complicated without adding much value.
http://reviews.llvm.org/D19299 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits