Skip to content

CodeGen Prepare address mode sinking strips nusw from GEPs #162940

@SingleAccretion

Description

@SingleAccretion

Reproduction on goldbolt: link.

IR:

target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
target triple = "wasm32-unknown-emscripten"

declare void @consume(ptr)

define i32 @TestMethod(ptr %l0, ptr %l1, ptr %l2) {
BB00:
  %l19 = getelementptr nusw i8, ptr %l0, i32 40
  %ld = load ptr, ptr %l19
  call void @consume(ptr %ld)
  %l20 = icmp eq ptr %l1, null
  br i1 %l20, label %BBTH, label %BB01

BB01:
  %l42 = load i32, ptr %l19, align 4
  ret i32 %l42

BBTH:
  call void @consume(ptr null)
  unreachable
}
> clang -c -O2 -target wasm32-unknown-emscripten test.ll

Output:

TestMethod:
        local.get       0
        i32.load        40
        call    consume
        block           
        local.get       1
        i32.eqz
        br_if           0
        local.get       0
        i32.const       40
        i32.add 
        i32.load        0
        return
        end_block
        i32.const       0
        call    consume
        unreachable
        end_function

Notice that we're not using address modes for second load. This is because the sinking loses nusw:

BB00:
  %l19 = getelementptr nusw nuw i8, ptr %l0, i32 40
  %ld = load ptr, ptr %l19, align 4
  tail call void @consume(ptr %ld)
  %l20 = icmp eq ptr %l1, null
  br i1 %l20, label %BBTH, label %BB01

BB01:                                             ; preds = %BB00
  %sunkaddr = getelementptr i8, ptr %l0, i32 40 ; The GEP of interest
  %l42 = load i32, ptr %sunkaddr, align 4
  ret i32 %l42

BBTH:                                             ; preds = %BB00
  tail call void @consume(ptr null)
  unreachable

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