forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Don't sink ptrtoint/inttoptr sequences into non-noop addrspacecasts.
Differential Revision: https://reviews.llvm.org/D92210 (cherry picked from commit 822b19a)
- Loading branch information
Showing
2 changed files
with
70 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
43 changes: 43 additions & 0 deletions
43
llvm/test/Transforms/CodeGenPrepare/NVPTX/dont-introduce-addrspacecast.ll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
; RUN: opt -S -codegenprepare < %s | FileCheck %s | ||
|
||
target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64" | ||
target triple = "nvptx64-nvidia-cuda" | ||
|
||
|
||
; ptrtoint/inttoptr combinations can introduce semantically-meaningful address space casts | ||
; which we can't sink into an addrspacecast | ||
|
||
; CHECK-LABEL: @test | ||
define void @test(i8* %input_ptr) { | ||
; CHECK-LABEL: l1: | ||
; CHECK-NOT: addrspacecast | ||
%intptr = ptrtoint i8* %input_ptr to i64 | ||
%ptr = inttoptr i64 %intptr to i32 addrspace(3)* | ||
|
||
br label %l1 | ||
l1: | ||
|
||
store atomic i32 1, i32 addrspace(3)* %ptr unordered, align 4 | ||
ret void | ||
} | ||
|
||
|
||
; we still should be able to look through multiple sequences of inttoptr/ptrtoint | ||
|
||
; CHECK-LABEL: @test2 | ||
define void @test2(i8* %input_ptr) { | ||
; CHECK-LABEL: l2: | ||
; CHECK: bitcast | ||
; CHECK-NEXT: store | ||
%intptr = ptrtoint i8* %input_ptr to i64 | ||
%ptr = inttoptr i64 %intptr to i32 addrspace(3)* | ||
|
||
%intptr2 = ptrtoint i32 addrspace(3)* %ptr to i64 | ||
%ptr2 = inttoptr i64 %intptr2 to i32* | ||
|
||
br label %l2 | ||
l2: | ||
|
||
store atomic i32 1, i32* %ptr2 unordered, align 4 | ||
ret void | ||
} |