; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-unknown-unknown | FileCheck %s --check-prefixes=CHECK,DEFAULT
; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-unknown-unknown -mattr=+sve | FileCheck %s --check-prefixes=CHECK,SVE
@result = dso_local global i32 0, align 4
define dso_local i32 @skip(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr #0 "zero-call-used-regs"="skip" {
; CHECK-LABEL: skip:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mul w8, w1, w0
; CHECK-NEXT: orr w0, w8, w2
; CHECK-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%or = or i32 %mul, %c
ret i32 %or
}
define dso_local i32 @used_gpr_arg(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="used-gpr-arg" {
; CHECK-LABEL: used_gpr_arg:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mul w8, w1, w0
; CHECK-NEXT: orr w0, w8, w2
; CHECK-NEXT: mov x1, #0 // =0x0
; CHECK-NEXT: mov x2, #0 // =0x0
; CHECK-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%or = or i32 %mul, %c
ret i32 %or
}
define dso_local i32 @used_gpr(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="used-gpr" {
; CHECK-LABEL: used_gpr:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mul w8, w1, w0
; CHECK-NEXT: orr w0, w8, w2
; CHECK-NEXT: mov x1, #0 // =0x0
; CHECK-NEXT: mov x2, #0 // =0x0
; CHECK-NEXT: mov x8, #0 // =0x0
; CHECK-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%or = or i32 %mul, %c
ret i32 %or
}
define dso_local i32 @used_arg(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="used-arg" {
; CHECK-LABEL: used_arg:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mul w8, w1, w0
; CHECK-NEXT: orr w0, w8, w2
; CHECK-NEXT: mov x1, #0 // =0x0
; CHECK-NEXT: mov x2, #0 // =0x0
; CHECK-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%or = or i32 %mul, %c
ret i32 %or
}
define dso_local i32 @used(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="used" {
; CHECK-LABEL: used:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mul w8, w1, w0
; CHECK-NEXT: orr w0, w8, w2
; CHECK-NEXT: mov x1, #0 // =0x0
; CHECK-NEXT: mov x2, #0 // =0x0
; CHECK-NEXT: mov x8, #0 // =0x0
; CHECK-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%or = or i32 %mul, %c
ret i32 %or
}
define dso_local i32 @all_gpr_arg(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr #0 "zero-call-used-regs"="all-gpr-arg" {
; CHECK-LABEL: all_gpr_arg:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mul w8, w1, w0
; CHECK-NEXT: mov x1, #0 // =0x0
; CHECK-NEXT: mov x3, #0 // =0x0
; CHECK-NEXT: mov x4, #0 // =0x0
; CHECK-NEXT: mov x5, #0 // =0x0
; CHECK-NEXT: mov x6, #0 // =0x0
; CHECK-NEXT: mov x7, #0 // =0x0
; CHECK-NEXT: mov x18, #0 // =0x0
; CHECK-NEXT: orr w0, w8, w2
; CHECK-NEXT: mov x2, #0 // =0x0
; CHECK-NEXT: mov x8, #0 // =0x0
; CHECK-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%or = or i32 %mul, %c
ret i32 %or
}
define dso_local i32 @all_gpr(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr #0 "zero-call-used-regs"="all-gpr" {
; CHECK-LABEL: all_gpr:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mul w8, w1, w0
; CHECK-NEXT: mov x1, #0 // =0x0
; CHECK-NEXT: mov x3, #0 // =0x0
; CHECK-NEXT: mov x4, #0 // =0x0
; CHECK-NEXT: mov x5, #0 // =0x0
; CHECK-NEXT: mov x6, #0 // =0x0
; CHECK-NEXT: mov x7, #0 // =0x0
; CHECK-NEXT: mov x9, #0 // =0x0
; CHECK-NEXT: mov x10, #0 // =0x0
; CHECK-NEXT: orr w0, w8, w2
; CHECK-NEXT: mov x2, #0 // =0x0
; CHECK-NEXT: mov x8, #0 // =0x0
; CHECK-NEXT: mov x11, #0 // =0x0
; CHECK-NEXT: mov x12, #0 // =0x0
; CHECK-NEXT: mov x13, #0 // =0x0
; CHECK-NEXT: mov x14, #0 // =0x0
; CHECK-NEXT: mov x15, #0 // =0x0
; CHECK-NEXT: mov x16, #0 // =0x0
; CHECK-NEXT: mov x17, #0 // =0x0
; CHECK-NEXT: mov x18, #0 // =0x0
; CHECK-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%or = or i32 %mul, %c
ret i32 %or
}
define dso_local i32 @all_arg(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr #0 "zero-call-used-regs"="all-arg" {
; DEFAULT-LABEL: all_arg:
; DEFAULT: // %bb.0: // %entry
; DEFAULT-NEXT: mul w8, w1, w0
; DEFAULT-NEXT: mov x1, #0 // =0x0
; DEFAULT-NEXT: mov x3, #0 // =0x0
; DEFAULT-NEXT: mov x4, #0 // =0x0
; DEFAULT-NEXT: mov x5, #0 // =0x0
; DEFAULT-NEXT: mov x6, #0 // =0x0
; DEFAULT-NEXT: mov x7, #0 // =0x0
; DEFAULT-NEXT: mov x18, #0 // =0x0
; DEFAULT-NEXT: movi v0.2d, #0000000000000000
; DEFAULT-NEXT: orr w0, w8, w2
; DEFAULT-NEXT: mov x2, #0 // =0x0
; DEFAULT-NEXT: mov x8, #0 // =0x0
; DEFAULT-NEXT: movi v1.2d, #0000000000000000
; DEFAULT-NEXT: movi v2.2d, #0000000000000000
; DEFAULT-NEXT: movi v3.2d, #0000000000000000
; DEFAULT-NEXT: movi v4.2d, #0000000000000000
; DEFAULT-NEXT: movi v5.2d, #0000000000000000
; DEFAULT-NEXT: movi v6.2d, #0000000000000000
; DEFAULT-NEXT: movi v7.2d, #0000000000000000
; DEFAULT-NEXT: ret
;
; SVE-LABEL: all_arg:
; SVE: // %bb.0: // %entry
; SVE-NEXT: mul w8, w1, w0
; SVE-NEXT: mov x1, #0 // =0x0
; SVE-NEXT: mov x3, #0 // =0x0
; SVE-NEXT: mov x4, #0 // =0x0
; SVE-NEXT: mov x5, #0 // =0x0
; SVE-NEXT: mov x6, #0 // =0x0
; SVE-NEXT: mov x7, #0 // =0x0
; SVE-NEXT: mov x18, #0 // =0x0
; SVE-NEXT: mov z0.d, #0 // =0x0
; SVE-NEXT: orr w0, w8, w2
; SVE-NEXT: mov x2, #0 // =0x0
; SVE-NEXT: mov x8, #0 // =0x0
; SVE-NEXT: mov z1.d, #0 // =0x0
; SVE-NEXT: mov z2.d, #0 // =0x0
; SVE-NEXT: mov z3.d, #0 // =0x0
; SVE-NEXT: mov z4.d, #0 // =0x0
; SVE-NEXT: mov z5.d, #0 // =0x0
; SVE-NEXT: mov z6.d, #0 // =0x0
; SVE-NEXT: mov z7.d, #0 // =0x0
; SVE-NEXT: pfalse p0.b
; SVE-NEXT: pfalse p1.b
; SVE-NEXT: pfalse p2.b
; SVE-NEXT: pfalse p3.b
; SVE-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%or = or i32 %mul, %c
ret i32 %or
}
define dso_local i32 @all(i32 noundef %a, i32 noundef %b, i32 noundef %c) local_unnamed_addr #0 "zero-call-used-regs"="all" {
; DEFAULT-LABEL: all:
; DEFAULT: // %bb.0: // %entry
; DEFAULT-NEXT: mul w8, w1, w0
; DEFAULT-NEXT: mov x1, #0 // =0x0
; DEFAULT-NEXT: mov x3, #0 // =0x0
; DEFAULT-NEXT: mov x4, #0 // =0x0
; DEFAULT-NEXT: mov x5, #0 // =0x0
; DEFAULT-NEXT: mov x6, #0 // =0x0
; DEFAULT-NEXT: mov x7, #0 // =0x0
; DEFAULT-NEXT: mov x9, #0 // =0x0
; DEFAULT-NEXT: mov x10, #0 // =0x0
; DEFAULT-NEXT: orr w0, w8, w2
; DEFAULT-NEXT: mov x2, #0 // =0x0
; DEFAULT-NEXT: mov x8, #0 // =0x0
; DEFAULT-NEXT: mov x11, #0 // =0x0
; DEFAULT-NEXT: mov x12, #0 // =0x0
; DEFAULT-NEXT: mov x13, #0 // =0x0
; DEFAULT-NEXT: mov x14, #0 // =0x0
; DEFAULT-NEXT: mov x15, #0 // =0x0
; DEFAULT-NEXT: mov x16, #0 // =0x0
; DEFAULT-NEXT: mov x17, #0 // =0x0
; DEFAULT-NEXT: mov x18, #0 // =0x0
; DEFAULT-NEXT: movi v0.2d, #0000000000000000
; DEFAULT-NEXT: movi v1.2d, #0000000000000000
; DEFAULT-NEXT: movi v2.2d, #0000000000000000
; DEFAULT-NEXT: movi v3.2d, #0000000000000000
; DEFAULT-NEXT: movi v4.2d, #0000000000000000
; DEFAULT-NEXT: movi v5.2d, #0000000000000000
; DEFAULT-NEXT: movi v6.2d, #0000000000000000
; DEFAULT-NEXT: movi v7.2d, #0000000000000000
; DEFAULT-NEXT: movi v16.2d, #0000000000000000
; DEFAULT-NEXT: movi v17.2d, #0000000000000000
; DEFAULT-NEXT: movi v18.2d, #0000000000000000
; DEFAULT-NEXT: movi v19.2d, #0000000000000000
; DEFAULT-NEXT: movi v20.2d, #0000000000000000
; DEFAULT-NEXT: movi v21.2d, #0000000000000000
; DEFAULT-NEXT: movi v22.2d, #0000000000000000
; DEFAULT-NEXT: movi v23.2d, #0000000000000000
; DEFAULT-NEXT: movi v24.2d, #0000000000000000
; DEFAULT-NEXT: movi v25.2d, #0000000000000000
; DEFAULT-NEXT: movi v26.2d, #0000000000000000
; DEFAULT-NEXT: movi v27.2d, #0000000000000000
; DEFAULT-NEXT: movi v28.2d, #0000000000000000
; DEFAULT-NEXT: movi v29.2d, #0000000000000000
; DEFAULT-NEXT: movi v30.2d, #0000000000000000
; DEFAULT-NEXT: movi v31.2d, #0000000000000000
; DEFAULT-NEXT: ret
;
; SVE-LABEL: all:
; SVE: // %bb.0: // %entry
; SVE-NEXT: mul w8, w1, w0
; SVE-NEXT: mov x1, #0 // =0x0
; SVE-NEXT: mov x3, #0 // =0x0
; SVE-NEXT: mov x4, #0 // =0x0
; SVE-NEXT: mov x5, #0 // =0x0
; SVE-NEXT: mov x6, #0 // =0x0
; SVE-NEXT: mov x7, #0 // =0x0
; SVE-NEXT: mov x9, #0 // =0x0
; SVE-NEXT: mov x10, #0 // =0x0
; SVE-NEXT: orr w0, w8, w2
; SVE-NEXT: mov x2, #0 // =0x0
; SVE-NEXT: mov x8, #0 // =0x0
; SVE-NEXT: mov x11, #0 // =0x0
; SVE-NEXT: mov x12, #0 // =0x0
; SVE-NEXT: mov x13, #0 // =0x0
; SVE-NEXT: mov x14, #0 // =0x0
; SVE-NEXT: mov x15, #0 // =0x0
; SVE-NEXT: mov x16, #0 // =0x0
; SVE-NEXT: mov x17, #0 // =0x0
; SVE-NEXT: mov x18, #0 // =0x0
; SVE-NEXT: mov z0.d, #0 // =0x0
; SVE-NEXT: mov z1.d, #0 // =0x0
; SVE-NEXT: mov z2.d, #0 // =0x0
; SVE-NEXT: mov z3.d, #0 // =0x0
; SVE-NEXT: mov z4.d, #0 // =0x0
; SVE-NEXT: mov z5.d, #0 // =0x0
; SVE-NEXT: mov z6.d, #0 // =0x0
; SVE-NEXT: mov z7.d, #0 // =0x0
; SVE-NEXT: mov z16.d, #0 // =0x0
; SVE-NEXT: mov z17.d, #0 // =0x0
; SVE-NEXT: mov z18.d, #0 // =0x0
; SVE-NEXT: mov z19.d, #0 // =0x0
; SVE-NEXT: mov z20.d, #0 // =0x0
; SVE-NEXT: mov z21.d, #0 // =0x0
; SVE-NEXT: mov z22.d, #0 // =0x0
; SVE-NEXT: mov z23.d, #0 // =0x0
; SVE-NEXT: mov z24.d, #0 // =0x0
; SVE-NEXT: mov z25.d, #0 // =0x0
; SVE-NEXT: mov z26.d, #0 // =0x0
; SVE-NEXT: mov z27.d, #0 // =0x0
; SVE-NEXT: mov z28.d, #0 // =0x0
; SVE-NEXT: mov z29.d, #0 // =0x0
; SVE-NEXT: mov z30.d, #0 // =0x0
; SVE-NEXT: mov z31.d, #0 // =0x0
; SVE-NEXT: pfalse p0.b
; SVE-NEXT: pfalse p1.b
; SVE-NEXT: pfalse p2.b
; SVE-NEXT: pfalse p3.b
; SVE-NEXT: pfalse p4.b
; SVE-NEXT: pfalse p5.b
; SVE-NEXT: pfalse p6.b
; SVE-NEXT: pfalse p7.b
; SVE-NEXT: pfalse p8.b
; SVE-NEXT: pfalse p9.b
; SVE-NEXT: pfalse p10.b
; SVE-NEXT: pfalse p11.b
; SVE-NEXT: pfalse p12.b
; SVE-NEXT: pfalse p13.b
; SVE-NEXT: pfalse p14.b
; SVE-NEXT: pfalse p15.b
; SVE-NEXT: ret
entry:
%mul = mul nsw i32 %b, %a
%or = or i32 %mul, %c
ret i32 %or
}
define dso_local double @skip_float(double noundef %a, float noundef %b) local_unnamed_addr #0 "zero-call-used-regs"="skip" {
; CHECK-LABEL: skip_float:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvt d1, s1
; CHECK-NEXT: fmul d0, d1, d0
; CHECK-NEXT: ret
entry:
%conv = fpext float %b to double
%mul = fmul double %conv, %a
ret double %mul
}
define dso_local double @used_gpr_arg_float(double noundef %a, float noundef %b) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="used-gpr-arg" {
; CHECK-LABEL: used_gpr_arg_float:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvt d1, s1
; CHECK-NEXT: fmul d0, d1, d0
; CHECK-NEXT: ret
entry:
%conv = fpext float %b to double
%mul = fmul double %conv, %a
ret double %mul
}
define dso_local double @used_gpr_float(double noundef %a, float noundef %b) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="used-gpr" {
; CHECK-LABEL: used_gpr_float:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvt d1, s1
; CHECK-NEXT: fmul d0, d1, d0
; CHECK-NEXT: ret
entry:
%conv = fpext float %b to double
%mul = fmul double %conv, %a
ret double %mul
}
define dso_local double @used_arg_float(double noundef %a, float noundef %b) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="used-arg" {
; DEFAULT-LABEL: used_arg_float:
; DEFAULT: // %bb.0: // %entry
; DEFAULT-NEXT: fcvt d1, s1
; DEFAULT-NEXT: fmul d0, d1, d0
; DEFAULT-NEXT: movi v1.2d, #0000000000000000
; DEFAULT-NEXT: ret
;
; SVE-LABEL: used_arg_float:
; SVE: // %bb.0: // %entry
; SVE-NEXT: fcvt d1, s1
; SVE-NEXT: fmul d0, d1, d0
; SVE-NEXT: mov z1.d, #0 // =0x0
; SVE-NEXT: ret
entry:
%conv = fpext float %b to double
%mul = fmul double %conv, %a
ret double %mul
}
define dso_local double @used_float(double noundef %a, float noundef %b) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="used" {
; DEFAULT-LABEL: used_float:
; DEFAULT: // %bb.0: // %entry
; DEFAULT-NEXT: fcvt d1, s1
; DEFAULT-NEXT: fmul d0, d1, d0
; DEFAULT-NEXT: movi v1.2d, #0000000000000000
; DEFAULT-NEXT: ret
;
; SVE-LABEL: used_float:
; SVE: // %bb.0: // %entry
; SVE-NEXT: fcvt d1, s1
; SVE-NEXT: fmul d0, d1, d0
; SVE-NEXT: mov z1.d, #0 // =0x0
; SVE-NEXT: ret
entry:
%conv = fpext float %b to double
%mul = fmul double %conv, %a
ret double %mul
}
define dso_local double @all_gpr_arg_float(double noundef %a, float noundef %b) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="all-gpr-arg" {
; CHECK-LABEL: all_gpr_arg_float:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvt d1, s1
; CHECK-NEXT: fmul d0, d1, d0
; CHECK-NEXT: mov x0, #0 // =0x0
; CHECK-NEXT: mov x1, #0 // =0x0
; CHECK-NEXT: mov x2, #0 // =0x0
; CHECK-NEXT: mov x3, #0 // =0x0
; CHECK-NEXT: mov x4, #0 // =0x0
; CHECK-NEXT: mov x5, #0 // =0x0
; CHECK-NEXT: mov x6, #0 // =0x0
; CHECK-NEXT: mov x7, #0 // =0x0
; CHECK-NEXT: mov x8, #0 // =0x0
; CHECK-NEXT: mov x18, #0 // =0x0
; CHECK-NEXT: ret
entry:
%conv = fpext float %b to double
%mul = fmul double %conv, %a
ret double %mul
}
define dso_local double @all_gpr_float(double noundef %a, float noundef %b) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="all-gpr" {
; CHECK-LABEL: all_gpr_float:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvt d1, s1
; CHECK-NEXT: fmul d0, d1, d0
; CHECK-NEXT: mov x0, #0 // =0x0
; CHECK-NEXT: mov x1, #0 // =0x0
; CHECK-NEXT: mov x2, #0 // =0x0
; CHECK-NEXT: mov x3, #0 // =0x0
; CHECK-NEXT: mov x4, #0 // =0x0
; CHECK-NEXT: mov x5, #0 // =0x0
; CHECK-NEXT: mov x6, #0 // =0x0
; CHECK-NEXT: mov x7, #0 // =0x0
; CHECK-NEXT: mov x8, #0 // =0x0
; CHECK-NEXT: mov x9, #0 // =0x0
; CHECK-NEXT: mov x10, #0 // =0x0
; CHECK-NEXT: mov x11, #0 // =0x0
; CHECK-NEXT: mov x12, #0 // =0x0
; CHECK-NEXT: mov x13, #0 // =0x0
; CHECK-NEXT: mov x14, #0 // =0x0
; CHECK-NEXT: mov x15, #0 // =0x0
; CHECK-NEXT: mov x16, #0 // =0x0
; CHECK-NEXT: mov x17, #0 // =0x0
; CHECK-NEXT: mov x18, #0 // =0x0
; CHECK-NEXT: ret
entry:
%conv = fpext float %b to double
%mul = fmul double %conv, %a
ret double %mul
}
define dso_local double @all_arg_float(double noundef %a, float noundef %b) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="all-arg" {
; DEFAULT-LABEL: all_arg_float:
; DEFAULT: // %bb.0: // %entry
; DEFAULT-NEXT: fcvt d1, s1
; DEFAULT-NEXT: fmul d0, d1, d0
; DEFAULT-NEXT: mov x0, #0 // =0x0
; DEFAULT-NEXT: mov x1, #0 // =0x0
; DEFAULT-NEXT: mov x2, #0 // =0x0
; DEFAULT-NEXT: mov x3, #0 // =0x0
; DEFAULT-NEXT: mov x4, #0 // =0x0
; DEFAULT-NEXT: mov x5, #0 // =0x0
; DEFAULT-NEXT: mov x6, #0 // =0x0
; DEFAULT-NEXT: mov x7, #0 // =0x0
; DEFAULT-NEXT: mov x8, #0 // =0x0
; DEFAULT-NEXT: mov x18, #0 // =0x0
; DEFAULT-NEXT: movi v1.2d, #0000000000000000
; DEFAULT-NEXT: movi v2.2d, #0000000000000000
; DEFAULT-NEXT: movi v3.2d, #0000000000000000
; DEFAULT-NEXT: movi v4.2d, #0000000000000000
; DEFAULT-NEXT: movi v5.2d, #0000000000000000
; DEFAULT-NEXT: movi v6.2d, #0000000000000000
; DEFAULT-NEXT: movi v7.2d, #0000000000000000
; DEFAULT-NEXT: ret
;
; SVE-LABEL: all_arg_float:
; SVE: // %bb.0: // %entry
; SVE-NEXT: fcvt d1, s1
; SVE-NEXT: fmul d0, d1, d0
; SVE-NEXT: mov x0, #0 // =0x0
; SVE-NEXT: mov x1, #0 // =0x0
; SVE-NEXT: mov x2, #0 // =0x0
; SVE-NEXT: mov x3, #0 // =0x0
; SVE-NEXT: mov x4, #0 // =0x0
; SVE-NEXT: mov x5, #0 // =0x0
; SVE-NEXT: mov x6, #0 // =0x0
; SVE-NEXT: mov x7, #0 // =0x0
; SVE-NEXT: mov x8, #0 // =0x0
; SVE-NEXT: mov x18, #0 // =0x0
; SVE-NEXT: mov z1.d, #0 // =0x0
; SVE-NEXT: mov z2.d, #0 // =0x0
; SVE-NEXT: mov z3.d, #0 // =0x0
; SVE-NEXT: mov z4.d, #0 // =0x0
; SVE-NEXT: mov z5.d, #0 // =0x0
; SVE-NEXT: mov z6.d, #0 // =0x0
; SVE-NEXT: mov z7.d, #0 // =0x0
; SVE-NEXT: pfalse p0.b
; SVE-NEXT: pfalse p1.b
; SVE-NEXT: pfalse p2.b
; SVE-NEXT: pfalse p3.b
; SVE-NEXT: ret
entry:
%conv = fpext float %b to double
%mul = fmul double %conv, %a
ret double %mul
}
define dso_local double @all_float(double noundef %a, float noundef %b) local_unnamed_addr #0 noinline optnone "zero-call-used-regs"="all" {
; DEFAULT-LABEL: all_float:
; DEFAULT: // %bb.0: // %entry
; DEFAULT-NEXT: fcvt d1, s1
; DEFAULT-NEXT: fmul d0, d1, d0
; DEFAULT-NEXT: mov x0, #0 // =0x0
; DEFAULT-NEXT: mov x1, #0 // =0x0
; DEFAULT-NEXT: mov x2, #0 // =0x0
; DEFAULT-NEXT: mov x3, #0 // =0x0
; DEFAULT-NEXT: mov x4, #0 // =0x0
; DEFAULT-NEXT: mov x5, #0 // =0x0
; DEFAULT-NEXT: mov x6, #0 // =0x0
; DEFAULT-NEXT: mov x7, #0 // =0x0
; DEFAULT-NEXT: mov x8, #0 // =0x0
; DEFAULT-NEXT: mov x9, #0 // =0x0
; DEFAULT-NEXT: mov x10, #0 // =0x0
; DEFAULT-NEXT: mov x11, #0 // =0x0
; DEFAULT-NEXT: mov x12, #0 // =0x0
; DEFAULT-NEXT: mov x13, #0 // =0x0
; DEFAULT-NEXT: mov x14, #0 // =0x0
; DEFAULT-NEXT: mov x15, #0 // =0x0
; DEFAULT-NEXT: mov x16, #0 // =0x0
; DEFAULT-NEXT: mov x17, #0 // =0x0
; DEFAULT-NEXT: mov x18, #0 // =0x0
; DEFAULT-NEXT: movi v1.2d, #0000000000000000
; DEFAULT-NEXT: movi v2.2d, #0000000000000000
; DEFAULT-NEXT: movi v3.2d, #0000000000000000
; DEFAULT-NEXT: movi v4.2d, #0000000000000000
; DEFAULT-NEXT: movi v5.2d, #0000000000000000
; DEFAULT-NEXT: movi v6.2d, #0000000000000000
; DEFAULT-NEXT: movi v7.2d, #0000000000000000
; DEFAULT-NEXT: movi v16.2d, #0000000000000000
; DEFAULT-NEXT: movi v17.2d, #0000000000000000
; DEFAULT-NEXT: movi v18.2d, #0000000000000000
; DEFAULT-NEXT: movi v19.2d, #0000000000000000
; DEFAULT-NEXT: movi v20.2d, #0000000000000000
; DEFAULT-NEXT: movi v21.2d, #0000000000000000
; DEFAULT-NEXT: movi v22.2d, #0000000000000000
; DEFAULT-NEXT: movi v23.2d, #0000000000000000
; DEFAULT-NEXT: movi v24.2d, #0000000000000000
; DEFAULT-NEXT: movi v25.2d, #0000000000000000
; DEFAULT-NEXT: movi v26.2d, #0000000000000000
; DEFAULT-NEXT: movi v27.2d, #0000000000000000
; DEFAULT-NEXT: movi v28.2d, #0000000000000000
; DEFAULT-NEXT: movi v29.2d, #0000000000000000
; DEFAULT-NEXT: movi v30.2d, #0000000000000000
; DEFAULT-NEXT: movi v31.2d, #0000000000000000
; DEFAULT-NEXT: ret
;
; SVE-LABEL: all_float:
; SVE: // %bb.0: // %entry
; SVE-NEXT: fcvt d1, s1
; SVE-NEXT: fmul d0, d1, d0
; SVE-NEXT: mov x0, #0 // =0x0
; SVE-NEXT: mov x1, #0 // =0x0
; SVE-NEXT: mov x2, #0 // =0x0
; SVE-NEXT: mov x3, #0 // =0x0
; SVE-NEXT: mov x4, #0 // =0x0
; SVE-NEXT: mov x5, #0 // =0x0
; SVE-NEXT: mov x6, #0 // =0x0
; SVE-NEXT: mov x7, #0 // =0x0
; SVE-NEXT: mov x8, #0 // =0x0
; SVE-NEXT: mov x9, #0 // =0x0
; SVE-NEXT: mov x10, #0 // =0x0
; SVE-NEXT: mov x11, #0 // =0x0
; SVE-NEXT: mov x12, #0 // =0x0
; SVE-NEXT: mov x13, #0 // =0x0
; SVE-NEXT: mov x14, #0 // =0x0
; SVE-NEXT: mov x15, #0 // =0x0
; SVE-NEXT: mov x16, #0 // =0x0
; SVE-NEXT: mov x17, #0 // =0x0
; SVE-NEXT: mov x18, #0 // =0x0
; SVE-NEXT: mov z1.d, #0 // =0x0
; SVE-NEXT: mov z2.d, #0 // =0x0
; SVE-NEXT: mov z3.d, #0 // =0x0
; SVE-NEXT: mov z4.d, #0 // =0x0
; SVE-NEXT: mov z5.d, #0 // =0x0
; SVE-NEXT: mov z6.d, #0 // =0x0
; SVE-NEXT: mov z7.d, #0 // =0x0
; SVE-NEXT: mov z16.d, #0 // =0x0
; SVE-NEXT: mov z17.d, #0 // =0x0
; SVE-NEXT: mov z18.d, #0 // =0x0
; SVE-NEXT: mov z19.d, #0 // =0x0
; SVE-NEXT: mov z20.d, #0 // =0x0
; SVE-NEXT: mov z21.d, #0 // =0x0
; SVE-NEXT: mov z22.d, #0 // =0x0
; SVE-NEXT: mov z23.d, #0 // =0x0
; SVE-NEXT: mov z24.d, #0 // =0x0
; SVE-NEXT: mov z25.d, #0 // =0x0
; SVE-NEXT: mov z26.d, #0 // =0x0
; SVE-NEXT: mov z27.d, #0 // =0x0
; SVE-NEXT: mov z28.d, #0 // =0x0
; SVE-NEXT: mov z29.d, #0 // =0x0
; SVE-NEXT: mov z30.d, #0 // =0x0
; SVE-NEXT: mov z31.d, #0 // =0x0
; SVE-NEXT: pfalse p0.b
; SVE-NEXT: pfalse p1.b
; SVE-NEXT: pfalse p2.b
; SVE-NEXT: pfalse p3.b
; SVE-NEXT: pfalse p4.b
; SVE-NEXT: pfalse p5.b
; SVE-NEXT: pfalse p6.b
; SVE-NEXT: pfalse p7.b
; SVE-NEXT: pfalse p8.b
; SVE-NEXT: pfalse p9.b
; SVE-NEXT: pfalse p10.b
; SVE-NEXT: pfalse p11.b
; SVE-NEXT: pfalse p12.b
; SVE-NEXT: pfalse p13.b
; SVE-NEXT: pfalse p14.b
; SVE-NEXT: pfalse p15.b
; SVE-NEXT: ret
entry:
%conv = fpext float %b to double
%mul = fmul double %conv, %a
ret double %mul
}
; Don't emit zeroing registers in "main" function.
define dso_local i32 @main() local_unnamed_addr #0 {
; CHECK-LABEL: main:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
entry:
ret i32 0
}
attributes #0 = { mustprogress nofree norecurse nosync nounwind readnone willreturn uwtable "frame-pointer"="non-leaf" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+neon,+v8a" }