; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 ; RUN: opt -S -passes=instcombine < %s | FileCheck %s target triple = "aarch64-unknown-linux-gnu" define @test_ld1(ptr %a) #0 { ; CHECK-LABEL: define @test_ld1( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %res = call @llvm.aarch64.sve.ld1.nxv16i8( zeroinitializer, ptr %a) ret %res } define @test_ld1_gather(ptr %a, %b) #0 { ; CHECK-LABEL: define @test_ld1_gather( ; CHECK-SAME: ptr [[A:%.*]], [[B:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ld1.gather.nxv4i32( zeroinitializer, ptr %a, %b) ret %0 } define @test_ld1_gather_index(ptr %a, %b) #0 { ; CHECK-LABEL: define @test_ld1_gather_index( ; CHECK-SAME: ptr [[A:%.*]], [[B:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ld1.gather.index.nxv2i64( zeroinitializer, ptr %a, %b) ret %0 } define @test_ld1_gather_scalar_offset( %a) #0 { ; CHECK-LABEL: define @test_ld1_gather_scalar_offset( ; CHECK-SAME: [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ld1.gather.scalar.offset.nxv4i32.nxv4i32( zeroinitializer, %a, i64 0) ret %0 } define @test_ld1_gather_sxtw(ptr %b, %a) #0 { ; CHECK-LABEL: define @test_ld1_gather_sxtw( ; CHECK-SAME: ptr [[B:%.*]], [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ld1.gather.sxtw.nxv4i32( zeroinitializer, ptr %b, %a) ret %0 } define @test_ld1_gather_sxtw_index(ptr %b, %a) #0 { ; CHECK-LABEL: define @test_ld1_gather_sxtw_index( ; CHECK-SAME: ptr [[B:%.*]], [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ld1.gather.sxtw.index.nxv4i32( zeroinitializer, ptr %b, %a) ret %0 } define @test_ld1_gather_uxtw(ptr %b, %a) #0 { ; CHECK-LABEL: define @test_ld1_gather_uxtw( ; CHECK-SAME: ptr [[B:%.*]], [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ld1.gather.uxtw.nxv4i32( zeroinitializer, ptr %b, %a) ret %0 } define @test_ld1_gather_uxtw_index(ptr %b, %a) #0 { ; CHECK-LABEL: define @test_ld1_gather_uxtw_index( ; CHECK-SAME: ptr [[B:%.*]], [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ld1.gather.uxtw.index.nxv4i32( zeroinitializer, ptr %b, %a) ret %0 } define @test_ld1q_gather_index(ptr %a, %b) #0 { ; CHECK-LABEL: define @test_ld1q_gather_index( ; CHECK-SAME: ptr [[A:%.*]], [[B:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ld1q.gather.index.nxv2i64( zeroinitializer, ptr %a, %b) ret %0 } define @test_ld1q_gather_scalar_offset( %a) #0 { ; CHECK-LABEL: define @test_ld1q_gather_scalar_offset( ; CHECK-SAME: [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ld1q.gather.scalar.offset.nxv8i16.nxv2i64( zeroinitializer, %a, i64 0) ret %0 } define @test_ld1q_gather_vector_offset(ptr %a, %b) #0 { ; CHECK-LABEL: define @test_ld1q_gather_vector_offset( ; CHECK-SAME: ptr [[A:%.*]], [[B:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ld1q.gather.vector.offset.nxv16i8( zeroinitializer, ptr %a, %b) ret %0 } define @test_ld1ro(ptr %a) #0 { ; CHECK-LABEL: define @test_ld1ro( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %res = call @llvm.aarch64.sve.ld1ro.nxv16i8( zeroinitializer, ptr %a) ret %res } define @test_ld1rq(ptr %a) #0 { ; CHECK-LABEL: define @test_ld1rq( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %res = call @llvm.aarch64.sve.ld1rq.nxv16i8( zeroinitializer, ptr %a) ret %res } define @test_ld1udq(ptr %a) #0 { ; CHECK-LABEL: define @test_ld1udq( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %res = call @llvm.aarch64.sve.ld1udq.nxv2i64( zeroinitializer, ptr %a) ret %res } define @test_ld1uwq(ptr %a) #0 { ; CHECK-LABEL: define @test_ld1uwq( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %res = call @llvm.aarch64.sve.ld1uwq.nxv4i32( zeroinitializer, ptr %a) ret %res } define @test_ld2_sret(ptr %a) #0 { ; CHECK-LABEL: define @test_ld2_sret( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call { , } @llvm.aarch64.sve.ld2.sret.nxv8i16( zeroinitializer, ptr %a) %1 = extractvalue { , } %0, 0 ret %1 } define @test_ld2q_sret(ptr %a) #0 { ; CHECK-LABEL: define @test_ld2q_sret( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call { , } @llvm.aarch64.sve.ld2q.sret.nxv8i16( zeroinitializer, ptr %a) %1 = extractvalue { , } %0, 0 ret %1 } define @test_ld3(ptr %a) #0 { ; CHECK-LABEL: define @test_ld3( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call { , , } @llvm.aarch64.sve.ld3.sret.nxv8i16( zeroinitializer, ptr %a) %1 = extractvalue { , , } %0, 0 ret %1 } define @test_ld3q(ptr %a) #0 { ; CHECK-LABEL: define @test_ld3q( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call { , , } @llvm.aarch64.sve.ld3q.sret.nxv8i16( zeroinitializer, ptr %a) %1 = extractvalue { , , } %0, 0 ret %1 } define @test_ld4(ptr %a) #0 { ; CHECK-LABEL: define @test_ld4( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call { , , , } @llvm.aarch64.sve.ld4.sret.nxv8i16( zeroinitializer, ptr %a) %1 = extractvalue { , , , } %0, 0 ret %1 } define @test_ld4q(ptr %a) #0 { ; CHECK-LABEL: define @test_ld4q( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call { , , , } @llvm.aarch64.sve.ld4q.sret.nxv8i16( zeroinitializer, ptr %a) %1 = extractvalue { , , , } %0, 0 ret %1 } define @test_ldff1(ptr %a) #0 { ; CHECK-LABEL: define @test_ldff1( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldff1.nxv8i16( zeroinitializer, ptr %a) ret %0 } define @test_ldff1_gather(ptr %a, %b) #0 { ; CHECK-LABEL: define @test_ldff1_gather( ; CHECK-SAME: ptr [[A:%.*]], [[B:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldff1.gather.nxv4i32( zeroinitializer, ptr %a, %b) ret %0 } define @test_ldff1_gather_index(ptr %a, %b) #0 { ; CHECK-LABEL: define @test_ldff1_gather_index( ; CHECK-SAME: ptr [[A:%.*]], [[B:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldff1.gather.index.nxv2i64( zeroinitializer, ptr %a, %b) ret %0 } define @test_ldff1_gather_scalar_offset( %a) #0 { ; CHECK-LABEL: define @test_ldff1_gather_scalar_offset( ; CHECK-SAME: [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldff1.gather.scalar.offset.nxv4i32.nxv4i32( zeroinitializer, %a, i64 0) ret %0 } define @test_ldff1_gather_sxtw(ptr %b, %a) #0 { ; CHECK-LABEL: define @test_ldff1_gather_sxtw( ; CHECK-SAME: ptr [[B:%.*]], [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldff1.gather.sxtw.nxv4i32( zeroinitializer, ptr %b, %a) ret %0 } define @test_ldff1_gather_sxtw_index(ptr %b, %a) #0 { ; CHECK-LABEL: define @test_ldff1_gather_sxtw_index( ; CHECK-SAME: ptr [[B:%.*]], [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldff1.gather.sxtw.index.nxv4i32( zeroinitializer, ptr %b, %a) ret %0 } define @test_ldff1_gather_uxtw(ptr %b, %a) #0 { ; CHECK-LABEL: define @test_ldff1_gather_uxtw( ; CHECK-SAME: ptr [[B:%.*]], [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldff1.gather.uxtw.nxv4i32( zeroinitializer, ptr %b, %a) ret %0 } define @test_ldff1_gather_uxtw_index(ptr %b, %a) #0 { ; CHECK-LABEL: define @test_ldff1_gather_uxtw_index( ; CHECK-SAME: ptr [[B:%.*]], [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldff1.gather.uxtw.index.nxv4i32( zeroinitializer, ptr %b, %a) ret %0 } define @test_ldnf1(ptr %a) #0 { ; CHECK-LABEL: define @test_ldnf1( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldnf1.nxv16i8( zeroinitializer, ptr %a) ret %0 } define @test_ldnt1(ptr %a) #0 { ; CHECK-LABEL: define @test_ldnt1( ; CHECK-SAME: ptr [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldnt1.nxv8i16( zeroinitializer, ptr %a) ret %0 } define @test_ldnt1_gather(ptr %a, %b) #0 { ; CHECK-LABEL: define @test_ldnt1_gather( ; CHECK-SAME: ptr [[A:%.*]], [[B:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldnt1.gather.nxv4i32( zeroinitializer, ptr %a, %b) ret %0 } define @test_ldnt1_gather_index(ptr %a, %b) #0 { ; CHECK-LABEL: define @test_ldnt1_gather_index( ; CHECK-SAME: ptr [[A:%.*]], [[B:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldnt1.gather.index.nxv2i64( zeroinitializer, ptr %a, %b) ret %0 } define @test_ldnt1_gather_scalar_offset( %a) #0 { ; CHECK-LABEL: define @test_ldnt1_gather_scalar_offset( ; CHECK-SAME: [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldnt1.gather.scalar.offset.nxv4i32.nxv4i32( zeroinitializer, %a, i64 0) ret %0 } define @test_ldnt1_gather_uxtw(ptr %b, %a) #0 { ; CHECK-LABEL: define @test_ldnt1_gather_uxtw( ; CHECK-SAME: ptr [[B:%.*]], [[A:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: ret zeroinitializer ; entry: %0 = tail call @llvm.aarch64.sve.ldnt1.gather.uxtw.nxv4i32( zeroinitializer, ptr %b, %a) ret %0 }