; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -passes=instcombine,dce < %s | FileCheck %s target triple = "aarch64-unknown-linux-gnu" ;; ;; Gathers. ;; define @test_ld1_gather_index_nxv2f64_stride1( %pred, ptr %x, i64 %base) #0 { ; CHECK-LABEL: @test_ld1_gather_index_nxv2f64_stride1( ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr double, ptr [[X:%.*]], i64 [[BASE:%.*]] ; CHECK-NEXT: [[LD:%.*]] = call @llvm.masked.load.nxv2f64.p0(ptr [[TMP1]], i32 1, [[PRED:%.*]], zeroinitializer) ; CHECK-NEXT: ret [[LD]] ; %idx = tail call @llvm.aarch64.sve.index.nxv2i64(i64 %base, i64 1) %ld = tail call @llvm.aarch64.sve.ld1.gather.index.nxv2f64( %pred, ptr %x, %idx) ret %ld } define @test_ld1_gather_index_nxv2f64_stride2_negtest( %pred, ptr %x, i64 %base) #0 { ; CHECK-LABEL: @test_ld1_gather_index_nxv2f64_stride2_negtest( ; CHECK-NEXT: [[IDX:%.*]] = tail call @llvm.aarch64.sve.index.nxv2i64(i64 [[BASE:%.*]], i64 2) ; CHECK-NEXT: [[LD:%.*]] = tail call @llvm.aarch64.sve.ld1.gather.index.nxv2f64( [[PRED:%.*]], ptr [[X:%.*]], [[IDX]]) ; CHECK-NEXT: ret [[LD]] ; %idx = tail call @llvm.aarch64.sve.index.nxv2i64(i64 %base, i64 2) %ld = tail call @llvm.aarch64.sve.ld1.gather.index.nxv2f64( %pred, ptr %x, %idx) ret %ld } define @test_ld1_gather_index_nxv2f64_stride1_align8( %pred, ptr align 8 %x, i64 %base) #0 { ; CHECK-LABEL: @test_ld1_gather_index_nxv2f64_stride1_align8( ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr double, ptr [[X:%.*]], i64 [[BASE:%.*]] ; CHECK-NEXT: [[LD:%.*]] = call @llvm.masked.load.nxv2f64.p0(ptr [[TMP1]], i32 8, [[PRED:%.*]], zeroinitializer) ; CHECK-NEXT: ret [[LD]] ; %idx = tail call @llvm.aarch64.sve.index.nxv2i64(i64 %base, i64 1) %ld = tail call @llvm.aarch64.sve.ld1.gather.index.nxv2f64( %pred, ptr %x, %idx) ret %ld } ;; ;; Scatters. ;; define void @test_st1_scatter_index_nxv2f64_stride1( %pred, ptr %x, i64 %base, %val) #0 { ; CHECK-LABEL: @test_st1_scatter_index_nxv2f64_stride1( ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr double, ptr [[X:%.*]], i64 [[BASE:%.*]] ; CHECK-NEXT: call void @llvm.masked.store.nxv2f64.p0( [[VAL:%.*]], ptr [[TMP1]], i32 1, [[PRED:%.*]]) ; CHECK-NEXT: ret void ; %idx = tail call @llvm.aarch64.sve.index.nxv2i64(i64 %base, i64 1) tail call void @llvm.aarch64.sve.st1.scatter.index.nxv2f64( %val, %pred, ptr %x, %idx) ret void } define void @test_st1_scatter_index_nxv2f64_stride2_negtest( %pred, ptr %x, i64 %base, %val) #0 { ; CHECK-LABEL: @test_st1_scatter_index_nxv2f64_stride2_negtest( ; CHECK-NEXT: [[IDX:%.*]] = tail call @llvm.aarch64.sve.index.nxv2i64(i64 [[BASE:%.*]], i64 2) ; CHECK-NEXT: tail call void @llvm.aarch64.sve.st1.scatter.index.nxv2f64( [[VAL:%.*]], [[PRED:%.*]], ptr [[X:%.*]], [[IDX]]) ; CHECK-NEXT: ret void ; %idx = tail call @llvm.aarch64.sve.index.nxv2i64(i64 %base, i64 2) tail call void @llvm.aarch64.sve.st1.scatter.index.nxv2f64( %val, %pred, ptr %x, %idx) ret void } define void @test_st1_scatter_index_nxv2f64_stride1_align8( %pred, ptr align 8 %x, i64 %base, %val) #0 { ; CHECK-LABEL: @test_st1_scatter_index_nxv2f64_stride1_align8( ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr double, ptr [[X:%.*]], i64 [[BASE:%.*]] ; CHECK-NEXT: call void @llvm.masked.store.nxv2f64.p0( [[VAL:%.*]], ptr [[TMP1]], i32 8, [[PRED:%.*]]) ; CHECK-NEXT: ret void ; %idx = tail call @llvm.aarch64.sve.index.nxv2i64(i64 %base, i64 1) tail call void @llvm.aarch64.sve.st1.scatter.index.nxv2f64( %val, %pred, ptr %x, %idx) ret void } declare @llvm.aarch64.sve.index.nxv2i64(i64, i64) declare @llvm.aarch64.sve.ld1.gather.index.nxv2f64(, ptr, ) declare void @llvm.aarch64.sve.st1.scatter.index.nxv2f64(, , ptr, ) attributes #0 = { "target-features"="+sve" }