110 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -mcpu=gfx900 -amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s3; RUN: opt -S -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s4 5target triple = "amdgcn--"6 7define void @scalar_copy(ptr %a, ptr %b) {8; CHECK-LABEL: define void @scalar_copy9; CHECK-SAME: (ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0:[0-9]+]] {10; CHECK-NEXT: [[X:%.*]] = load i160, ptr [[A]], align 3211; CHECK-NEXT: [[TMP1:%.*]] = lshr i160 [[X]], 3212; CHECK-NEXT: [[TMP2:%.*]] = trunc i160 [[TMP1]] to i12813; CHECK-NEXT: [[X_PTR_RSRC:%.*]] = inttoptr i128 [[TMP2]] to ptr addrspace(8)14; CHECK-NEXT: [[X_PTR_OFF:%.*]] = trunc i160 [[X]] to i3215; CHECK-NEXT: [[B1:%.*]] = getelementptr i160, ptr [[B]], i64 116; CHECK-NEXT: store i160 [[X]], ptr [[B1]], align 3217; CHECK-NEXT: ret void18;19 %x = load ptr addrspace(7), ptr %a20 %b1 = getelementptr ptr addrspace(7), ptr %b, i64 121 store ptr addrspace(7) %x, ptr %b122 ret void23}24 25define void @vector_copy(ptr %a, ptr %b) {26; CHECK-LABEL: define void @vector_copy27; CHECK-SAME: (ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {28; CHECK-NEXT: [[X:%.*]] = load <4 x i160>, ptr [[A]], align 12829; CHECK-NEXT: [[TMP1:%.*]] = lshr <4 x i160> [[X]], splat (i160 32)30; CHECK-NEXT: [[TMP2:%.*]] = trunc <4 x i160> [[TMP1]] to <4 x i128>31; CHECK-NEXT: [[X_PTR_RSRC:%.*]] = inttoptr <4 x i128> [[TMP2]] to <4 x ptr addrspace(8)>32; CHECK-NEXT: [[X_PTR_OFF:%.*]] = trunc <4 x i160> [[X]] to <4 x i32>33; CHECK-NEXT: [[B1:%.*]] = getelementptr <4 x i160>, ptr [[B]], i64 234; CHECK-NEXT: store <4 x i160> [[X]], ptr [[B1]], align 12835; CHECK-NEXT: ret void36;37 %x = load <4 x ptr addrspace(7)>, ptr %a38 %b1 = getelementptr <4 x ptr addrspace(7)>, ptr %b, i64 239 store <4 x ptr addrspace(7)> %x, ptr %b140 ret void41}42 43define void @alloca(ptr %a, ptr %b) {44; CHECK-LABEL: define void @alloca45; CHECK-SAME: (ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {46; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [5 x i160], align 32, addrspace(5)47; CHECK-NEXT: [[X:%.*]] = load i160, ptr [[A]], align 3248; CHECK-NEXT: [[TMP1:%.*]] = lshr i160 [[X]], 3249; CHECK-NEXT: [[TMP2:%.*]] = trunc i160 [[TMP1]] to i12850; CHECK-NEXT: [[X_PTR_RSRC:%.*]] = inttoptr i128 [[TMP2]] to ptr addrspace(8)51; CHECK-NEXT: [[X_PTR_OFF:%.*]] = trunc i160 [[X]] to i3252; CHECK-NEXT: [[L:%.*]] = getelementptr i160, ptr addrspace(5) [[ALLOCA]], i32 153; CHECK-NEXT: store i160 [[X]], ptr addrspace(5) [[L]], align 3254; CHECK-NEXT: [[Y:%.*]] = load i160, ptr addrspace(5) [[L]], align 3255; CHECK-NEXT: [[TMP3:%.*]] = lshr i160 [[Y]], 3256; CHECK-NEXT: [[TMP4:%.*]] = trunc i160 [[TMP3]] to i12857; CHECK-NEXT: [[Y_PTR_RSRC:%.*]] = inttoptr i128 [[TMP4]] to ptr addrspace(8)58; CHECK-NEXT: [[Y_PTR_OFF:%.*]] = trunc i160 [[Y]] to i3259; CHECK-NEXT: store i160 [[Y]], ptr [[B]], align 3260; CHECK-NEXT: ret void61;62 %alloca = alloca [5 x ptr addrspace(7)], addrspace(5)63 %x = load ptr addrspace(7), ptr %a64 %l = getelementptr ptr addrspace(7), ptr addrspace(5) %alloca, i32 165 store ptr addrspace(7) %x, ptr addrspace(5) %l66 %y = load ptr addrspace(7), ptr addrspace(5) %l67 store ptr addrspace(7) %y, ptr %b68 ret void69}70 71define void @complex_copy(ptr %a, ptr %b) {72; CHECK-LABEL: define void @complex_copy73; CHECK-SAME: (ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {74; CHECK-NEXT: [[X:%.*]] = load { [2 x i160], i32, i160 }, ptr [[A]], align 3275; CHECK-NEXT: [[TMP1:%.*]] = extractvalue { [2 x i160], i32, i160 } [[X]], 076; CHECK-NEXT: [[TMP2:%.*]] = extractvalue [2 x i160] [[TMP1]], 077; CHECK-NEXT: [[TMP3:%.*]] = lshr i160 [[TMP2]], 3278; CHECK-NEXT: [[TMP4:%.*]] = trunc i160 [[TMP3]] to i12879; CHECK-NEXT: [[X_0_0_PTR_RSRC:%.*]] = inttoptr i128 [[TMP4]] to ptr addrspace(8)80; CHECK-NEXT: [[X_0_0_PTR_OFF:%.*]] = trunc i160 [[TMP2]] to i3281; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[X_0_0_PTR_RSRC]], 082; CHECK-NEXT: [[X_0_0_PTR:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP5]], i32 [[X_0_0_PTR_OFF]], 183; CHECK-NEXT: [[TMP6:%.*]] = insertvalue [2 x { ptr addrspace(8), i32 }] poison, { ptr addrspace(8), i32 } [[X_0_0_PTR]], 084; CHECK-NEXT: [[TMP7:%.*]] = extractvalue [2 x i160] [[TMP1]], 185; CHECK-NEXT: [[TMP8:%.*]] = lshr i160 [[TMP7]], 3286; CHECK-NEXT: [[TMP9:%.*]] = trunc i160 [[TMP8]] to i12887; CHECK-NEXT: [[X_0_1_PTR_RSRC:%.*]] = inttoptr i128 [[TMP9]] to ptr addrspace(8)88; CHECK-NEXT: [[X_0_1_PTR_OFF:%.*]] = trunc i160 [[TMP7]] to i3289; CHECK-NEXT: [[TMP10:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[X_0_1_PTR_RSRC]], 090; CHECK-NEXT: [[X_0_1_PTR:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP10]], i32 [[X_0_1_PTR_OFF]], 191; CHECK-NEXT: [[TMP11:%.*]] = insertvalue [2 x { ptr addrspace(8), i32 }] [[TMP6]], { ptr addrspace(8), i32 } [[X_0_1_PTR]], 192; CHECK-NEXT: [[TMP12:%.*]] = insertvalue { [2 x { ptr addrspace(8), i32 }], i32, { ptr addrspace(8), i32 } } poison, [2 x { ptr addrspace(8), i32 }] [[TMP11]], 093; CHECK-NEXT: [[TMP13:%.*]] = extractvalue { [2 x i160], i32, i160 } [[X]], 194; CHECK-NEXT: [[TMP14:%.*]] = insertvalue { [2 x { ptr addrspace(8), i32 }], i32, { ptr addrspace(8), i32 } } [[TMP12]], i32 [[TMP13]], 195; CHECK-NEXT: [[TMP15:%.*]] = extractvalue { [2 x i160], i32, i160 } [[X]], 296; CHECK-NEXT: [[TMP16:%.*]] = lshr i160 [[TMP15]], 3297; CHECK-NEXT: [[TMP17:%.*]] = trunc i160 [[TMP16]] to i12898; CHECK-NEXT: [[X_2_PTR_RSRC:%.*]] = inttoptr i128 [[TMP17]] to ptr addrspace(8)99; CHECK-NEXT: [[X_2_PTR_OFF:%.*]] = trunc i160 [[TMP15]] to i32100; CHECK-NEXT: [[TMP18:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[X_2_PTR_RSRC]], 0101; CHECK-NEXT: [[X_2_PTR:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP18]], i32 [[X_2_PTR_OFF]], 1102; CHECK-NEXT: [[TMP19:%.*]] = insertvalue { [2 x { ptr addrspace(8), i32 }], i32, { ptr addrspace(8), i32 } } [[TMP14]], { ptr addrspace(8), i32 } [[X_2_PTR]], 2103; CHECK-NEXT: store { [2 x i160], i32, i160 } [[X]], ptr [[B]], align 32104; CHECK-NEXT: ret void105;106 %x = load {[2 x ptr addrspace(7)], i32, ptr addrspace(7)}, ptr %a107 store {[2 x ptr addrspace(7)], i32, ptr addrspace(7)} %x, ptr %b108 ret void109}110