-
Notifications
You must be signed in to change notification settings - Fork 15.4k
Open
Labels
Description
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_functionNotice 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