blob: 322c38d090fe1f4825030a26f5e868a10a191442 [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 5
; REQUIRES: x86-registered-target
; REQUIRES: aarch64-registered-target
; RUN: opt < %s -passes=rel-lookup-table-converter -relocation-model=pic -mtriple=x86_64-apple-darwin -S | FileCheck -check-prefix=x86_64-apple-darwin %s
; RUN: opt < %s -passes=rel-lookup-table-converter -relocation-model=pic -mtriple=aarch64 -S | FileCheck -check-prefix=aarch64 %s
; RUN: opt < %s -passes=rel-lookup-table-converter -relocation-model=pic -mtriple=x86_64 -S | FileCheck -check-prefix=x86_64 %s
@a0 = private unnamed_addr constant i32 0
@a1 = private unnamed_addr constant i32 1
@a2 = private unnamed_addr constant i32 2
@load_relative_1.table = private unnamed_addr constant [3 x ptr] [ptr @a0, ptr @a1, ptr @a2]
@x0 = internal unnamed_addr constant i64 0
@x1 = internal unnamed_addr constant i64 1
@x2 = internal unnamed_addr constant i64 2
@x3 = internal unnamed_addr constant i64 3
@y0 = internal unnamed_addr constant ptr @x3
@y1 = internal unnamed_addr constant ptr @x2
@y2 = internal unnamed_addr constant ptr @x1
@y3 = internal unnamed_addr constant ptr @x0
@load_relative_2.table = private unnamed_addr constant [4 x ptr] [ptr @y3, ptr @y2, ptr @y1, ptr @y0]
@b0 = private unnamed_addr constant [8 x i8] c"00000000"
@b1 = private unnamed_addr constant [8 x i8] c"11111111"
@b2 = private unnamed_addr constant [8 x i8] c"22222222"
@load_relative_3.table = private unnamed_addr constant [3 x ptr] [
ptr getelementptr inbounds (i8, ptr @b0, i64 8),
ptr getelementptr inbounds (i8, ptr @b1, i64 8),
ptr getelementptr inbounds (i8, ptr @b2, i64 8)]
;.
; x86_64-apple-darwin: @a0 = private constant i32 0
; x86_64-apple-darwin: @a1 = private constant i32 1
; x86_64-apple-darwin: @a2 = private constant i32 2
; x86_64-apple-darwin: @load_relative_1.table.rel = private unnamed_addr constant [3 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @a0 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @a1 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @a2 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32)], align 4
; x86_64-apple-darwin: @x0 = internal unnamed_addr constant i64 0
; x86_64-apple-darwin: @x1 = internal unnamed_addr constant i64 1
; x86_64-apple-darwin: @x2 = internal unnamed_addr constant i64 2
; x86_64-apple-darwin: @x3 = internal unnamed_addr constant i64 3
; x86_64-apple-darwin: @y0 = internal constant ptr @x3
; x86_64-apple-darwin: @y1 = internal constant ptr @x2
; x86_64-apple-darwin: @y2 = internal constant ptr @x1
; x86_64-apple-darwin: @y3 = internal constant ptr @x0
; x86_64-apple-darwin: @load_relative_2.table.rel = private unnamed_addr constant [4 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @y3 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y2 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y1 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y0 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32)], align 4
; x86_64-apple-darwin: @b0 = private constant [8 x i8] c"00000000"
; x86_64-apple-darwin: @b1 = private constant [8 x i8] c"11111111"
; x86_64-apple-darwin: @b2 = private constant [8 x i8] c"22222222"
; x86_64-apple-darwin: @load_relative_3.table.rel = private unnamed_addr constant [3 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr @b0, i64 8) to i64), i64 ptrtoint (ptr @load_relative_3.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr @b1, i64 8) to i64), i64 ptrtoint (ptr @load_relative_3.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr @b2, i64 8) to i64), i64 ptrtoint (ptr @load_relative_3.table.rel to i64)) to i32)], align 4
;.
; aarch64: @a0 = private constant i32 0
; aarch64: @a1 = private constant i32 1
; aarch64: @a2 = private constant i32 2
; aarch64: @load_relative_1.table.rel = private unnamed_addr constant [3 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @a0 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @a1 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @a2 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32)], align 4
; aarch64: @x0 = internal unnamed_addr constant i64 0
; aarch64: @x1 = internal unnamed_addr constant i64 1
; aarch64: @x2 = internal unnamed_addr constant i64 2
; aarch64: @x3 = internal unnamed_addr constant i64 3
; aarch64: @y0 = internal constant ptr @x3
; aarch64: @y1 = internal constant ptr @x2
; aarch64: @y2 = internal constant ptr @x1
; aarch64: @y3 = internal constant ptr @x0
; aarch64: @load_relative_2.table.rel = private unnamed_addr constant [4 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @y3 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y2 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y1 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y0 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32)], align 4
; aarch64: @b0 = private constant [8 x i8] c"00000000"
; aarch64: @b1 = private constant [8 x i8] c"11111111"
; aarch64: @b2 = private constant [8 x i8] c"22222222"
; aarch64: @load_relative_3.table.rel = private unnamed_addr constant [3 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr @b0, i64 8) to i64), i64 ptrtoint (ptr @load_relative_3.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr @b1, i64 8) to i64), i64 ptrtoint (ptr @load_relative_3.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr @b2, i64 8) to i64), i64 ptrtoint (ptr @load_relative_3.table.rel to i64)) to i32)], align 4
;.
; x86_64: @a0 = private unnamed_addr constant i32 0
; x86_64: @a1 = private unnamed_addr constant i32 1
; x86_64: @a2 = private unnamed_addr constant i32 2
; x86_64: @load_relative_1.table.rel = private unnamed_addr constant [3 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @a0 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @a1 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @a2 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32)], align 4
; x86_64: @x0 = internal unnamed_addr constant i64 0
; x86_64: @x1 = internal unnamed_addr constant i64 1
; x86_64: @x2 = internal unnamed_addr constant i64 2
; x86_64: @x3 = internal unnamed_addr constant i64 3
; x86_64: @y0 = internal unnamed_addr constant ptr @x3
; x86_64: @y1 = internal unnamed_addr constant ptr @x2
; x86_64: @y2 = internal unnamed_addr constant ptr @x1
; x86_64: @y3 = internal unnamed_addr constant ptr @x0
; x86_64: @load_relative_2.table.rel = private unnamed_addr constant [4 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @y3 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y2 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y1 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y0 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32)], align 4
; x86_64: @b0 = private unnamed_addr constant [8 x i8] c"00000000"
; x86_64: @b1 = private unnamed_addr constant [8 x i8] c"11111111"
; x86_64: @b2 = private unnamed_addr constant [8 x i8] c"22222222"
; x86_64: @load_relative_3.table.rel = private unnamed_addr constant [3 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr @b0, i64 8) to i64), i64 ptrtoint (ptr @load_relative_3.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr @b1, i64 8) to i64), i64 ptrtoint (ptr @load_relative_3.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr getelementptr inbounds (i8, ptr @b2, i64 8) to i64), i64 ptrtoint (ptr @load_relative_3.table.rel to i64)) to i32)], align 4
;.
define ptr @load_relative_1(i64 %offset) {
; x86_64-apple-darwin-LABEL: define ptr @load_relative_1(
; x86_64-apple-darwin-SAME: i64 [[OFFSET:%.*]]) {
; x86_64-apple-darwin-NEXT: [[RELTABLE_SHIFT:%.*]] = shl i64 [[OFFSET]], 2
; x86_64-apple-darwin-NEXT: [[RELTABLE_INTRINSIC:%.*]] = call ptr @llvm.load.relative.i64(ptr @load_relative_1.table.rel, i64 [[RELTABLE_SHIFT]])
; x86_64-apple-darwin-NEXT: ret ptr [[RELTABLE_INTRINSIC]]
;
; aarch64-LABEL: define ptr @load_relative_1(
; aarch64-SAME: i64 [[OFFSET:%.*]]) {
; aarch64-NEXT: [[RELTABLE_SHIFT:%.*]] = shl i64 [[OFFSET]], 2
; aarch64-NEXT: [[RELTABLE_INTRINSIC:%.*]] = call ptr @llvm.load.relative.i64(ptr @load_relative_1.table.rel, i64 [[RELTABLE_SHIFT]])
; aarch64-NEXT: ret ptr [[RELTABLE_INTRINSIC]]
;
; x86_64-LABEL: define ptr @load_relative_1(
; x86_64-SAME: i64 [[OFFSET:%.*]]) {
; x86_64-NEXT: [[RELTABLE_SHIFT:%.*]] = shl i64 [[OFFSET]], 2
; x86_64-NEXT: [[RELTABLE_INTRINSIC:%.*]] = call ptr @llvm.load.relative.i64(ptr @load_relative_1.table.rel, i64 [[RELTABLE_SHIFT]])
; x86_64-NEXT: ret ptr [[RELTABLE_INTRINSIC]]
;
%gep = getelementptr inbounds [3 x ptr], ptr @load_relative_1.table, i64 0, i64 %offset
%load = load ptr, ptr %gep
ret ptr %load
}
define ptr @load_relative_2(i64 %offset) {
; x86_64-apple-darwin-LABEL: define ptr @load_relative_2(
; x86_64-apple-darwin-SAME: i64 [[OFFSET:%.*]]) {
; x86_64-apple-darwin-NEXT: [[RELTABLE_SHIFT:%.*]] = shl i64 [[OFFSET]], 2
; x86_64-apple-darwin-NEXT: [[RELTABLE_INTRINSIC:%.*]] = call ptr @llvm.load.relative.i64(ptr @load_relative_2.table.rel, i64 [[RELTABLE_SHIFT]])
; x86_64-apple-darwin-NEXT: ret ptr [[RELTABLE_INTRINSIC]]
;
; aarch64-LABEL: define ptr @load_relative_2(
; aarch64-SAME: i64 [[OFFSET:%.*]]) {
; aarch64-NEXT: [[RELTABLE_SHIFT:%.*]] = shl i64 [[OFFSET]], 2
; aarch64-NEXT: [[RELTABLE_INTRINSIC:%.*]] = call ptr @llvm.load.relative.i64(ptr @load_relative_2.table.rel, i64 [[RELTABLE_SHIFT]])
; aarch64-NEXT: ret ptr [[RELTABLE_INTRINSIC]]
;
; x86_64-LABEL: define ptr @load_relative_2(
; x86_64-SAME: i64 [[OFFSET:%.*]]) {
; x86_64-NEXT: [[RELTABLE_SHIFT:%.*]] = shl i64 [[OFFSET]], 2
; x86_64-NEXT: [[RELTABLE_INTRINSIC:%.*]] = call ptr @llvm.load.relative.i64(ptr @load_relative_2.table.rel, i64 [[RELTABLE_SHIFT]])
; x86_64-NEXT: ret ptr [[RELTABLE_INTRINSIC]]
;
%gep = getelementptr inbounds [4 x ptr], ptr @load_relative_2.table, i64 0, i64 %offset
%load = load ptr, ptr %gep
ret ptr %load
}
define ptr @load_relative_3(i64 %offset) {
; x86_64-apple-darwin-LABEL: define ptr @load_relative_3(
; x86_64-apple-darwin-SAME: i64 [[OFFSET:%.*]]) {
; x86_64-apple-darwin-NEXT: [[RELTABLE_SHIFT:%.*]] = shl i64 [[OFFSET]], 2
; x86_64-apple-darwin-NEXT: [[RELTABLE_INTRINSIC:%.*]] = call ptr @llvm.load.relative.i64(ptr @load_relative_3.table.rel, i64 [[RELTABLE_SHIFT]])
; x86_64-apple-darwin-NEXT: ret ptr [[RELTABLE_INTRINSIC]]
;
; aarch64-LABEL: define ptr @load_relative_3(
; aarch64-SAME: i64 [[OFFSET:%.*]]) {
; aarch64-NEXT: [[RELTABLE_SHIFT:%.*]] = shl i64 [[OFFSET]], 2
; aarch64-NEXT: [[RELTABLE_INTRINSIC:%.*]] = call ptr @llvm.load.relative.i64(ptr @load_relative_3.table.rel, i64 [[RELTABLE_SHIFT]])
; aarch64-NEXT: ret ptr [[RELTABLE_INTRINSIC]]
;
; x86_64-LABEL: define ptr @load_relative_3(
; x86_64-SAME: i64 [[OFFSET:%.*]]) {
; x86_64-NEXT: [[RELTABLE_SHIFT:%.*]] = shl i64 [[OFFSET]], 2
; x86_64-NEXT: [[RELTABLE_INTRINSIC:%.*]] = call ptr @llvm.load.relative.i64(ptr @load_relative_3.table.rel, i64 [[RELTABLE_SHIFT]])
; x86_64-NEXT: ret ptr [[RELTABLE_INTRINSIC]]
;
%gep = getelementptr inbounds [3 x ptr], ptr @load_relative_3.table, i64 0, i64 %offset
%load = load ptr, ptr %gep
ret ptr %load
}
;.
; x86_64-apple-darwin: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: read) }
;.
; aarch64: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: read) }
;.
; x86_64: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: read) }
;.