xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/dag-fmf-cse.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=fma -enable-unsafe-fp-math -enable-fmf-dag=1 | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; If fast-math-flags are propagated correctly, the mul1 expression
5*9880d681SAndroid Build Coastguard Worker; should be recognized as a factor in the last fsub, so we should
6*9880d681SAndroid Build Coastguard Worker; see a mul and add, not a mul and fma:
7*9880d681SAndroid Build Coastguard Worker; a * b - (-a * b) ---> (a * b) + (a * b)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine float @fmf_should_not_break_cse(float %a, float %b) {
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmf_should_not_break_cse:
11*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vmulss %xmm1, %xmm0, %xmm0
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    vaddss %xmm0, %xmm0, %xmm0
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker  %mul1 = fmul fast float %a, %b
17*9880d681SAndroid Build Coastguard Worker  %nega = fsub fast float 0.0, %a
18*9880d681SAndroid Build Coastguard Worker  %mul2 = fmul fast float %nega, %b
19*9880d681SAndroid Build Coastguard Worker  %abx2 = fsub fast float %mul1, %mul2
20*9880d681SAndroid Build Coastguard Worker  ret float %abx2
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23