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