Open
Description
Hi
I have small case that produces suboptimal code. In GISEL we dont do memory access contraction as follows.
define void @test_float_abs(ptr %argptr) {
%arg = load float, float* %argptr
%abs = tail call float @llvm.fabs.f32(float %arg)
store float %abs, ptr %argptr
ret void
}
SDAG
*** IR Dump After Module Verifier (verify) ***
define void @test_float_abs(ptr %argptr) {
%arg = load float, ptr %argptr, align 4
%abs = tail call float @llvm.fabs.f32(float %arg)
store float %abs, ptr %argptr, align 4
ret void
}
# *** IR Dump After X86 DAG->DAG Instruction Selection (x86-isel) ***:
%0:gr64 = COPY $rdi
AND8mi %0:gr64, 1, $noreg, 3, $noreg, 127, implicit-def dead $eflags :: (store (s8) into %ir.argptr + 3), (load (s8) from %ir.argptr + 3)
RET 0
# FINAL
test_float_abs: # @test_float_abs
and byte ptr [rdi + 3], 127
ret
GISEL
test_float_abs: # @test_float_abs
and dword ptr [rdi], 2147483647
ret
Please note dword and byte ptr reads on AND.
https://godbolt.org/z/bfoM3qE31