Skip to content

[X86][GlobalIsel] Missed optimization for memory access #146475

Open
@mahesh-attarde

Description

@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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions