Compiler projects using llvm
; RUN: opt -S -codegenprepare -mtriple=amdgcn--amdhsa < %s | FileCheck %s

; CHECK-LABEL: @no_sink_local_to_flat(
; CHECK: addrspacecast
; CHECK: br
; CHECK-NOT: addrspacecast
define i64 @no_sink_local_to_flat(i1 %pred, i64 addrspace(3)* %ptr) {
  %ptr_cast = addrspacecast i64 addrspace(3)* %ptr to i64*
  br i1 %pred, label %l1, label %l2

l1:
  %v1 = load i64, i64 addrspace(3)* %ptr
  ret i64 %v1

l2:
  %v2 = load i64, i64* %ptr_cast
  ret i64 %v2
}

; CHECK-LABEL: @no_sink_private_to_flat(
; CHECK: addrspacecast
; CHECK: br
; CHECK-NOT: addrspacecast
define i64 @no_sink_private_to_flat(i1 %pred, i64 addrspace(5)* %ptr) {
  %ptr_cast = addrspacecast i64 addrspace(5)* %ptr to i64*
  br i1 %pred, label %l1, label %l2

l1:
  %v1 = load i64, i64 addrspace(5)* %ptr
  ret i64 %v1

l2:
  %v2 = load i64, i64* %ptr_cast
  ret i64 %v2
}


; CHECK-LABEL: @sink_global_to_flat(
; CHECK-NOT: addrspacecast
; CHECK: br
; CHECK: addrspacecast
define i64 @sink_global_to_flat(i1 %pred, i64 addrspace(1)* %ptr) {
  %ptr_cast = addrspacecast i64 addrspace(1)* %ptr to i64*
  br i1 %pred, label %l1, label %l2

l1:
  %v1 = load i64, i64 addrspace(1)* %ptr
  ret i64 %v1

l2:
  %v2 = load i64, i64* %ptr_cast
  ret i64 %v2
}

; CHECK-LABEL: @sink_flat_to_global(
; CHECK-NOT: addrspacecast
; CHECK: br
; CHECK: addrspacecast
define i64 @sink_flat_to_global(i1 %pred, i64* %ptr) {
  %ptr_cast = addrspacecast i64* %ptr to i64 addrspace(1)*
  br i1 %pred, label %l1, label %l2

l1:
  %v1 = load i64, i64* %ptr
  ret i64 %v1

l2:
  %v2 = load i64, i64 addrspace(1)* %ptr_cast
  ret i64 %v2
}

; CHECK-LABEL: @sink_flat_to_constant(
; CHECK-NOT: addrspacecast
; CHECK: br
; CHECK: addrspacecast
define i64 @sink_flat_to_constant(i1 %pred, i64* %ptr) {
  %ptr_cast = addrspacecast i64* %ptr to i64 addrspace(4)*
  br i1 %pred, label %l1, label %l2

l1:
  %v1 = load i64, i64* %ptr
  ret i64 %v1

l2:
  %v2 = load i64, i64 addrspace(4)* %ptr_cast
  ret i64 %v2
}

; CHECK-LABEL: @sink_flat_to_local(
; CHECK-NOT: addrspacecast
; CHECK: br
; CHECK: addrspacecast
define i64 @sink_flat_to_local(i1 %pred, i64* %ptr) {
  %ptr_cast = addrspacecast i64* %ptr to i64 addrspace(3)*
  br i1 %pred, label %l1, label %l2

l1:
  %v1 = load i64, i64* %ptr
  ret i64 %v1

l2:
  %v2 = load i64, i64 addrspace(3)* %ptr_cast
  ret i64 %v2
}

; CHECK-LABEL: @sink_flat_to_private(
; CHECK-NOT: addrspacecast
; CHECK: br
; CHECK: addrspacecast
define i64 @sink_flat_to_private(i1 %pred, i64* %ptr) {
  %ptr_cast = addrspacecast i64* %ptr to i64 addrspace(5)*
  br i1 %pred, label %l1, label %l2

l1:
  %v1 = load i64, i64* %ptr
  ret i64 %v1

l2:
  %v2 = load i64, i64 addrspace(5)* %ptr_cast
  ret i64 %v2
}