]> granicus.if.org Git - clang/commit
Retry: [profiling] Fix profile counter increment when emitting selects (PR32019)
authorVedant Kumar <vsk@apple.com>
Sat, 25 Feb 2017 06:35:45 +0000 (06:35 +0000)
committerVedant Kumar <vsk@apple.com>
Sat, 25 Feb 2017 06:35:45 +0000 (06:35 +0000)
commit4f9b93abc8a8d41d7c89b3e6babeb48621b4d109
tree6e0654e06aaeccfa2760af7aa3dd51395ff980e0
parent31b3c535d98f1c16391a0f433f4a7aad251b2555
Retry: [profiling] Fix profile counter increment when emitting selects (PR32019)

2nd attempt: the first was in r296231, but it had a use after lifetime
bug.

Clang has logic to lower certain conditional expressions directly into llvm
select instructions. However, it does not emit the correct profile counter
increment as it does this: it emits an unconditional increment of the counter
for the 'then branch', even if the value selected is from the 'else branch'
(this is PR32019).

That means, given the following snippet, we would report that "0" is selected
twice, and that "1" is never selected:

  int f1(int x) {
    return x ? 0 : 1;
               ^2  ^0
  }

  f1(0);
  f1(1);

Fix the problem by using the instrprof_increment_step intrinsic to do the
proper increment.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@296245 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/CGExprScalar.cpp
lib/CodeGen/CodeGenFunction.h
lib/CodeGen/CodeGenPGO.cpp
lib/CodeGen/CodeGenPGO.h
test/Profile/c-ternary.c [new file with mode: 0644]