; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -passes=instcombine < %s | FileCheck %s target triple = "aarch64-unknown-linux-gnu" define @sdiv_i32( %a, %pg) #0 { ; CHECK-LABEL: @sdiv_i32( ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.asrd.nxv4i32( [[PG:%.*]], [[A:%.*]], i32 23) ; CHECK-NEXT: ret [[TMP1]] ; %out = call @llvm.aarch64.sve.sdiv.nxv4i32( %pg, %a, splat (i32 8388608)) ret %out } define @sdiv_i32_neg( %a, %pg) #0 { ; CHECK-LABEL: @sdiv_i32_neg( ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.asrd.nxv4i32( [[PG:%.*]], [[A:%.*]], i32 23) ; CHECK-NEXT: [[TMP2:%.*]] = call @llvm.aarch64.sve.neg.nxv4i32( [[TMP1]], [[PG]], [[TMP1]]) ; CHECK-NEXT: ret [[TMP2]] ; %out = call @llvm.aarch64.sve.sdiv.nxv4i32( %pg, %a, splat (i32 -8388608)) ret %out } define @sdiv_i64( %a, %pg) #0 { ; CHECK-LABEL: @sdiv_i64( ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.asrd.nxv2i64( [[PG:%.*]], [[A:%.*]], i32 23) ; CHECK-NEXT: ret [[TMP1]] ; %out = call @llvm.aarch64.sve.sdiv.nxv2i64( %pg, %a, splat (i64 8388608)) ret %out } define @sdiv_i64_neg( %a, %pg) #0 { ; CHECK-LABEL: @sdiv_i64_neg( ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.asrd.nxv2i64( [[PG:%.*]], [[A:%.*]], i32 23) ; CHECK-NEXT: [[TMP2:%.*]] = call @llvm.aarch64.sve.neg.nxv2i64( [[TMP1]], [[PG]], [[TMP1]]) ; CHECK-NEXT: ret [[TMP2]] ; %out = call @llvm.aarch64.sve.sdiv.nxv2i64( %pg, %a, splat (i64 -8388608)) ret %out } define @sdiv_i32_not_base2( %a, %pg) #0 { ; CHECK-LABEL: @sdiv_i32_not_base2( ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.sdiv.nxv4i32( [[PG:%.*]], [[A:%.*]], splat (i32 8388607)) ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.sdiv.nxv4i32( %pg, %a, splat (i32 8388607)) ret %out } define @sdiv_i32_not_base2_neg( %a, %pg) #0 { ; CHECK-LABEL: @sdiv_i32_not_base2_neg( ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.sdiv.nxv4i32( [[PG:%.*]], [[A:%.*]], splat (i32 -8388607)) ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.sdiv.nxv4i32( %pg, %a, splat (i32 -8388607)) ret %out } define @sdiv_i32_not_zero( %a, %pg) #0 { ; CHECK-LABEL: @sdiv_i32_not_zero( ; CHECK-NEXT: [[OUT:%.*]] = call @llvm.aarch64.sve.sdiv.nxv4i32( [[PG:%.*]], [[A:%.*]], zeroinitializer) ; CHECK-NEXT: ret [[OUT]] ; %out = call @llvm.aarch64.sve.sdiv.nxv4i32( %pg, %a, splat (i32 0)) ret %out } ; Vec/1 is a no-op define @divide_by_1( %p, %a) #0 { ; CHECK-LABEL: @divide_by_1( ; CHECK-NEXT: ret [[A:%.*]] ; %1 = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 1) %2 = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %p) %3 = call @llvm.aarch64.sve.sdiv.nxv2i64( %2, %a, %1) ret %3 } ; Don't instcombine to SRAD when the divisor is -1 define @divide_by_m1( %p, %a) #0 { ; CHECK-LABEL: @divide_by_m1( ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( [[P:%.*]]) ; CHECK-NEXT: [[TMP2:%.*]] = call @llvm.aarch64.sve.sdiv.nxv2i64( [[TMP1]], [[A:%.*]], splat (i64 -1)) ; CHECK-NEXT: ret [[TMP2]] ; %1 = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 -1) %2 = call @llvm.aarch64.sve.convert.from.svbool.nxv2i1( %p) %3 = call @llvm.aarch64.sve.sdiv.nxv2i64( %2, %a, %1) ret %3 } declare @llvm.aarch64.sve.sdiv.nxv4i32(, , ) declare @llvm.aarch64.sve.sdiv.nxv2i64(, , ) attributes #0 = { "target-features"="+sve" }