# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -march=amdgcn -mcpu=fiji -run-pass=amdgpu-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s # RUN: llc -march=amdgcn -mcpu=fiji -run-pass=amdgpu-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --- name: test_fminnum body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_fminnum ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FMAXNUM:%[0-9]+]]:_(s32) = G_FMAXNUM [[FNEG]], [[FNEG1]] ; CHECK-NEXT: $vgpr0 = COPY [[FMAXNUM]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_FMINNUM %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_fmaxnum body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_fmaxnum ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FMINNUM:%[0-9]+]]:_(s32) = G_FMINNUM [[FNEG]], [[FNEG1]] ; CHECK-NEXT: $vgpr0 = COPY [[FMINNUM]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_FMAXNUM %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_fminnum_ieee body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_fminnum_ieee ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FMAXNUM_IEEE:%[0-9]+]]:_(s32) = G_FMAXNUM_IEEE [[FNEG]], [[FNEG1]] ; CHECK-NEXT: $vgpr0 = COPY [[FMAXNUM_IEEE]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_FMINNUM_IEEE %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_fmaxnum_ieee body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_fmaxnum_ieee ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FMINNUM_IEEE:%[0-9]+]]:_(s32) = G_FMINNUM_IEEE [[FNEG]], [[FNEG1]] ; CHECK-NEXT: $vgpr0 = COPY [[FMINNUM_IEEE]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_FMAXNUM_IEEE %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_amdgpu_fmin_legacy body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_amdgpu_fmin_legacy ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[AMDGPU_FMAX_LEGACY:%[0-9]+]]:_(s32) = G_AMDGPU_FMAX_LEGACY [[FNEG]], [[FNEG1]] ; CHECK-NEXT: $vgpr0 = COPY [[AMDGPU_FMAX_LEGACY]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_AMDGPU_FMIN_LEGACY %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_amdgpu_fmax_legacy body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_amdgpu_fmax_legacy ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[AMDGPU_FMIN_LEGACY:%[0-9]+]]:_(s32) = G_AMDGPU_FMIN_LEGACY [[FNEG]], [[FNEG1]] ; CHECK-NEXT: $vgpr0 = COPY [[AMDGPU_FMIN_LEGACY]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_AMDGPU_FMAX_LEGACY %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_fadd body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_fadd ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FSUB:%[0-9]+]]:_(s32) = nsz G_FSUB [[FNEG]], [[COPY1]] ; CHECK-NEXT: $vgpr0 = COPY [[FSUB]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = nsz G_FADD %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_fsub body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_fsub ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FSUB:%[0-9]+]]:_(s32) = nsz G_FSUB [[COPY1]], [[COPY]] ; CHECK-NEXT: $vgpr0 = COPY [[FSUB]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = nsz G_FSUB %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_fma body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-LABEL: name: test_fma ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[COPY2]] ; CHECK-NEXT: [[FMA:%[0-9]+]]:_(s32) = nsz G_FMA [[COPY]], [[FNEG]], [[FNEG1]] ; CHECK-NEXT: $vgpr0 = COPY [[FMA]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = nsz G_FMA %0, %1, %2 %4:_(s32) = G_FNEG %3 $vgpr0 = COPY %4(s32) ... --- name: test_fmad body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-LABEL: name: test_fmad ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[COPY2]] ; CHECK-NEXT: [[FMAD:%[0-9]+]]:_(s32) = nsz G_FMAD [[COPY]], [[FNEG]], [[FNEG1]] ; CHECK-NEXT: $vgpr0 = COPY [[FMAD]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = nsz G_FMAD %0, %1, %2 %4:_(s32) = G_FNEG %3 $vgpr0 = COPY %4(s32) ... --- name: test_fmul body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_fmul ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FMUL:%[0-9]+]]:_(s32) = G_FMUL [[COPY]], [[FNEG]] ; CHECK-NEXT: $vgpr0 = COPY [[FMUL]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_FMUL %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_fpext body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_fpext ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s16) = G_FNEG [[TRUNC]] ; CHECK-NEXT: [[FPEXT:%[0-9]+]]:_(s32) = G_FPEXT [[FNEG]](s16) ; CHECK-NEXT: $vgpr0 = COPY [[FPEXT]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s16) = G_TRUNC %0(s32) %2:_(s32) = G_FPEXT %1(s16) %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_intrinsic_trunc body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_intrinsic_trunc ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[INTRINSIC_TRUNC:%[0-9]+]]:_(s32) = G_INTRINSIC_TRUNC [[FNEG]] ; CHECK-NEXT: $vgpr0 = COPY [[INTRINSIC_TRUNC]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_INTRINSIC_TRUNC %0 %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_frint body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_frint ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FRINT:%[0-9]+]]:_(s32) = G_FRINT [[FNEG]] ; CHECK-NEXT: $vgpr0 = COPY [[FRINT]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_FRINT %0 %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_fnearbyint body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_fnearbyint ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FNEARBYINT:%[0-9]+]]:_(s32) = G_FNEARBYINT [[FNEG]] ; CHECK-NEXT: $vgpr0 = COPY [[FNEARBYINT]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_FNEARBYINT %0 %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_intrinsic_round body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_intrinsic_round ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[INTRINSIC_ROUND:%[0-9]+]]:_(s32) = G_INTRINSIC_ROUND [[FNEG]] ; CHECK-NEXT: $vgpr0 = COPY [[INTRINSIC_ROUND]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_INTRINSIC_ROUND %0 %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_intrinsic_roundeven body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_intrinsic_roundeven ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[INTRINSIC_ROUNDEVEN:%[0-9]+]]:_(s32) = G_INTRINSIC_ROUNDEVEN [[FNEG]] ; CHECK-NEXT: $vgpr0 = COPY [[INTRINSIC_ROUNDEVEN]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_INTRINSIC_ROUNDEVEN %0 %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_fsin body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_fsin ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FSIN:%[0-9]+]]:_(s32) = G_FSIN [[FNEG]] ; CHECK-NEXT: $vgpr0 = COPY [[FSIN]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_FSIN %0 %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_fcanonicalize body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_fcanonicalize ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FCANONICALIZE:%[0-9]+]]:_(s32) = G_FCANONICALIZE [[FNEG]] ; CHECK-NEXT: $vgpr0 = COPY [[FCANONICALIZE]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_FCANONICALIZE %0 %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_amdgcn_rcp_iflag body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_amdgcn_rcp_iflag ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[AMDGPU_RCP_IFLAG:%[0-9]+]]:_(s32) = G_AMDGPU_RCP_IFLAG [[FNEG]](s32) ; CHECK-NEXT: $vgpr0 = COPY [[AMDGPU_RCP_IFLAG]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_AMDGPU_RCP_IFLAG %0 %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_fptrunc body: | bb.0: liveins: $vgpr0_vgpr1 ; CHECK-LABEL: name: test_fptrunc ; CHECK: liveins: $vgpr0_vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s64) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FPTRUNC:%[0-9]+]]:_(s32) = G_FPTRUNC [[FNEG]](s64) ; CHECK-NEXT: $vgpr0 = COPY [[FPTRUNC]](s32) %0:_(s64) = COPY $vgpr0_vgpr1 %1:_(s32) = G_FPTRUNC %0:_(s64) %2:_(s32) = G_FNEG %1:_ $vgpr0 = COPY %2:_(s32) ... --- name: test_amdgcn_rcp body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_amdgcn_rcp ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[INT:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.rcp), [[FNEG]](s32) ; CHECK-NEXT: $vgpr0 = COPY [[INT]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.rcp), %0(s32) %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_amdgcn_rcp_legacy body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_amdgcn_rcp_legacy ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[INT:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.rcp.legacy), [[FNEG]](s32) ; CHECK-NEXT: $vgpr0 = COPY [[INT]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.rcp.legacy), %0(s32) %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_amdgcn_sin body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_amdgcn_sin ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[INT:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.sin), [[FNEG]](s32) ; CHECK-NEXT: $vgpr0 = COPY [[INT]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.sin), %0(s32) %2:_(s32) = G_FNEG %1 $vgpr0 = COPY %2(s32) ... --- name: test_fmul_legacy body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_fmul_legacy ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[INT:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.fmul.legacy), [[COPY]](s32), [[FNEG]](s32) ; CHECK-NEXT: $vgpr0 = COPY [[INT]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.fmul.legacy), %0(s32), %1(s32) %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_fmed3 body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-LABEL: name: test_fmed3 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FNEG2:%[0-9]+]]:_(s32) = G_FNEG [[COPY2]] ; CHECK-NEXT: [[INT:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.fmed3), [[FNEG]](s32), [[FNEG1]](s32), [[FNEG2]](s32) ; CHECK-NEXT: $vgpr0 = COPY [[INT]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.fmed3), %0(s32), %1(s32), %2(s32) %4:_(s32) = G_FNEG %3 $vgpr0 = COPY %4(s32) ... --- name: test_amdgcn_fma_legacy body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-LABEL: name: test_amdgcn_fma_legacy ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[COPY2]] ; CHECK-NEXT: [[INT:%[0-9]+]]:_(s32) = nsz G_INTRINSIC intrinsic(@llvm.amdgcn.fma.legacy), [[COPY]](s32), [[FNEG]](s32), [[FNEG1]](s32) ; CHECK-NEXT: $vgpr0 = COPY [[INT]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = nsz G_INTRINSIC intrinsic(@llvm.amdgcn.fma.legacy), %0(s32), %1(s32), %2(s32) %4:_(s32) = G_FNEG %3 $vgpr0 = COPY %4(s32) ... # Don't fold fneg for fadd, fsub, fma, fmad or fma_legacy without nsz --- name: test_fadd_sz body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_fadd_sz ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FADD:%[0-9]+]]:_(s32) = G_FADD [[COPY]], [[COPY1]] ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[FADD]] ; CHECK-NEXT: $vgpr0 = COPY [[FNEG]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_FADD %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_fsub_sz body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_fsub_sz ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FSUB:%[0-9]+]]:_(s32) = G_FSUB [[COPY]], [[COPY1]] ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[FSUB]] ; CHECK-NEXT: $vgpr0 = COPY [[FNEG]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_FSUB %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %3(s32) ... --- name: test_fma_sz body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-LABEL: name: test_fma_sz ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 ; CHECK-NEXT: [[FMA:%[0-9]+]]:_(s32) = G_FMA [[COPY]], [[COPY1]], [[COPY2]] ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[FMA]] ; CHECK-NEXT: $vgpr0 = COPY [[FNEG]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = G_FMA %0, %1, %2 %4:_(s32) = G_FNEG %3 $vgpr0 = COPY %4(s32) ... --- name: test_fmad_sz body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-LABEL: name: test_fmad_sz ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 ; CHECK-NEXT: [[FMAD:%[0-9]+]]:_(s32) = G_FMAD [[COPY]], [[COPY1]], [[COPY2]] ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[FMAD]] ; CHECK-NEXT: $vgpr0 = COPY [[FNEG]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = G_FMAD %0, %1, %2 %4:_(s32) = G_FNEG %3 $vgpr0 = COPY %4(s32) ... --- name: test_amdgcn_fma_legacy_sz body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-LABEL: name: test_amdgcn_fma_legacy_sz ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 ; CHECK-NEXT: [[INT:%[0-9]+]]:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.fma.legacy), [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32) ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[INT]] ; CHECK-NEXT: $vgpr0 = COPY [[FNEG]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.fma.legacy), %0(s32), %1(s32), %2(s32) %4:_(s32) = G_FNEG %3 $vgpr0 = COPY %4(s32) ... # Don't negate 0 for minnum, maxnum --- name: test_fminnum_zero body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_fminnum_zero ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 0.000000e+00 ; CHECK-NEXT: [[FMINNUM:%[0-9]+]]:_(s32) = G_FMINNUM [[COPY]], [[C]] ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[FMINNUM]] ; CHECK-NEXT: $vgpr0 = COPY [[FNEG]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_FCONSTANT float 0.000000e+00 %2:_(s32) = G_FMINNUM %0:_, %1:_ %3:_(s32) = G_FNEG %2:_ $vgpr0 = COPY %3:_(s32) ... # On VI and above don't negate 1.0 / (0.5 * pi) --- name: test_fminnum_inv2pi_half body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_fminnum_inv2pi_half ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_FCONSTANT half 0xH3118 ; CHECK-NEXT: [[FMINNUM:%[0-9]+]]:_(s16) = G_FMINNUM [[TRUNC]], [[C]] ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s16) = G_FNEG [[FMINNUM]] ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[FNEG]](s16) ; CHECK-NEXT: $vgpr0 = COPY [[ANYEXT]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s16) = G_TRUNC %0:_(s32) %2:_(s16) = G_FCONSTANT half 0xH3118 %3:_(s16) = G_FMINNUM %1:_, %2:_ %4:_(s16) = G_FNEG %3:_ %5:_(s32) = G_ANYEXT %4:_(s16) $vgpr0 = COPY %5:_(s32) ... --- name: test_fminnum_inv2pi_float body: | bb.0: liveins: $vgpr0 ; CHECK-LABEL: name: test_fminnum_inv2pi_float ; CHECK: liveins: $vgpr0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 0x3FC45F3060000000 ; CHECK-NEXT: [[FMINNUM:%[0-9]+]]:_(s32) = G_FMINNUM [[COPY]], [[C]] ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[FMINNUM]] ; CHECK-NEXT: $vgpr0 = COPY [[FNEG]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = G_FCONSTANT float 0x3FC45F3060000000 %2:_(s32) = G_FMINNUM %0:_, %1:_ %3:_(s32) = G_FNEG %2:_ $vgpr0 = COPY %3:_(s32) ... --- name: test_fminnum_inv2pi_double body: | bb.0: liveins: $vgpr0_vgpr1 ; CHECK-LABEL: name: test_fminnum_inv2pi_double ; CHECK: liveins: $vgpr0_vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 0x3FC45F306DC9C882 ; CHECK-NEXT: [[FMINNUM:%[0-9]+]]:_(s64) = G_FMINNUM [[COPY]], [[C]] ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s64) = G_FNEG [[FMINNUM]] ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[FNEG]](s64) %0:_(s64) = COPY $vgpr0_vgpr1 %1:_(s64) = G_FCONSTANT double 0x3FC45F306DC9C882 %2:_(s64) = G_FMINNUM %0:_, %1:_ %3:_(s64) = G_FNEG %2:_ $vgpr0_vgpr1 = COPY %3:_(s64) ... #Don't fold when where instruction count will not decrease. --- name: test_use_both body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-LABEL: name: test_use_both ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 ; CHECK-NEXT: [[FMUL:%[0-9]+]]:_(s32) = G_FMUL [[COPY]], [[COPY1]] ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[FMUL]] ; CHECK-NEXT: [[FMUL1:%[0-9]+]]:_(s32) = G_FMUL [[FNEG]], [[COPY2]] ; CHECK-NEXT: $vgpr0 = COPY [[FMUL]](s32) ; CHECK-NEXT: $vgpr1 = COPY [[FNEG]](s32) ; CHECK-NEXT: $vgpr2 = COPY [[FMUL1]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = G_FMUL %0, %1 %4:_(s32) = G_FNEG %3 %5:_(s32) = G_FMUL %4, %2 $vgpr0 = COPY %3:_(s32) $vgpr1 = COPY %4:_(s32) $vgpr2 = COPY %5:_(s32) ... #Don't fold when where instruction count will not decrease. --- name: test_use_both2 body: | bb.0: liveins: $vgpr0, $vgpr1 ; CHECK-LABEL: name: test_use_both2 ; CHECK: liveins: $vgpr0, $vgpr1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[FMUL:%[0-9]+]]:_(s32) = G_FMUL [[COPY]], [[COPY1]] ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[FMUL]] ; CHECK-NEXT: $vgpr0 = COPY [[FMUL]](s32) ; CHECK-NEXT: $vgpr1 = COPY [[FNEG]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = G_FMUL %0, %1 %3:_(s32) = G_FNEG %2 $vgpr0 = COPY %2:_(s32) $vgpr1 = COPY %3:_(s32) ... --- name: multiple_uses_of_fneg body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3 ; CHECK-LABEL: name: multiple_uses_of_fneg ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FMUL:%[0-9]+]]:_(s32) = G_FMUL [[COPY]], [[FNEG]] ; CHECK-NEXT: [[FMUL1:%[0-9]+]]:_(s32) = G_FMUL [[FMUL]], [[COPY2]] ; CHECK-NEXT: [[FMUL2:%[0-9]+]]:_(s32) = G_FMUL [[FMUL]], [[COPY3]] ; CHECK-NEXT: $vgpr0 = COPY [[FMUL]](s32) ; CHECK-NEXT: $vgpr1 = COPY [[FMUL1]](s32) ; CHECK-NEXT: $vgpr2 = COPY [[FMUL2]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = COPY $vgpr3 %4:_(s32) = G_FMUL %0, %1 %5:_(s32) = G_FNEG %4 %6:_(s32) = G_FMUL %5, %2 %7:_(s32) = G_FMUL %5, %3 $vgpr0 = COPY %5:_(s32) $vgpr1 = COPY %6:_(s32) $vgpr2 = COPY %7:_(s32) ... # Check if new fneg is inserted at the appropriate place --- name: fneg_src_has_multiple_uses body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-LABEL: name: fneg_src_has_multiple_uses ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2 ; CHECK-NEXT: [[FNEG:%[0-9]+]]:_(s32) = G_FNEG [[COPY1]] ; CHECK-NEXT: [[FMUL:%[0-9]+]]:_(s32) = G_FMUL [[COPY]], [[FNEG]] ; CHECK-NEXT: [[FNEG1:%[0-9]+]]:_(s32) = G_FNEG [[FMUL]] ; CHECK-NEXT: [[FMUL1:%[0-9]+]]:_(s32) = G_FMUL [[FNEG1]], [[COPY2]] ; CHECK-NEXT: $vgpr0 = COPY [[FMUL1]](s32) ; CHECK-NEXT: $vgpr1 = COPY [[FMUL]](s32) %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = G_FMUL %0:_, %1:_ %4:_(s32) = G_FMUL %3:_, %2:_ %5:_(s32) = G_FNEG %3:_ $vgpr0 = COPY %4:_(s32) $vgpr1 = COPY %5:_(s32) ...