Issue 162940
Summary CodeGen Prepare address mode sinking strips `nusw` from GEPs
Labels new issue
Assignees
Reporter SingleAccretion
    Reproduction on goldbolt: [link](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:llvm,selection:(endColumn:2,endLineNumber:21,positionColumn:1,positionLineNumber:1,selectionStartColumn:2,selectionStartLineNumber:21,startColumn:1,startLineNumber:1),source:'target+datalayout+%3D+%22e-m:e-p:32:32-i64:64-n32:64-S128%22%0Atarget+triple+%3D+%22wasm32-unknown-emscripten%22%0A%0Adeclare+void+@consume(ptr)%0A%0Adefine+i32+@TestMethod(ptr+%25l0,+ptr+%25l1,+ptr+%25l2)+%7B%0ABB00:%0A++%25l19+%3D+getelementptr+nusw+i8,+ptr+%25l0,+i32+40%0A++%25ld+%3D+load+ptr,+ptr+%25l19%0A++call+void+@consume(ptr+%25ld)%0A++%25l20+%3D+icmp+eq+ptr+%25l1,+null%0A++br+i1+%25l20,+label+%25BBTH,+label+%25BB01%0A%0ABB01:%0A++%25l42+%3D+load+i32,+ptr+%25l19,+align+4%0A++ret+i32+%25l42%0A%0ABBTH:%0A++call+void+@consume(ptr+null)%0A++unreachable%0A%7D'),l:'5',n:'0',o:'LLVM+IR+source+%231',t:'0')),k:49.88577080976944,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:irclangtrunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:llvm,libs:!(),options:'-O2+-target+wasm32-unknown-emscripten+-mllvm+-print-after-all',overrides:!(),selection:(endColumn:21,endLineNumber:18,positionColumn:1,positionLineNumber:1,selectionStartColumn:21,selectionStartLineNumber:18,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+clang+(trunk)+(Editor+%231)',t:'0')),k:50.114229190230574,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4).

IR:
```llvm
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:
```wasm
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`:
```llvm
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

```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to