; 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" ; The follow tests verify the mechanics of simplification. The operation is not ; important beyond being commutative with a known identity value. define @commute_constant_to_rhs( %pg, %a) #0 { ; CHECK-LABEL: define @commute_constant_to_rhs( ; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.mul.u.nxv4i32( [[PG]], [[A]], splat (i32 303)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.mul.u.nxv4i32( %pg, splat (i32 303), %a) ret %r } ; Operation is not commutative. define @cannot_commute_constant_to_rhs_1( %pg, %a) #0 { ; CHECK-LABEL: define @cannot_commute_constant_to_rhs_1( ; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.sub.u.nxv4i32( [[PG]], splat (i32 303), [[A]]) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.sub.u.nxv4i32( %pg, splat (i32 303), %a) ret %r } ; Inactive lanes are important, which make the operation non-commutative. define @cannot_commute_constant_to_rhs_2( %pg, %a) #0 { ; CHECK-LABEL: define @cannot_commute_constant_to_rhs_2( ; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.mul.nxv4i32( [[PG]], splat (i32 303), [[A]]) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.mul.nxv4i32( %pg, splat (i32 303), %a) ret %r } define @idempotent_mul( %pg, %a) #0 { ; CHECK-LABEL: define @idempotent_mul( ; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret [[A]] ; %r = call @llvm.aarch64.sve.mul.nxv4i32( %pg, %a, splat (i32 1)) ret %r } define @idempotent_mul_ops_reverse( %pg, %a) #0 { ; CHECK-LABEL: define @idempotent_mul_ops_reverse( ; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], [[A]], splat (i32 1) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.mul.nxv4i32( %pg, splat (i32 1), %a) ret %r } define @idempotent_mul_u( %pg, %a) #0 { ; CHECK-LABEL: define @idempotent_mul_u( ; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret [[A]] ; %r = call @llvm.aarch64.sve.mul.u.nxv4i32( %pg, %a, splat (i32 1)) ret %r } define @idempotent_mul_u_ops_reverse( %pg, %a) #0 { ; CHECK-LABEL: define @idempotent_mul_u_ops_reverse( ; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret [[A]] ; %r = call @llvm.aarch64.sve.mul.u.nxv4i32( %pg, splat (i32 1), %a) ret %r } ; Show that we only need to know the active lanes are constant. ; TODO: We can do better here because we can use %a directly as part of the ; select because we know only its inactive lanes will be used. define @constant_mul_after_striping_inactive_lanes( %pg, %a, %b) #0 { ; CHECK-LABEL: define @constant_mul_after_striping_inactive_lanes( ; CHECK-SAME: [[PG:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[A_DUP:%.*]] = call @llvm.aarch64.sve.dup.nxv4i32( [[A]], [[PG]], i32 3) ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 6), [[A_DUP]] ; CHECK-NEXT: ret [[R]] ; %a.dup = call @llvm.aarch64.sve.dup.nxv4i32( %a, %pg, i32 3) %b.dup = call @llvm.aarch64.sve.dup.nxv4i32( %b, %pg, i32 2) %r = call @llvm.aarch64.sve.mul.nxv4i32( %pg, %a.dup, %b.dup) ret %r } ; Show that we only need to know the active lanes are constant. define @constant_mul_u_after_striping_inactive_lanes( %pg, %a, %b) #0 { ; CHECK-LABEL: define @constant_mul_u_after_striping_inactive_lanes( ; CHECK-SAME: [[PG:%.*]], [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i32 6) ; %a.dup = call @llvm.aarch64.sve.dup.nxv4i32( %a, %pg, i32 3) %b.dup = call @llvm.aarch64.sve.dup.nxv4i32( %b, %pg, i32 2) %3 = call @llvm.aarch64.sve.mul.u.nxv4i32( %pg, %a.dup, %b.dup) ret %3 } ; SVE intrinsics don't have the same poison propagation rules as the IR. define @dont_propagate_poison( %pg, %a) #0 { ; CHECK-LABEL: define @dont_propagate_poison( ; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.and.nxv4i32( [[PG]], poison, splat (i32 1)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.and.nxv4i32( %pg, poison, splat (i32 1)) ret %r } ; The follow tests demonstrate the operations for which hooks are in place to ; enable simplification. Given the simplications themselves are common code, it ; is assumed they are already well tested elsewhere. define @constant_add( %pg) #0 { ; CHECK-LABEL: define @constant_add( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 10), splat (i32 7) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.add.nxv4i32( %pg, splat (i32 7), splat (i32 3)) ret %r } define @constant_add_u( %pg) #0 { ; CHECK-LABEL: define @constant_add_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i32 10) ; %r = call @llvm.aarch64.sve.add.u.nxv4i32( %pg, splat (i32 7), splat (i32 3)) ret %r } define @constant_and( %pg) #0 { ; CHECK-LABEL: define @constant_and( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 6), splat (i32 7) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.and.nxv4i32( %pg, splat (i32 7), splat (i32 14)) ret %r } define @constant_and_u( %pg) #0 { ; CHECK-LABEL: define @constant_and_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i32 6) ; %r = call @llvm.aarch64.sve.and.u.nxv4i32( %pg, splat (i32 7), splat (i32 14)) ret %r } define @constant_eor( %pg) #0 { ; CHECK-LABEL: define @constant_eor( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 4), splat (i32 7) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.eor.nxv4i32( %pg, splat (i32 7), splat (i32 3)) ret %r } define @constant_eor_u( %pg) #0 { ; CHECK-LABEL: define @constant_eor_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i32 4) ; %r = call @llvm.aarch64.sve.eor.u.nxv4i32( %pg, splat (i32 7), splat (i32 3)) ret %r } define @constant_fadd( %pg) #0 { ; CHECK-LABEL: define @constant_fadd( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (float 1.300000e+01), splat (float 7.000000e+00) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.fadd.nxv4f32( %pg, splat (float 7.0), splat (float 6.0)) ret %r } define @constant_fadd_u( %pg) #0 { ; CHECK-LABEL: define @constant_fadd_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (float 1.300000e+01) ; %r = call @llvm.aarch64.sve.fadd.u.nxv4f32( %pg, splat (float 7.0), splat (float 6.0)) ret %r } define @constant_fdiv( %pg) #0 { ; CHECK-LABEL: define @constant_fdiv( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (float 2.000000e+00), splat (float 1.200000e+01) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.fdiv.nxv4f32( %pg, splat (float 12.0), splat (float 6.0)) ret %r } define @constant_fdiv_u( %pg) #0 { ; CHECK-LABEL: define @constant_fdiv_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (float f0x3F955555) ; %r = call @llvm.aarch64.sve.fdiv.u.nxv4f32( %pg, splat (float 7.0), splat (float 6.0)) ret %r } define @constant_fdivr( %pg) #0 { ; CHECK-LABEL: define @constant_fdivr( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.fdivr.nxv4f32( [[PG]], splat (float 6.000000e+00), splat (float 1.200000e+01)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.fdivr.nxv4f32( %pg, splat (float 6.0), splat (float 12.0)) ret %r } define @constant_fmul( %pg) #0 { ; CHECK-LABEL: define @constant_fmul( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (float 4.200000e+01), splat (float 7.000000e+00) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.fmul.nxv4f32( %pg, splat (float 7.0), splat (float 6.0)) ret %r } define @constant_fmul_u( %pg) #0 { ; CHECK-LABEL: define @constant_fmul_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (float 4.200000e+01) ; %r = call @llvm.aarch64.sve.fmul.u.nxv4f32( %pg, splat (float 7.0), splat (float 6.0)) ret %r } define @constant_fsub( %pg) #0 { ; CHECK-LABEL: define @constant_fsub( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (float 1.000000e+00), splat (float 7.000000e+00) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.fsub.nxv4f32( %pg, splat (float 7.0), splat (float 6.0)) ret %r } define @constant_fsub_u( %pg) #0 { ; CHECK-LABEL: define @constant_fsub_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (float 1.000000e+00) ; %r = call @llvm.aarch64.sve.fsub.u.nxv4f32( %pg, splat (float 7.0), splat (float 6.0)) ret %r } define @constant_fsubr( %pg) #0 { ; CHECK-LABEL: define @constant_fsubr( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.fsubr.nxv4f32( [[PG]], splat (float 6.000000e+00), splat (float 7.000000e+00)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.fsubr.nxv4f32( %pg, splat (float 6.0), splat (float 7.0)) ret %r } define @constant_mul( %pg) #0 { ; CHECK-LABEL: define @constant_mul( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 21), splat (i32 7) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.mul.nxv4i32( %pg, splat (i32 7), splat (i32 3)) ret %r } define @constant_mul_u( %pg) #0 { ; CHECK-LABEL: define @constant_mul_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i32 21) ; %r = call @llvm.aarch64.sve.mul.u.nxv4i32( %pg, splat (i32 7), splat (i32 3)) ret %r } define @constant_orr( %pg) #0 { ; CHECK-LABEL: define @constant_orr( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 15), splat (i32 13) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.orr.nxv4i32( %pg, splat (i32 13), splat (i32 3)) ret %r } define @constant_orr_u( %pg) #0 { ; CHECK-LABEL: define @constant_orr_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i32 15) ; %r = call @llvm.aarch64.sve.orr.u.nxv4i32( %pg, splat (i32 13), splat (i32 3)) ret %r } define @constant_sdiv( %pg) #0 { ; CHECK-LABEL: define @constant_sdiv( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 -2), splat (i32 -7) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.sdiv.nxv4i32( %pg, splat (i32 -7), splat (i32 3)) ret %r } ; The intrinsic's IR equivalent does not support divide-by-zero. define @constant_sdiv_by_zero( %pg) #0 { ; CHECK-LABEL: define @constant_sdiv_by_zero( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.sdiv.nxv4i32( [[PG]], splat (i32 -7), zeroinitializer) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.sdiv.nxv4i32( %pg, splat (i32 -7), splat (i32 0)) ret %r } ; The intrinsic's IR equivalent does not support overflow. define @constant_sdiv_with_overflow( %pg) #0 { ; CHECK-LABEL: define @constant_sdiv_with_overflow( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.sdiv.nxv4i32( [[PG]], splat (i32 -2147483648), splat (i32 -1)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.sdiv.nxv4i32( %pg, splat (i32 -2147483648), splat (i32 -1)) ret %r } define @constant_sdiv_u( %pg) #0 { ; CHECK-LABEL: define @constant_sdiv_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i32 2) ; %r = call @llvm.aarch64.sve.sdiv.u.nxv4i32( %pg, splat (i32 -7), splat (i32 -3)) ret %r } ; The intrinsic's IR equivalent does not support divide-by-zero. define @constant_sdiv_u_by_zero( %pg) #0 { ; CHECK-LABEL: define @constant_sdiv_u_by_zero( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.sdiv.u.nxv4i32( [[PG]], splat (i32 -7), zeroinitializer) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.sdiv.u.nxv4i32( %pg, splat (i32 -7), splat (i32 0)) ret %r } ; The intrinsic's IR equivalent does not support overflow. define @constant_sdiv_u_with_overflow( %pg) #0 { ; CHECK-LABEL: define @constant_sdiv_u_with_overflow( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.sdiv.u.nxv4i32( [[PG]], splat (i32 -2147483648), splat (i32 -1)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.sdiv.u.nxv4i32( %pg, splat (i32 -2147483648), splat (i32 -1)) ret %r } define @constant_sdivr( %pg) #0 { ; CHECK-LABEL: define @constant_sdivr( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.sdivr.nxv4i32( [[PG]], splat (i32 3), splat (i32 -7)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.sdivr.nxv4i32( %pg, splat (i32 3), splat (i32 -7)) ret %r } ; The intrinsic's IR equivalent does not support divide-by-zero. define @constant_sdivr_by_zero( %pg) #0 { ; CHECK-LABEL: define @constant_sdivr_by_zero( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.sdivr.nxv4i32( [[PG]], zeroinitializer, splat (i32 -7)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.sdivr.nxv4i32( %pg, splat (i32 0), splat (i32 -7)) ret %r } ; The intrinsic's IR equivalent does not support overflow. define @constant_sdivr_with_overflow( %pg) #0 { ; CHECK-LABEL: define @constant_sdivr_with_overflow( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.sdivr.nxv4i32( [[PG]], splat (i32 -1), splat (i32 -2147483648)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.sdivr.nxv4i32( %pg, splat (i32 -1), splat (i32 -2147483648)) ret %r } define @constant_sub( %pg) #0 { ; CHECK-LABEL: define @constant_sub( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 4), splat (i32 7) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.sub.nxv4i32( %pg, splat (i32 7), splat (i32 3)) ret %r } define @constant_sub_u( %pg) #0 { ; CHECK-LABEL: define @constant_sub_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i32 4) ; %r = call @llvm.aarch64.sve.sub.u.nxv4i32( %pg, splat (i32 7), splat (i32 3)) ret %r } define @constant_subr( %pg) #0 { ; CHECK-LABEL: define @constant_subr( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.subr.nxv4i32( [[PG]], splat (i32 7), splat (i32 3)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.subr.nxv4i32( %pg, splat (i32 7), splat (i32 3)) ret %r } define @constant_udiv( %pg) #0 { ; CHECK-LABEL: define @constant_udiv( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 2), splat (i32 7) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.udiv.nxv4i32( %pg, splat (i32 7), splat (i32 3)) ret %r } ; The intrinsic's IR equivalent does not support divide-by-zero. define @constant_udiv_by_zero( %pg) #0 { ; CHECK-LABEL: define @constant_udiv_by_zero( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.udiv.nxv4i32( [[PG]], splat (i32 7), zeroinitializer) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.udiv.nxv4i32( %pg, splat (i32 7), splat (i32 0)) ret %r } define @constant_udiv_u( %pg) #0 { ; CHECK-LABEL: define @constant_udiv_u( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i32 3) ; %r = call @llvm.aarch64.sve.udiv.u.nxv4i32( %pg, splat (i32 9), splat (i32 3)) ret %r } ; The intrinsic's IR equivalent does not support divide-by-zero. define @constant_udiv_u_by_zero( %pg) #0 { ; CHECK-LABEL: define @constant_udiv_u_by_zero( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.udiv.u.nxv4i32( [[PG]], splat (i32 9), zeroinitializer) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.udiv.u.nxv4i32( %pg, splat (i32 9), splat (i32 0)) ret %r } define @constant_udivr( %pg) #0 { ; CHECK-LABEL: define @constant_udivr( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.udivr.nxv4i32( [[PG]], splat (i32 3), splat (i32 7)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.udivr.nxv4i32( %pg, splat (i32 3), splat (i32 7)) ret %r } ; The intrinsic's IR equivalent does not support divide-by-zero. define @constant_udivr_by_zero( %pg) #0 { ; CHECK-LABEL: define @constant_udivr_by_zero( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.udivr.nxv4i32( [[PG]], zeroinitializer, splat (i32 7)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.udivr.nxv4i32( %pg, splat (i32 0), splat (i32 7)) ret %r } declare @llvm.aarch64.sve.dup.nxv4i32(, , i32) declare @llvm.aarch64.sve.add.nxv4i32(, , ) declare @llvm.aarch64.sve.and.nxv4i32(, , ) declare @llvm.aarch64.sve.eor.nxv4i32(, , ) declare @llvm.aarch64.sve.mul.nxv4i32(, , ) declare @llvm.aarch64.sve.orr.nxv4i32(, , ) declare @llvm.aarch64.sve.sdiv.nxv4i32(, , ) declare @llvm.aarch64.sve.sdivr.nxv4i32(, , ) declare @llvm.aarch64.sve.sub.nxv4i32(, , ) declare @llvm.aarch64.sve.subr.nxv4i32(, , ) declare @llvm.aarch64.sve.udiv.nxv4i32(, , ) declare @llvm.aarch64.sve.udivr.nxv4i32(, , ) declare @llvm.aarch64.sve.add.u.nxv4i32(, , ) declare @llvm.aarch64.sve.and.u.nxv4i32(, , ) declare @llvm.aarch64.sve.eor.u.nxv4i32(, , ) declare @llvm.aarch64.sve.mul.u.nxv4i32(, , ) declare @llvm.aarch64.sve.orr.u.nxv4i32(, , ) declare @llvm.aarch64.sve.sdiv.u.nxv4i32(, , ) declare @llvm.aarch64.sve.sub.u.nxv4i32(, , ) declare @llvm.aarch64.sve.udiv.u.nxv4i32(, , ) declare @llvm.aarch64.sve.fadd.nxv4i32(, , ) declare @llvm.aarch64.sve.fdiv.nxv4i32(, , ) declare @llvm.aarch64.sve.fdivr.nxv4i32(, , ) declare @llvm.aarch64.sve.fmul.nxv4i32(, , ) declare @llvm.aarch64.sve.fsub.nxv4i32(, , ) declare @llvm.aarch64.sve.fsubr.nxv4i32(, , ) declare @llvm.aarch64.sve.fadd.u.nxv4i32(, , ) declare @llvm.aarch64.sve.fdiv.u.nxv4i32(, , ) declare @llvm.aarch64.sve.fmul.u.nxv4i32(, , ) declare @llvm.aarch64.sve.fsub.u.nxv4i32(, , ) attributes #0 = { "target-features"="+sve" }