; 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 @constant_asr_i8_shift_by_0( %pg) #0 { ; CHECK-LABEL: define @constant_asr_i8_shift_by_0( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret splat (i8 7) ; %r = call @llvm.aarch64.sve.asr.nxv16i8( %pg, splat (i8 7), splat (i8 0)) ret %r } define @constant_asr_i8_shift_by_1( %pg) #0 { ; CHECK-LABEL: define @constant_asr_i8_shift_by_1( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i8 -32), splat (i8 -63) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.asr.nxv16i8( %pg, splat (i8 193), splat (i8 1)) ret %r } ; data = 0x80 define @constant_asr_i8_shift_by_7( %pg) #0 { ; CHECK-LABEL: define @constant_asr_i8_shift_by_7( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i8 -1), splat (i8 -128) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.asr.nxv16i8( %pg, splat (i8 128), splat (i8 7)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-7. ; data = 0x80 define @constant_asr_i8_shift_by_8( %pg) #0 { ; CHECK-LABEL: define @constant_asr_i8_shift_by_8( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.asr.nxv16i8( [[PG]], splat (i8 -128), splat (i8 8)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.asr.nxv16i8( %pg, splat (i8 128), splat (i8 8)) ret %r } ; data = 0x8000 define @constant_asr_i16_shift_by_15( %pg) #0 { ; CHECK-LABEL: define @constant_asr_i16_shift_by_15( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i16 -1), splat (i16 -32768) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.asr.nxv8i16( %pg, splat (i16 32768), splat (i16 15)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-15. ; data = 0x8000 define @constant_asr_i16_shift_by_16( %pg) #0 { ; CHECK-LABEL: define @constant_asr_i16_shift_by_16( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.asr.nxv8i16( [[PG]], splat (i16 -32768), splat (i16 16)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.asr.nxv8i16( %pg, splat (i16 32768), splat (i16 16)) ret %r } ; data = 0x800000000 define @constant_asr_i32_shift_by_31( %pg) #0 { ; CHECK-LABEL: define @constant_asr_i32_shift_by_31( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 -1), splat (i32 -2147483648) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.asr.nxv4i32( %pg, splat (i32 2147483648), splat (i32 31)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-31. ; data = 0x80000000 define @constant_asr_i32_shift_by_32( %pg) #0 { ; CHECK-LABEL: define @constant_asr_i32_shift_by_32( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.asr.nxv4i32( [[PG]], splat (i32 -2147483648), splat (i32 32)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.asr.nxv4i32( %pg, splat (i32 2147483648), splat (i32 32)) ret %r } ; data = 0x8000000000000000 define @constant_asr_i64_shift_by_63( %pg) #0 { ; CHECK-LABEL: define @constant_asr_i64_shift_by_63( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i64 -1), splat (i64 -9223372036854775808) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.asr.nxv2i64( %pg, splat (i64 9223372036854775808), splat (i64 63)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-63. ; data = 0x8000000000000000 define @constant_asr_i64_shift_by_64( %pg) #0 { ; CHECK-LABEL: define @constant_asr_i64_shift_by_64( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.asr.nxv2i64( [[PG]], splat (i64 -9223372036854775808), splat (i64 64)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.asr.nxv2i64( %pg, splat (i64 9223372036854775808), splat (i64 64)) ret %r } define @constant_lsl_i8_shift_by_0( %pg) #0 { ; CHECK-LABEL: define @constant_lsl_i8_shift_by_0( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i8 7) ; %r = call @llvm.aarch64.sve.lsl.nxv16i8( %pg, splat (i8 7), splat (i8 0)) ret %r } define @constant_lsl_i8_shift_by_1( %pg) #0 { ; CHECK-LABEL: define @constant_lsl_i8_shift_by_1( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i8 -126), splat (i8 -63) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsl.nxv16i8( %pg, splat (i8 193), splat (i8 1)) ret %r } ; result = 0x80 define @constant_lsl_i8_shift_by_7( %pg) #0 { ; CHECK-LABEL: define @constant_lsl_i8_shift_by_7( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i8 -128), splat (i8 1) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsl.nxv16i8( %pg, splat (i8 1), splat (i8 7)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-7. define @constant_lsl_i8_shift_by_8( %pg) #0 { ; CHECK-LABEL: define @constant_lsl_i8_shift_by_8( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.lsl.nxv16i8( [[PG]], splat (i8 1), splat (i8 8)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsl.nxv16i8( %pg, splat (i8 1), splat (i8 8)) ret %r } ; result = 0x8000 define @constant_lsl_i16_shift_by_15( %pg) #0 { ; CHECK-LABEL: define @constant_lsl_i16_shift_by_15( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i16 -32768), splat (i16 1) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsl.nxv8i16( %pg, splat (i16 1), splat (i16 15)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-15. define @constant_lsl_i16_shift_by_16( %pg) #0 { ; CHECK-LABEL: define @constant_lsl_i16_shift_by_16( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.lsl.nxv8i16( [[PG]], splat (i16 1), splat (i16 16)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsl.nxv8i16( %pg, splat (i16 1), splat (i16 16)) ret %r } ; result = 0x800000000 define @constant_lsl_i32_shift_by_31( %pg) #0 { ; CHECK-LABEL: define @constant_lsl_i32_shift_by_31( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 -2147483648), splat (i32 1) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsl.nxv4i32( %pg, splat (i32 1), splat (i32 31)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-31. define @constant_lsl_i32_shift_by_32( %pg) #0 { ; CHECK-LABEL: define @constant_lsl_i32_shift_by_32( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.lsl.nxv4i32( [[PG]], splat (i32 1), splat (i32 32)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsl.nxv4i32( %pg, splat (i32 1), splat (i32 32)) ret %r } ; result = 0x8000000000000000 define @constant_lsl_i64_shift_by_63( %pg) #0 { ; CHECK-LABEL: define @constant_lsl_i64_shift_by_63( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i64 -9223372036854775808), splat (i64 1) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsl.nxv2i64( %pg, splat (i64 1), splat (i64 63)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-63. define @constant_lsl_i64_shift_by_64( %pg) #0 { ; CHECK-LABEL: define @constant_lsl_i64_shift_by_64( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.lsl.nxv2i64( [[PG]], splat (i64 1), splat (i64 64)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsl.nxv2i64( %pg, splat (i64 1), splat (i64 64)) ret %r } define @constant_lsr_i8_shift_by_0( %pg) #0 { ; CHECK-LABEL: define @constant_lsr_i8_shift_by_0( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret splat (i8 7) ; %r = call @llvm.aarch64.sve.lsr.nxv16i8( %pg, splat (i8 7), splat (i8 0)) ret %r } define @constant_lsr_i8_shift_by_1( %pg) #0 { ; CHECK-LABEL: define @constant_lsr_i8_shift_by_1( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i8 96), splat (i8 -63) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsr.nxv16i8( %pg, splat (i8 193), splat (i8 1)) ret %r } ; data = 0x80 define @constant_lsr_i8_shift_by_7( %pg) #0 { ; CHECK-LABEL: define @constant_lsr_i8_shift_by_7( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i8 1), splat (i8 -128) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsr.nxv16i8( %pg, splat (i8 128), splat (i8 7)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-7. ; data = 0x80 define @constant_lsr_i8_shift_by_8( %pg) #0 { ; CHECK-LABEL: define @constant_lsr_i8_shift_by_8( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.lsr.nxv16i8( [[PG]], splat (i8 -128), splat (i8 8)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsr.nxv16i8( %pg, splat (i8 128), splat (i8 8)) ret %r } ; data = 0x8000 define @constant_lsr_i16_shift_by_15( %pg) #0 { ; CHECK-LABEL: define @constant_lsr_i16_shift_by_15( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i16 1), splat (i16 -32768) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsr.nxv8i16( %pg, splat (i16 32768), splat (i16 15)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-15. ; data = 0x8000 define @constant_lsr_i16_shift_by_16( %pg) #0 { ; CHECK-LABEL: define @constant_lsr_i16_shift_by_16( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.lsr.nxv8i16( [[PG]], splat (i16 -32768), splat (i16 16)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsr.nxv8i16( %pg, splat (i16 32768), splat (i16 16)) ret %r } ; data = 0x800000000 define @constant_lsr_i32_shift_by_31( %pg) #0 { ; CHECK-LABEL: define @constant_lsr_i32_shift_by_31( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i32 1), splat (i32 -2147483648) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsr.nxv4i32( %pg, splat (i32 2147483648), splat (i32 31)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-31. ; data = 0x80000000 define @constant_lsr_i32_shift_by_32( %pg) #0 { ; CHECK-LABEL: define @constant_lsr_i32_shift_by_32( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.lsr.nxv4i32( [[PG]], splat (i32 -2147483648), splat (i32 32)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsr.nxv4i32( %pg, splat (i32 2147483648), splat (i32 32)) ret %r } ; data = 0x8000000000000000 define @constant_lsr_i64_shift_by_63( %pg) #0 { ; CHECK-LABEL: define @constant_lsr_i64_shift_by_63( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = select [[PG]], splat (i64 1), splat (i64 -9223372036854775808) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsr.nxv2i64( %pg, splat (i64 9223372036854775808), splat (i64 63)) ret %r } ; The intrinsic's IR equivalent only supports shift amounts in the range 0-63. ; data = 0x8000000000000000 define @constant_lsr_i64_shift_by_64( %pg) #0 { ; CHECK-LABEL: define @constant_lsr_i64_shift_by_64( ; CHECK-SAME: [[PG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[R:%.*]] = call @llvm.aarch64.sve.lsr.nxv2i64( [[PG]], splat (i64 -9223372036854775808), splat (i64 64)) ; CHECK-NEXT: ret [[R]] ; %r = call @llvm.aarch64.sve.lsr.nxv2i64( %pg, splat (i64 9223372036854775808), splat (i64 64)) ret %r } declare @llvm.aarch64.sve.asr.nxv16i8(, , ) declare @llvm.aarch64.sve.asr.nxv8i16(, , ) declare @llvm.aarch64.sve.asr.nxv4i32(, , ) declare @llvm.aarch64.sve.asr.nxv2i64(, , ) declare @llvm.aarch64.sve.lsl.nxv16i8(, , ) declare @llvm.aarch64.sve.lsl.nxv8i16(, , ) declare @llvm.aarch64.sve.lsl.nxv4i32(, , ) declare @llvm.aarch64.sve.lsl.nxv2i64(, , ) declare @llvm.aarch64.sve.lsr.nxv16i8(, , ) declare @llvm.aarch64.sve.lsr.nxv8i16(, , ) declare @llvm.aarch64.sve.lsr.nxv4i32(, , ) declare @llvm.aarch64.sve.lsr.nxv2i64(, , ) attributes #0 = { "target-features"="+sve" }