This is an archive of the discontinued LLVM Phabricator instance.

Update docs about [[likely]] vs. PGO
Needs ReviewPublic

Authored by hans on Sep 21 2022, 3:40 PM.

Details

Summary

It sounds like these attributes do nothing when PGO is enabled, which is actually (or please correct me if I'm wrong) only the case when there is profile data coverage the specific statements in question. If there is no profile data, the attributes still apply.

Diff Detail

Event Timeline

hans created this revision.Sep 21 2022, 3:40 PM
Herald added a project: Restricted Project. · View Herald TranscriptSep 21 2022, 3:40 PM
Herald added a subscriber: wenlei. · View Herald Transcript
hans requested review of this revision.Sep 21 2022, 3:40 PM
Herald added a project: Restricted Project. · View Herald TranscriptSep 21 2022, 3:40 PM

While running this small experiment: https://sergesanspaille.fedorapeople.org/proftest.sh
I get the following output:

clang version 16.0.0 (...)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: ...
==== - instrumentation + likely: puts first

00000000000006d0 <main>:
 6d0:	50                   	push   %rax
 6d1:	83 ff 01             	cmp    $0x1,%edi
 6d4:	75 10                	jne    6e6 <main+0x16>
 6d6:	48 8d 3d a7 00 00 00 	lea    0xa7(%rip),%rdi        # 784 <_IO_stdin_used+0x4>
 6dd:	e8 ce fe ff ff       	callq  5b0 <puts@plt>
 6e2:	31 c0                	xor    %eax,%eax
 6e4:	59                   	pop    %rcx
 6e5:	c3                   	retq   
 6e6:	48 8b 06             	mov    (%rsi),%rax
 6e9:	48 8b 56 08          	mov    0x8(%rsi),%rdx
 6ed:	48 8d 3d 9b 00 00 00 	lea    0x9b(%rip),%rdi        # 78f <_IO_stdin_used+0xf>
 6f4:	48 89 c6             	mov    %rax,%rsi
 6f7:	31 c0                	xor    %eax,%eax
 6f9:	e8 92 fe ff ff       	callq  590 <printf@plt>
 6fe:	eb e2                	jmp    6e2 <main+0x12>

0000000000000700 <__libc_csu_init>:

====  + instrumentation + likely: puts first

00000000000005e0 <main>:
 5e0:	50                   	push   %rax
 5e1:	83 ff 01             	cmp    $0x1,%edi
 5e4:	75 10                	jne    5f6 <main+0x16>
 5e6:	48 8d 3d 97 01 00 00 	lea    0x197(%rip),%rdi        # 784 <_IO_stdin_used+0x4>
 5ed:	e8 be ff ff ff       	callq  5b0 <puts@plt>
 5f2:	31 c0                	xor    %eax,%eax
 5f4:	59                   	pop    %rcx
 5f5:	c3                   	retq   
 5f6:	48 8b 06             	mov    (%rsi),%rax
 5f9:	48 8b 56 08          	mov    0x8(%rsi),%rdx
 5fd:	48 8d 3d 8b 01 00 00 	lea    0x18b(%rip),%rdi        # 78f <_IO_stdin_used+0xf>
 604:	48 89 c6             	mov    %rax,%rsi
 607:	31 c0                	xor    %eax,%eax
 609:	e8 82 ff ff ff       	callq  590 <printf@plt>
 60e:	eb e2                	jmp    5f2 <main+0x12>

0000000000000610 <_start>:
./b1.out 12
==== - instrumentation - likely: puts first

00000000000006d0 <main>:
 6d0:	50                   	push   %rax
 6d1:	83 ff 01             	cmp    $0x1,%edi
 6d4:	75 0e                	jne    6e4 <main+0x14>
 6d6:	48 8d 3d a7 00 00 00 	lea    0xa7(%rip),%rdi        # 784 <_IO_stdin_used+0x4>
 6dd:	e8 ce fe ff ff       	callq  5b0 <puts@plt>
 6e2:	eb 18                	jmp    6fc <main+0x2c>
 6e4:	48 8b 06             	mov    (%rsi),%rax
 6e7:	48 8b 56 08          	mov    0x8(%rsi),%rdx
 6eb:	48 8d 3d 9d 00 00 00 	lea    0x9d(%rip),%rdi        # 78f <_IO_stdin_used+0xf>
 6f2:	48 89 c6             	mov    %rax,%rsi
 6f5:	31 c0                	xor    %eax,%eax
 6f7:	e8 94 fe ff ff       	callq  590 <printf@plt>
 6fc:	31 c0                	xor    %eax,%eax
 6fe:	59                   	pop    %rcx
 6ff:	c3                   	retq   

0000000000000700 <__libc_csu_init>:

====  + instrumentation - likely: printf first

00000000000005e0 <main>:
 5e0:	50                   	push   %rax
 5e1:	83 ff 01             	cmp    $0x1,%edi
 5e4:	74 1c                	je     602 <main+0x22>
 5e6:	48 8b 06             	mov    (%rsi),%rax
 5e9:	48 8b 56 08          	mov    0x8(%rsi),%rdx
 5ed:	48 8d 3d 9b 01 00 00 	lea    0x19b(%rip),%rdi        # 78f <_IO_stdin_used+0xf>
 5f4:	48 89 c6             	mov    %rax,%rsi
 5f7:	31 c0                	xor    %eax,%eax
 5f9:	e8 92 ff ff ff       	callq  590 <printf@plt>
 5fe:	31 c0                	xor    %eax,%eax
 600:	59                   	pop    %rcx
 601:	c3                   	retq   
 602:	48 8d 3d 7b 01 00 00 	lea    0x17b(%rip),%rdi        # 784 <_IO_stdin_used+0x4>
 609:	e8 a2 ff ff ff       	callq  5b0 <puts@plt>
 60e:	eb ee                	jmp    5fe <main+0x1e>

0000000000000610 <_start>:

To me, it means that [[likely]] takes precedence over profile information...

While running this small experiment: https://sergesanspaille.fedorapeople.org/proftest.sh

Thank you for the help with testing the assumptions here!

hans added a comment.Sep 22 2022, 10:41 AM

See also D134456 which affects the behavior here.