1# RUN: llc -run-pass=machine-combiner -mtriple=aarch64-unknown-linux-gnu %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SAFE 2# RUN: llc -run-pass=machine-combiner -mtriple=aarch64-unknown-linux-gnu -enable-unsafe-fp-math %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-UNSAFE 3 4# fadd without the reassoc flags can be reassociate only when unsafe fp math is 5# enabled. 6# CHECK-LABEL: name: fadd_no_reassoc 7# CHECK: [[ADD1:%[0-9]+]]:fpr32 = FADDSrr %0, %1, implicit $fpcr 8# CHECK-SAFE-NEXT: [[ADD2:%[0-9]+]]:fpr32 = FADDSrr killed [[ADD1]], %2, implicit $fpcr 9# CHECK-SAFE-NEXT: [[ADD3:%[0-9]+]]:fpr32 = FADDSrr killed [[ADD2]], %3, implicit $fpcr 10# CHECK-UNSAFE-NEXT: [[ADD2:%[0-9]+]]:fpr32 = FADDSrr %2, %3, implicit $fpcr 11# CHECK-UNSAFE-NEXT: [[ADD3:%[0-9]+]]:fpr32 = FADDSrr killed [[ADD1]], killed [[ADD2]], implicit $fpcr 12--- 13name: fadd_no_reassoc 14alignment: 4 15tracksRegLiveness: true 16registers: 17 - { id: 0, class: fpr32 } 18 - { id: 1, class: fpr32 } 19 - { id: 2, class: fpr32 } 20 - { id: 3, class: fpr32 } 21 - { id: 4, class: fpr32 } 22 - { id: 5, class: fpr32 } 23 - { id: 6, class: fpr32 } 24liveins: 25 - { reg: '$s0', virtual-reg: '%0' } 26 - { reg: '$s1', virtual-reg: '%1' } 27 - { reg: '$s2', virtual-reg: '%2' } 28 - { reg: '$s3', virtual-reg: '%3' } 29frameInfo: 30 maxAlignment: 1 31 maxCallFrameSize: 0 32machineFunctionInfo: {} 33body: | 34 bb.0.entry: 35 liveins: $s0, $s1, $s2, $s3 36 37 %3:fpr32 = COPY $s3 38 %2:fpr32 = COPY $s2 39 %1:fpr32 = COPY $s1 40 %0:fpr32 = COPY $s0 41 %4:fpr32 = FADDSrr %0, %1, implicit $fpcr 42 %5:fpr32 = FADDSrr killed %4, %2, implicit $fpcr 43 %6:fpr32 = FADDSrr killed %5, %3, implicit $fpcr 44 $s0 = COPY %6 45 RET_ReallyLR implicit $s0 46 47 48# FIXME: We should be able to reassociate without unsafe fp math, but currently 49# the reassoc flag is ignored. 50# CHECK-LABEL: name: fadd_reassoc 51# CHECK: [[ADD1:%[0-9]+]]:fpr32 = reassoc FADDSrr %0, %1, implicit $fpcr 52# CHECK-SAFE-NEXT: [[ADD2:%[0-9]+]]:fpr32 = reassoc FADDSrr killed [[ADD1]], %2, implicit $fpcr 53# CHECK-SAFE-NEXT: [[ADD3:%[0-9]+]]:fpr32 = reassoc FADDSrr killed [[ADD2]], %3, implicit $fpcr 54# CHECK-UNSAFE-NEXT: [[ADD2:%[0-9]+]]:fpr32 = reassoc FADDSrr %2, %3, implicit $fpcr 55# CHECK-UNSAFE-NEXT: [[ADD3:%[0-9]+]]:fpr32 = reassoc FADDSrr killed [[ADD1]], killed [[ADD2]], implicit $fpcr 56--- 57name: fadd_reassoc 58alignment: 4 59tracksRegLiveness: true 60registers: 61 - { id: 0, class: fpr32 } 62 - { id: 1, class: fpr32 } 63 - { id: 2, class: fpr32 } 64 - { id: 3, class: fpr32 } 65 - { id: 4, class: fpr32 } 66 - { id: 5, class: fpr32 } 67 - { id: 6, class: fpr32 } 68liveins: 69 - { reg: '$s0', virtual-reg: '%0' } 70 - { reg: '$s1', virtual-reg: '%1' } 71 - { reg: '$s2', virtual-reg: '%2' } 72 - { reg: '$s3', virtual-reg: '%3' } 73frameInfo: 74 maxAlignment: 1 75 maxCallFrameSize: 0 76machineFunctionInfo: {} 77body: | 78 bb.0.entry: 79 liveins: $s0, $s1, $s2, $s3 80 81 %3:fpr32 = COPY $s3 82 %2:fpr32 = COPY $s2 83 %1:fpr32 = COPY $s1 84 %0:fpr32 = COPY $s0 85 %4:fpr32 = reassoc FADDSrr %0, %1, implicit $fpcr 86 %5:fpr32 = reassoc FADDSrr killed %4, %2, implicit $fpcr 87 %6:fpr32 = reassoc FADDSrr killed %5, %3, implicit $fpcr 88 $s0 = COPY %6 89 RET_ReallyLR implicit $s0 90 91 92# Check that flags on the instructions are preserved after reassociation. 93# CHECK-LABEL: name: fadd_flags 94# CHECK: [[ADD1:%[0-9]+]]:fpr32 = nnan ninf nsz FADDSrr %0, %1, implicit $fpcr 95# CHECK-SAFE-NEXT: [[ADD2:%[0-9]+]]:fpr32 = nnan nsz FADDSrr killed [[ADD1]], %2, implicit $fpcr 96# CHECK-SAFE-NEXT: [[ADD3:%[0-9]+]]:fpr32 = ninf nsz FADDSrr killed [[ADD2]], %3, implicit $fpcr 97# CHECK-UNSAFE-NEXT: [[ADD2:%[0-9]+]]:fpr32 = nsz FADDSrr %2, %3, implicit $fpcr 98# CHECK-UNSAFE-NEXT: [[ADD3:%[0-9]+]]:fpr32 = nsz FADDSrr killed [[ADD1]], killed [[ADD2]], implicit $fpcr 99--- 100name: fadd_flags 101alignment: 4 102tracksRegLiveness: true 103registers: 104 - { id: 0, class: fpr32 } 105 - { id: 1, class: fpr32 } 106 - { id: 2, class: fpr32 } 107 - { id: 3, class: fpr32 } 108 - { id: 4, class: fpr32 } 109 - { id: 5, class: fpr32 } 110 - { id: 6, class: fpr32 } 111liveins: 112 - { reg: '$s0', virtual-reg: '%0' } 113 - { reg: '$s1', virtual-reg: '%1' } 114 - { reg: '$s2', virtual-reg: '%2' } 115 - { reg: '$s3', virtual-reg: '%3' } 116frameInfo: 117 maxAlignment: 1 118 maxCallFrameSize: 0 119machineFunctionInfo: {} 120body: | 121 bb.0.entry: 122 liveins: $s0, $s1, $s2, $s3 123 124 %3:fpr32 = COPY $s3 125 %2:fpr32 = COPY $s2 126 %1:fpr32 = COPY $s1 127 %0:fpr32 = COPY $s0 128 %4:fpr32 = nsz nnan ninf FADDSrr %0, %1, implicit $fpcr 129 %5:fpr32 = nsz nnan FADDSrr killed %4, %2, implicit $fpcr 130 %6:fpr32 = nsz ninf FADDSrr killed %5, %3, implicit $fpcr 131 $s0 = COPY %6 132 RET_ReallyLR implicit $s0 133