| ; 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 |
| ; CHECK-NEXT: mov x2, #0 |
| ; 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 |
| ; CHECK-NEXT: mov x2, #0 |
| ; CHECK-NEXT: mov x8, #0 |
| ; 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 |
| ; CHECK-NEXT: mov x2, #0 |
| ; 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 |
| ; CHECK-NEXT: mov x2, #0 |
| ; CHECK-NEXT: mov x8, #0 |
| ; 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 |
| ; CHECK-NEXT: mov x3, #0 |
| ; CHECK-NEXT: mov x4, #0 |
| ; CHECK-NEXT: orr w0, w8, w2 |
| ; CHECK-NEXT: mov x2, #0 |
| ; CHECK-NEXT: mov x5, #0 |
| ; CHECK-NEXT: mov x6, #0 |
| ; CHECK-NEXT: mov x7, #0 |
| ; CHECK-NEXT: mov x8, #0 |
| ; CHECK-NEXT: mov x18, #0 |
| ; 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 |
| ; CHECK-NEXT: mov x3, #0 |
| ; CHECK-NEXT: mov x4, #0 |
| ; CHECK-NEXT: orr w0, w8, w2 |
| ; CHECK-NEXT: mov x2, #0 |
| ; CHECK-NEXT: mov x5, #0 |
| ; CHECK-NEXT: mov x6, #0 |
| ; CHECK-NEXT: mov x7, #0 |
| ; CHECK-NEXT: mov x8, #0 |
| ; CHECK-NEXT: mov x9, #0 |
| ; CHECK-NEXT: mov x10, #0 |
| ; CHECK-NEXT: mov x11, #0 |
| ; CHECK-NEXT: mov x12, #0 |
| ; CHECK-NEXT: mov x13, #0 |
| ; CHECK-NEXT: mov x14, #0 |
| ; CHECK-NEXT: mov x15, #0 |
| ; CHECK-NEXT: mov x16, #0 |
| ; CHECK-NEXT: mov x17, #0 |
| ; CHECK-NEXT: mov x18, #0 |
| ; 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 |
| ; DEFAULT-NEXT: mov x3, #0 |
| ; DEFAULT-NEXT: mov x4, #0 |
| ; DEFAULT-NEXT: orr w0, w8, w2 |
| ; DEFAULT-NEXT: mov x2, #0 |
| ; DEFAULT-NEXT: mov x5, #0 |
| ; DEFAULT-NEXT: mov x6, #0 |
| ; DEFAULT-NEXT: mov x7, #0 |
| ; DEFAULT-NEXT: mov x8, #0 |
| ; DEFAULT-NEXT: mov x18, #0 |
| ; 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: ret |
| ; |
| ; SVE-LABEL: all_arg: |
| ; SVE: // %bb.0: // %entry |
| ; SVE-NEXT: mul w8, w1, w0 |
| ; SVE-NEXT: mov x1, #0 |
| ; SVE-NEXT: mov x3, #0 |
| ; SVE-NEXT: mov x4, #0 |
| ; SVE-NEXT: orr w0, w8, w2 |
| ; SVE-NEXT: mov x2, #0 |
| ; SVE-NEXT: mov x5, #0 |
| ; SVE-NEXT: mov x6, #0 |
| ; SVE-NEXT: mov x7, #0 |
| ; SVE-NEXT: mov x8, #0 |
| ; SVE-NEXT: mov x18, #0 |
| ; 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: 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 |
| ; DEFAULT-NEXT: mov x3, #0 |
| ; DEFAULT-NEXT: mov x4, #0 |
| ; DEFAULT-NEXT: orr w0, w8, w2 |
| ; DEFAULT-NEXT: mov x2, #0 |
| ; DEFAULT-NEXT: mov x5, #0 |
| ; DEFAULT-NEXT: mov x6, #0 |
| ; DEFAULT-NEXT: mov x7, #0 |
| ; DEFAULT-NEXT: mov x8, #0 |
| ; DEFAULT-NEXT: mov x9, #0 |
| ; DEFAULT-NEXT: mov x10, #0 |
| ; DEFAULT-NEXT: mov x11, #0 |
| ; DEFAULT-NEXT: mov x12, #0 |
| ; DEFAULT-NEXT: mov x13, #0 |
| ; DEFAULT-NEXT: mov x14, #0 |
| ; DEFAULT-NEXT: mov x15, #0 |
| ; DEFAULT-NEXT: mov x16, #0 |
| ; DEFAULT-NEXT: mov x17, #0 |
| ; DEFAULT-NEXT: mov x18, #0 |
| ; 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 |
| ; SVE-NEXT: mov x3, #0 |
| ; SVE-NEXT: mov x4, #0 |
| ; SVE-NEXT: orr w0, w8, w2 |
| ; SVE-NEXT: mov x2, #0 |
| ; SVE-NEXT: mov x5, #0 |
| ; SVE-NEXT: mov x6, #0 |
| ; SVE-NEXT: mov x7, #0 |
| ; SVE-NEXT: mov x8, #0 |
| ; SVE-NEXT: mov x9, #0 |
| ; SVE-NEXT: mov x10, #0 |
| ; SVE-NEXT: mov x11, #0 |
| ; SVE-NEXT: mov x12, #0 |
| ; SVE-NEXT: mov x13, #0 |
| ; SVE-NEXT: mov x14, #0 |
| ; SVE-NEXT: mov x15, #0 |
| ; SVE-NEXT: mov x16, #0 |
| ; SVE-NEXT: mov x17, #0 |
| ; SVE-NEXT: mov x18, #0 |
| ; 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 |
| ; CHECK-NEXT: mov x1, #0 |
| ; CHECK-NEXT: mov x2, #0 |
| ; CHECK-NEXT: mov x3, #0 |
| ; CHECK-NEXT: mov x4, #0 |
| ; CHECK-NEXT: mov x5, #0 |
| ; CHECK-NEXT: mov x6, #0 |
| ; CHECK-NEXT: mov x7, #0 |
| ; CHECK-NEXT: mov x8, #0 |
| ; CHECK-NEXT: mov x18, #0 |
| ; 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 |
| ; CHECK-NEXT: mov x1, #0 |
| ; CHECK-NEXT: mov x2, #0 |
| ; CHECK-NEXT: mov x3, #0 |
| ; CHECK-NEXT: mov x4, #0 |
| ; CHECK-NEXT: mov x5, #0 |
| ; CHECK-NEXT: mov x6, #0 |
| ; CHECK-NEXT: mov x7, #0 |
| ; CHECK-NEXT: mov x8, #0 |
| ; CHECK-NEXT: mov x9, #0 |
| ; CHECK-NEXT: mov x10, #0 |
| ; CHECK-NEXT: mov x11, #0 |
| ; CHECK-NEXT: mov x12, #0 |
| ; CHECK-NEXT: mov x13, #0 |
| ; CHECK-NEXT: mov x14, #0 |
| ; CHECK-NEXT: mov x15, #0 |
| ; CHECK-NEXT: mov x16, #0 |
| ; CHECK-NEXT: mov x17, #0 |
| ; CHECK-NEXT: mov x18, #0 |
| ; 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 |
| ; DEFAULT-NEXT: mov x1, #0 |
| ; DEFAULT-NEXT: mov x2, #0 |
| ; DEFAULT-NEXT: mov x3, #0 |
| ; DEFAULT-NEXT: mov x4, #0 |
| ; DEFAULT-NEXT: mov x5, #0 |
| ; DEFAULT-NEXT: mov x6, #0 |
| ; DEFAULT-NEXT: mov x7, #0 |
| ; DEFAULT-NEXT: mov x8, #0 |
| ; DEFAULT-NEXT: mov x18, #0 |
| ; 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 |
| ; SVE-NEXT: mov x1, #0 |
| ; SVE-NEXT: mov x2, #0 |
| ; SVE-NEXT: mov x3, #0 |
| ; SVE-NEXT: mov x4, #0 |
| ; SVE-NEXT: mov x5, #0 |
| ; SVE-NEXT: mov x6, #0 |
| ; SVE-NEXT: mov x7, #0 |
| ; SVE-NEXT: mov x8, #0 |
| ; SVE-NEXT: mov x18, #0 |
| ; 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 |
| ; DEFAULT-NEXT: mov x1, #0 |
| ; DEFAULT-NEXT: mov x2, #0 |
| ; DEFAULT-NEXT: mov x3, #0 |
| ; DEFAULT-NEXT: mov x4, #0 |
| ; DEFAULT-NEXT: mov x5, #0 |
| ; DEFAULT-NEXT: mov x6, #0 |
| ; DEFAULT-NEXT: mov x7, #0 |
| ; DEFAULT-NEXT: mov x8, #0 |
| ; DEFAULT-NEXT: mov x9, #0 |
| ; DEFAULT-NEXT: mov x10, #0 |
| ; DEFAULT-NEXT: mov x11, #0 |
| ; DEFAULT-NEXT: mov x12, #0 |
| ; DEFAULT-NEXT: mov x13, #0 |
| ; DEFAULT-NEXT: mov x14, #0 |
| ; DEFAULT-NEXT: mov x15, #0 |
| ; DEFAULT-NEXT: mov x16, #0 |
| ; DEFAULT-NEXT: mov x17, #0 |
| ; DEFAULT-NEXT: mov x18, #0 |
| ; 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 |
| ; SVE-NEXT: mov x1, #0 |
| ; SVE-NEXT: mov x2, #0 |
| ; SVE-NEXT: mov x3, #0 |
| ; SVE-NEXT: mov x4, #0 |
| ; SVE-NEXT: mov x5, #0 |
| ; SVE-NEXT: mov x6, #0 |
| ; SVE-NEXT: mov x7, #0 |
| ; SVE-NEXT: mov x8, #0 |
| ; SVE-NEXT: mov x9, #0 |
| ; SVE-NEXT: mov x10, #0 |
| ; SVE-NEXT: mov x11, #0 |
| ; SVE-NEXT: mov x12, #0 |
| ; SVE-NEXT: mov x13, #0 |
| ; SVE-NEXT: mov x14, #0 |
| ; SVE-NEXT: mov x15, #0 |
| ; SVE-NEXT: mov x16, #0 |
| ; SVE-NEXT: mov x17, #0 |
| ; SVE-NEXT: mov x18, #0 |
| ; 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" } |