Issue 146475
Summary [X86][GlobalIsel] Missed optimization for memory access
Labels new issue
Assignees
Reporter mahesh-attarde
    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
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to