blob: be3981b76d1ff1c3450fe1c922011b4aa24b7c5c [file]
; RUN: llc -mtriple=hexagon -stop-after=hexagon-isel -o - %s | FileCheck %s
; A bit-reverse load accesses the base pointer with its low 16 bits reversed,
; so the accessed address is only known to stay inside the underlying object
; when that object is aligned to 64K. Check that no pointer information is
; attached to the memory operand otherwise, so that alias analysis stays
; conservative and an aliasing store is not moved across the loads.
@aligned64k = global [256 x i8] zeroinitializer, align 65536
@aligned256 = global [256 x i8] zeroinitializer, align 256
; CHECK-LABEL: name: {{.*}}brev_aligned64k
; CHECK: L2_loadrb_pbr{{.*}}:: (load (s32) from @aligned64k)
; CHECK: L2_loadrb_pbr{{.*}}:: (load (s32) from @aligned64k + 128)
define i8 @brev_aligned64k() {
entry:
%v0 = tail call { i32, ptr } @llvm.hexagon.L2.loadrb.pbr(ptr @aligned64k, i32 256)
%p0 = extractvalue { i32, ptr } %v0, 1
%v1 = tail call { i32, ptr } @llvm.hexagon.L2.loadrb.pbr(ptr %p0, i32 256)
%r = extractvalue { i32, ptr } %v1, 0
%t = trunc i32 %r to i8
ret i8 %t
}
; CHECK-LABEL: name: {{.*}}brev_aligned256
; CHECK: L2_loadrb_pbr{{.*}}:: (load (s32))
; CHECK: L2_loadrb_pbr{{.*}}:: (load (s32))
define i8 @brev_aligned256() {
entry:
%v0 = tail call { i32, ptr } @llvm.hexagon.L2.loadrb.pbr(ptr @aligned256, i32 256)
%p0 = extractvalue { i32, ptr } %v0, 1
%v1 = tail call { i32, ptr } @llvm.hexagon.L2.loadrb.pbr(ptr %p0, i32 256)
%r = extractvalue { i32, ptr } %v1, 0
%t = trunc i32 %r to i8
ret i8 %t
}
; The alignment of an incoming pointer is not known.
; CHECK-LABEL: name: {{.*}}brev_unknown_align
; CHECK: L2_loadrb_pbr{{.*}}:: (load (s32))
define i8 @brev_unknown_align(ptr %p) {
entry:
%v0 = tail call { i32, ptr } @llvm.hexagon.L2.loadrb.pbr(ptr %p, i32 256)
%r = extractvalue { i32, ptr } %v0, 0
%t = trunc i32 %r to i8
ret i8 %t
}
declare { i32, ptr } @llvm.hexagon.L2.loadrb.pbr(ptr, i32)