| ; 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) |