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