11978b4d9SAnton Sidorenko; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 21978b4d9SAnton Sidorenko; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs -mcpu=sifive-u74 \ 314a5b9cdSAnton Sidorenko; RUN: -O1 -riscv-enable-machine-combiner=true \ 41978b4d9SAnton Sidorenko; RUN: -stop-after machine-combiner < %s | FileCheck %s 51978b4d9SAnton Sidorenko 61978b4d9SAnton Sidorenkodefine double @test_reassoc_fadd1(double %a0, double %a1, double %a2, double %a3) { 71978b4d9SAnton Sidorenko ; CHECK-LABEL: name: test_reassoc_fadd1 81978b4d9SAnton Sidorenko ; CHECK: bb.0 (%ir-block.0): 91978b4d9SAnton Sidorenko ; CHECK-NEXT: liveins: $f10_d, $f11_d, $f12_d, $f13_d 101978b4d9SAnton Sidorenko ; CHECK-NEXT: {{ $}} 111978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f13_d 121978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $f12_d 131978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr64 = COPY $f11_d 141978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY3:%[0-9]+]]:fpr64 = COPY $f10_d 151978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FADD_D:%[0-9]+]]:fpr64 = nsz reassoc nofpexcept FADD_D [[COPY3]], [[COPY2]], 7, implicit $frm 161978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FADD_D1:%[0-9]+]]:fpr64 = nsz reassoc nofpexcept FADD_D [[COPY1]], [[COPY]], 7, implicit $frm 171978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FADD_D2:%[0-9]+]]:fpr64 = nsz reassoc nofpexcept FADD_D killed [[FADD_D]], killed [[FADD_D1]], 7, implicit $frm 181978b4d9SAnton Sidorenko ; CHECK-NEXT: $f10_d = COPY [[FADD_D2]] 191978b4d9SAnton Sidorenko ; CHECK-NEXT: PseudoRET implicit $f10_d 201978b4d9SAnton Sidorenko %t0 = fadd nsz reassoc double %a0, %a1 211978b4d9SAnton Sidorenko %t1 = fadd nsz reassoc double %t0, %a2 221978b4d9SAnton Sidorenko %t2 = fadd nsz reassoc double %t1, %a3 231978b4d9SAnton Sidorenko ret double %t2 241978b4d9SAnton Sidorenko} 251978b4d9SAnton Sidorenko 261978b4d9SAnton Sidorenkodefine double @test_reassoc_fmul1(double %a0, double %a1, double %a2, double %a3) { 271978b4d9SAnton Sidorenko ; CHECK-LABEL: name: test_reassoc_fmul1 281978b4d9SAnton Sidorenko ; CHECK: bb.0 (%ir-block.0): 291978b4d9SAnton Sidorenko ; CHECK-NEXT: liveins: $f10_d, $f11_d, $f12_d, $f13_d 301978b4d9SAnton Sidorenko ; CHECK-NEXT: {{ $}} 311978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f13_d 321978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $f12_d 331978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr64 = COPY $f11_d 341978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY3:%[0-9]+]]:fpr64 = COPY $f10_d 351978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FMUL_D:%[0-9]+]]:fpr64 = nsz reassoc nofpexcept FMUL_D [[COPY3]], [[COPY2]], 7, implicit $frm 361978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FMUL_D1:%[0-9]+]]:fpr64 = nsz reassoc nofpexcept FMUL_D [[COPY1]], [[COPY]], 7, implicit $frm 371978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FMUL_D2:%[0-9]+]]:fpr64 = nsz reassoc nofpexcept FMUL_D killed [[FMUL_D]], killed [[FMUL_D1]], 7, implicit $frm 381978b4d9SAnton Sidorenko ; CHECK-NEXT: $f10_d = COPY [[FMUL_D2]] 391978b4d9SAnton Sidorenko ; CHECK-NEXT: PseudoRET implicit $f10_d 401978b4d9SAnton Sidorenko %t0 = fmul nsz reassoc double %a0, %a1 411978b4d9SAnton Sidorenko %t1 = fmul nsz reassoc double %t0, %a2 421978b4d9SAnton Sidorenko %t2 = fmul nsz reassoc double %t1, %a3 431978b4d9SAnton Sidorenko ret double %t2 441978b4d9SAnton Sidorenko} 451978b4d9SAnton Sidorenko 461978b4d9SAnton Sidorenko; Verify flags intersection 471978b4d9SAnton Sidorenkodefine double @test_reassoc_flags1(double %a0, double %a1, double %a2, double %a3) { 481978b4d9SAnton Sidorenko ; CHECK-LABEL: name: test_reassoc_flags1 491978b4d9SAnton Sidorenko ; CHECK: bb.0 (%ir-block.0): 501978b4d9SAnton Sidorenko ; CHECK-NEXT: liveins: $f10_d, $f11_d, $f12_d, $f13_d 511978b4d9SAnton Sidorenko ; CHECK-NEXT: {{ $}} 521978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f13_d 531978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $f12_d 541978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr64 = COPY $f11_d 551978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY3:%[0-9]+]]:fpr64 = COPY $f10_d 561978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FADD_D:%[0-9]+]]:fpr64 = nsz reassoc nofpexcept FADD_D [[COPY3]], [[COPY2]], 7, implicit $frm 571978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FADD_D1:%[0-9]+]]:fpr64 = nsz reassoc nofpexcept FADD_D [[COPY1]], [[COPY]], 7, implicit $frm 581978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FADD_D2:%[0-9]+]]:fpr64 = nsz reassoc nofpexcept FADD_D killed [[FADD_D]], killed [[FADD_D1]], 7, implicit $frm 591978b4d9SAnton Sidorenko ; CHECK-NEXT: $f10_d = COPY [[FADD_D2]] 601978b4d9SAnton Sidorenko ; CHECK-NEXT: PseudoRET implicit $f10_d 611978b4d9SAnton Sidorenko %t0 = fadd nsz reassoc double %a0, %a1 621978b4d9SAnton Sidorenko %t1 = fadd contract nsz reassoc double %t0, %a2 631978b4d9SAnton Sidorenko %t2 = fadd nsz reassoc double %t1, %a3 641978b4d9SAnton Sidorenko ret double %t2 651978b4d9SAnton Sidorenko} 661978b4d9SAnton Sidorenko 671978b4d9SAnton Sidorenko; Verify flags intersection 681978b4d9SAnton Sidorenkodefine double @test_reassoc_flags2(double %a0, double %a1, double %a2, double %a3) { 691978b4d9SAnton Sidorenko ; CHECK-LABEL: name: test_reassoc_flags2 701978b4d9SAnton Sidorenko ; CHECK: bb.0 (%ir-block.0): 711978b4d9SAnton Sidorenko ; CHECK-NEXT: liveins: $f10_d, $f11_d, $f12_d, $f13_d 721978b4d9SAnton Sidorenko ; CHECK-NEXT: {{ $}} 731978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f13_d 741978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $f12_d 751978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr64 = COPY $f11_d 761978b4d9SAnton Sidorenko ; CHECK-NEXT: [[COPY3:%[0-9]+]]:fpr64 = COPY $f10_d 771978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FADD_D:%[0-9]+]]:fpr64 = nsz reassoc nofpexcept FADD_D [[COPY3]], [[COPY2]], 7, implicit $frm 781978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FADD_D1:%[0-9]+]]:fpr64 = nsz contract reassoc nofpexcept FADD_D [[COPY1]], [[COPY]], 7, implicit $frm 791978b4d9SAnton Sidorenko ; CHECK-NEXT: [[FADD_D2:%[0-9]+]]:fpr64 = nsz contract reassoc nofpexcept FADD_D killed [[FADD_D]], killed [[FADD_D1]], 7, implicit $frm 801978b4d9SAnton Sidorenko ; CHECK-NEXT: $f10_d = COPY [[FADD_D2]] 811978b4d9SAnton Sidorenko ; CHECK-NEXT: PseudoRET implicit $f10_d 821978b4d9SAnton Sidorenko %t0 = fadd nsz reassoc double %a0, %a1 831978b4d9SAnton Sidorenko %t1 = fadd contract nsz reassoc double %t0, %a2 841978b4d9SAnton Sidorenko %t2 = fadd contract nsz reassoc double %t1, %a3 851978b4d9SAnton Sidorenko ret double %t2 861978b4d9SAnton Sidorenko} 87374d0765SAnton Sidorenko 88374d0765SAnton Sidorenko; Verify FRM 89374d0765SAnton Sidorenkodefine double @test_fmadd(double %a0, double %a1, double %a2) { 90374d0765SAnton Sidorenko ; CHECK-LABEL: name: test_fmadd 91374d0765SAnton Sidorenko ; CHECK: bb.0 (%ir-block.0): 92374d0765SAnton Sidorenko ; CHECK-NEXT: liveins: $f10_d, $f11_d, $f12_d 93374d0765SAnton Sidorenko ; CHECK-NEXT: {{ $}} 94374d0765SAnton Sidorenko ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f12_d 95374d0765SAnton Sidorenko ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $f11_d 96374d0765SAnton Sidorenko ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr64 = COPY $f10_d 97374d0765SAnton Sidorenko ; CHECK-NEXT: [[FMUL_D:%[0-9]+]]:fpr64 = contract nofpexcept FMUL_D [[COPY2]], [[COPY1]], 7, implicit $frm 98*b6c79073SAnton Sidorenko ; CHECK-NEXT: [[FMADD_D:%[0-9]+]]:fpr64 = contract nofpexcept FMADD_D [[COPY2]], [[COPY1]], [[COPY]], 7, implicit $frm 99*b6c79073SAnton Sidorenko ; CHECK-NEXT: [[FDIV_D:%[0-9]+]]:fpr64 = nofpexcept FDIV_D killed [[FMADD_D]], [[FMUL_D]], 7, implicit $frm 100374d0765SAnton Sidorenko ; CHECK-NEXT: $f10_d = COPY [[FDIV_D]] 101374d0765SAnton Sidorenko ; CHECK-NEXT: PseudoRET implicit $f10_d 102374d0765SAnton Sidorenko %t0 = fmul contract double %a0, %a1 103374d0765SAnton Sidorenko %t1 = fadd contract double %t0, %a2 104374d0765SAnton Sidorenko %t2 = fdiv double %t1, %t0 105374d0765SAnton Sidorenko ret double %t2 106374d0765SAnton Sidorenko} 107