Canonicalize getelementptr instructions for scalable vector types into ptradd representation with an explicit llvm.vscale call. This representation has better support in BasicAA, which can reason about llvm.vscale, but not plain scalable GEPs.
33 lines
1.5 KiB
LLVM
33 lines
1.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
|
|
; RUN: opt -passes=instcombine -S < %s | FileCheck %s
|
|
|
|
define <vscale x 4 x i32> @load(ptr %x) {
|
|
; CHECK-LABEL: define <vscale x 4 x i32> @load
|
|
; CHECK-SAME: (ptr [[X:%.*]]) {
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.vscale.i64()
|
|
; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[TMP1]], 4
|
|
; CHECK-NEXT: [[A_ELT1:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 [[TMP2]]
|
|
; CHECK-NEXT: [[A_UNPACK2:%.*]] = load <vscale x 4 x i32>, ptr [[A_ELT1]], align 16
|
|
; CHECK-NEXT: ret <vscale x 4 x i32> [[A_UNPACK2]]
|
|
;
|
|
%a = load [2 x <vscale x 4 x i32>], ptr %x
|
|
%b = extractvalue [2 x <vscale x 4 x i32>] %a, 1
|
|
ret <vscale x 4 x i32> %b
|
|
}
|
|
|
|
define void @store(ptr %x, <vscale x 4 x i32> %y, <vscale x 4 x i32> %z) {
|
|
; CHECK-LABEL: define void @store
|
|
; CHECK-SAME: (ptr [[X:%.*]], <vscale x 4 x i32> [[Y:%.*]], <vscale x 4 x i32> [[Z:%.*]]) {
|
|
; CHECK-NEXT: store <vscale x 4 x i32> [[Y]], ptr [[X]], align 16
|
|
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.vscale.i64()
|
|
; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[TMP1]], 4
|
|
; CHECK-NEXT: [[X_REPACK1:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 [[TMP2]]
|
|
; CHECK-NEXT: store <vscale x 4 x i32> [[Z]], ptr [[X_REPACK1]], align 16
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%a = insertvalue [2 x <vscale x 4 x i32>] poison, <vscale x 4 x i32> %y, 0
|
|
%b = insertvalue [2 x <vscale x 4 x i32>] %a, <vscale x 4 x i32> %z, 1
|
|
store [2 x <vscale x 4 x i32>] %b, ptr %x
|
|
ret void
|
|
}
|