You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
bool test1(unsigned long long x)
{
unsigned long long r = (x << 32) | (x >> 32);
return r != 0;
}
bool test2(unsigned long long x)
{
unsigned long long r = (x << 32) | (x >> 32);
return r == ~0ULL;
}
Trunk -O3:
test1(unsigned long long): # @test1(unsigned long long)
rol rdi, 32
test rdi, rdi
setne al
ret
test2(unsigned long long): # @test2(unsigned long long)
rol rdi, 32
cmp rdi, -1
sete al
ret
test3(unsigned long long): # @test3(unsigned long long)
rol rdi, 32
test rdi, rdi
setne al
ret
Extended Description
bool test1(unsigned long long x)
{
unsigned long long r = (x << 32) | (x >> 32);
return r != 0;
}
bool test2(unsigned long long x)
{
unsigned long long r = (x << 32) | (x >> 32);
return r == ~0ULL;
}
Trunk -O3:
test1(unsigned long long): # @test1(unsigned long long)
rol rdi, 32
test rdi, rdi
setne al
ret
test2(unsigned long long): # @test2(unsigned long long)
rol rdi, 32
cmp rdi, -1
sete al
ret
test3(unsigned long long): # @test3(unsigned long long)
rol rdi, 32
test rdi, rdi
setne al
ret
Current codegen:
https://godbolt.org/z/q78xxhWe4
define i1 @src(i64 %0) {
%1:
%2 = fshr i64 %0, i64 %0, i64 32
%3 = icmp ne i64 %2, 0
ret i1 %3
}
=>
define i1 @tgt(i64 %0) {
%1:
%2 = icmp ne i64 %0, 0
ret i1 %2
}
Transformation seems to be correct!
define i1 @src(i64 %0) {
%1:
%2 = fshr i64 %0, i64 %0, i64 32
%3 = icmp ne i64 %2, -1
ret i1 %3
}
=>
define i1 @tgt(i64 %0) {
%1:
%2 = icmp ne i64 %0, -1
ret i1 %2
}
Transformation seems to be correct!
Alive:
https://alive2.llvm.org/ce/z/kmrBvv
The text was updated successfully, but these errors were encountered: