<html>
<head>
<base href="https://bugs.llvm.org/">
</head>
<body><table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Bug ID</th>
<td><a class="bz_bug_link
bz_status_NEW "
title="NEW - Better codegen for truncated bswap"
href="https://bugs.llvm.org/show_bug.cgi?id=51568">51568</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>Better codegen for truncated bswap
</td>
</tr>
<tr>
<th>Product</th>
<td>libraries
</td>
</tr>
<tr>
<th>Version</th>
<td>trunk
</td>
</tr>
<tr>
<th>Hardware</th>
<td>PC
</td>
</tr>
<tr>
<th>OS</th>
<td>Linux
</td>
</tr>
<tr>
<th>Status</th>
<td>NEW
</td>
</tr>
<tr>
<th>Severity</th>
<td>enhancement
</td>
</tr>
<tr>
<th>Priority</th>
<td>P
</td>
</tr>
<tr>
<th>Component</th>
<td>Scalar Optimizations
</td>
</tr>
<tr>
<th>Assignee</th>
<td>unassignedbugs@nondot.org
</td>
</tr>
<tr>
<th>Reporter</th>
<td>david.bolvansky@gmail.com
</td>
</tr>
<tr>
<th>CC</th>
<td>llvm-bugs@lists.llvm.org
</td>
</tr></table>
<p>
<div>
<pre>unsigned int swap_ull(unsigned long long value)
{
return ((value & 0x00000000000000ffull) << 56)
| ((value & 0x000000000000ff00ull) << 40)
| ((value & 0x0000000000ff0000ull) << 24)
| ((value & 0x00000000ff000000ull) << 8)
| ((value & 0x000000ff00000000ull) >> 8)
| ((value & 0x0000ff0000000000ull) >> 24)
| ((value & 0x00ff000000000000ull) >> 40)
| ((value & 0xff00000000000000ull) >> 56);
}
unsigned int swap_ull_builtin(unsigned long long value)
{
return __builtin_bswap64(value);
}
Trunk -O3:
swap_ull(unsigned long long): # @swap_ull(unsigned
long long)
movabs rax, 72057589742960640
and rax, rdi
bswap rax
shr rdi, 56
or eax, edi
ret
swap_ull_builtin(unsigned long long): #
@swap_ull_builtin(unsigned long long)
mov rax, rdi
bswap rax
ret
ICC -O3:
swap_ull(unsigned long long):
bswap rdi #10.51
mov eax, edi #10.51
ret #10.51
swap_ull_builtin(unsigned long long):
bswap rdi #15.12
mov eax, edi #15.12
ret #15.12
unsigned int swap_ull(unsigned long long value)
{
return ((value & 0x00000000000000ffull) << 56)
| ((value & 0x000000000000ff00ull) << 40)
| ((value & 0x0000000000ff0000ull) << 24)
| ((value & 0x00000000ff000000ull) << 8)
| ((value & 0x000000ff00000000ull) >> 8)
| ((value & 0x0000ff0000000000ull) >> 24)
| ((value & 0x00ff000000000000ull) >> 40)
| ((value & 0xff00000000000000ull) >> 56);
}
unsigned int swap_ull_builtin(unsigned long long value)
{
return __builtin_bswap64(value);
}
define i32 @src(i64 %0) {
%1:
%2 = and i64 %0, 72057594037927935
%3 = bswap i64 %2
%4 = lshr i64 %0, 56
%5 = or i64 %3, %4
%6 = trunc i64 %5 to i32
ret i32 %6
}
=>
define i32 @tgt(i64 %0) {
%1:
%2 = bswap i64 %0
%3 = trunc i64 %2 to i32
ret i32 %3
}
Transformation seems to be correct!
<a href="https://alive2.llvm.org/ce/z/loQjOQ">https://alive2.llvm.org/ce/z/loQjOQ</a></pre>
</div>
</p>
<hr>
<span>You are receiving this mail because:</span>
<ul>
<li>You are on the CC list for the bug.</li>
</ul>
</body>
</html>