1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs -fp-contract=fast < %s | FileCheck -check-prefix=SI-FASTFMAF -check-prefix=SI -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs -fp-contract=fast < %s | FileCheck -check-prefix=SI-SLOWFMAF -check-prefix=SI -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #0 5*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fabs.f64(double) #0 6*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double, double, double) #0 7*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fma.f32(float, float, float) #0 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; (fadd (fmul x, y), z) -> (fma x, y, z) 10*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_f64_0: 11*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 12*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 13*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 14*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[C]] 15*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]] 16*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_f64_0(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 17*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 18*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 19*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 20*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 21*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0 24*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1 25*9880d681SAndroid Build Coastguard Worker %c = load volatile double, double addrspace(1)* %gep.2 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker %mul = fmul double %a, %b 28*9880d681SAndroid Build Coastguard Worker %fma = fadd double %mul, %c 29*9880d681SAndroid Build Coastguard Worker store double %fma, double addrspace(1)* %gep.out 30*9880d681SAndroid Build Coastguard Worker ret void 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; (fadd (fmul x, y), z) -> (fma x, y, z) 34*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_f64_0_2use: 35*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 36*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 37*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 38*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[D:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:24{{$}} 39*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[C]] 40*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT1:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[D]] 41*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT0]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 42*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT1]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 43*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 44*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_f64_0_2use(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 45*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 46*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 47*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 48*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 49*9880d681SAndroid Build Coastguard Worker %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3 50*9880d681SAndroid Build Coastguard Worker %gep.out.0 = getelementptr double, double addrspace(1)* %out, i32 %tid 51*9880d681SAndroid Build Coastguard Worker %gep.out.1 = getelementptr double, double addrspace(1)* %gep.out.0, i32 1 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0 54*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1 55*9880d681SAndroid Build Coastguard Worker %c = load volatile double, double addrspace(1)* %gep.2 56*9880d681SAndroid Build Coastguard Worker %d = load volatile double, double addrspace(1)* %gep.3 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker %mul = fmul double %a, %b 59*9880d681SAndroid Build Coastguard Worker %fma0 = fadd double %mul, %c 60*9880d681SAndroid Build Coastguard Worker %fma1 = fadd double %mul, %d 61*9880d681SAndroid Build Coastguard Worker store volatile double %fma0, double addrspace(1)* %gep.out.0 62*9880d681SAndroid Build Coastguard Worker store volatile double %fma1, double addrspace(1)* %gep.out.1 63*9880d681SAndroid Build Coastguard Worker ret void 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; (fadd x, (fmul y, z)) -> (fma y, z, x) 67*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_f64_1: 68*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 69*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 70*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 71*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[C]] 72*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]] 73*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_f64_1(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 74*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 75*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 76*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 77*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 78*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0 81*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1 82*9880d681SAndroid Build Coastguard Worker %c = load volatile double, double addrspace(1)* %gep.2 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker %mul = fmul double %a, %b 85*9880d681SAndroid Build Coastguard Worker %fma = fadd double %c, %mul 86*9880d681SAndroid Build Coastguard Worker store double %fma, double addrspace(1)* %gep.out 87*9880d681SAndroid Build Coastguard Worker ret void 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker; (fsub (fmul x, y), z) -> (fma x, y, (fneg z)) 91*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_0_f64: 92*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 93*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 94*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 95*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], -[[C]] 96*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]] 97*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_0_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 98*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 99*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 100*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 101*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 102*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0 105*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1 106*9880d681SAndroid Build Coastguard Worker %c = load volatile double, double addrspace(1)* %gep.2 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker %mul = fmul double %a, %b 109*9880d681SAndroid Build Coastguard Worker %fma = fsub double %mul, %c 110*9880d681SAndroid Build Coastguard Worker store double %fma, double addrspace(1)* %gep.out 111*9880d681SAndroid Build Coastguard Worker ret void 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; (fsub (fmul x, y), z) -> (fma x, y, (fneg z)) 115*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_f64_0_2use: 116*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 117*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 118*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 119*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[D:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:24{{$}} 120*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], -[[C]] 121*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT1:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], -[[D]] 122*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT0]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 123*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT1]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 124*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 125*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_f64_0_2use(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 126*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 127*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 128*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 129*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 130*9880d681SAndroid Build Coastguard Worker %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3 131*9880d681SAndroid Build Coastguard Worker %gep.out.0 = getelementptr double, double addrspace(1)* %out, i32 %tid 132*9880d681SAndroid Build Coastguard Worker %gep.out.1 = getelementptr double, double addrspace(1)* %gep.out.0, i32 1 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0 135*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1 136*9880d681SAndroid Build Coastguard Worker %c = load volatile double, double addrspace(1)* %gep.2 137*9880d681SAndroid Build Coastguard Worker %d = load volatile double, double addrspace(1)* %gep.3 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker %mul = fmul double %a, %b 140*9880d681SAndroid Build Coastguard Worker %fma0 = fsub double %mul, %c 141*9880d681SAndroid Build Coastguard Worker %fma1 = fsub double %mul, %d 142*9880d681SAndroid Build Coastguard Worker store volatile double %fma0, double addrspace(1)* %gep.out.0 143*9880d681SAndroid Build Coastguard Worker store volatile double %fma1, double addrspace(1)* %gep.out.1 144*9880d681SAndroid Build Coastguard Worker ret void 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker; (fsub x, (fmul y, z)) -> (fma (fneg y), z, x) 148*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_1_f64: 149*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 150*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 151*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 152*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], [[C]] 153*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]] 154*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_1_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 155*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 156*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 157*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 158*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 159*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0 162*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1 163*9880d681SAndroid Build Coastguard Worker %c = load volatile double, double addrspace(1)* %gep.2 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker %mul = fmul double %a, %b 166*9880d681SAndroid Build Coastguard Worker %fma = fsub double %c, %mul 167*9880d681SAndroid Build Coastguard Worker store double %fma, double addrspace(1)* %gep.out 168*9880d681SAndroid Build Coastguard Worker ret void 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker; (fsub x, (fmul y, z)) -> (fma (fneg y), z, x) 172*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_1_f64_2use: 173*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 174*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 175*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 176*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[D:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:24{{$}} 177*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], [[C]] 178*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT1:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], [[D]] 179*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT0]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 180*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT1]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 181*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 182*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_1_f64_2use(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 183*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 184*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 185*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 186*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 187*9880d681SAndroid Build Coastguard Worker %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3 188*9880d681SAndroid Build Coastguard Worker %gep.out.0 = getelementptr double, double addrspace(1)* %out, i32 %tid 189*9880d681SAndroid Build Coastguard Worker %gep.out.1 = getelementptr double, double addrspace(1)* %gep.out.0, i32 1 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0 192*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1 193*9880d681SAndroid Build Coastguard Worker %c = load volatile double, double addrspace(1)* %gep.2 194*9880d681SAndroid Build Coastguard Worker %d = load volatile double, double addrspace(1)* %gep.3 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker %mul = fmul double %a, %b 197*9880d681SAndroid Build Coastguard Worker %fma0 = fsub double %c, %mul 198*9880d681SAndroid Build Coastguard Worker %fma1 = fsub double %d, %mul 199*9880d681SAndroid Build Coastguard Worker store volatile double %fma0, double addrspace(1)* %gep.out.0 200*9880d681SAndroid Build Coastguard Worker store volatile double %fma1, double addrspace(1)* %gep.out.1 201*9880d681SAndroid Build Coastguard Worker ret void 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker; (fsub (fneg (fmul x, y)), z) -> (fma (fneg x), y, (fneg z)) 205*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_2_f64: 206*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 207*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 208*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 209*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], -[[C]] 210*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]] 211*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_2_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 212*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 213*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 214*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 215*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 216*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0 219*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1 220*9880d681SAndroid Build Coastguard Worker %c = load volatile double, double addrspace(1)* %gep.2 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker %mul = fmul double %a, %b 223*9880d681SAndroid Build Coastguard Worker %mul.neg = fsub double -0.0, %mul 224*9880d681SAndroid Build Coastguard Worker %fma = fsub double %mul.neg, %c 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker store double %fma, double addrspace(1)* %gep.out 227*9880d681SAndroid Build Coastguard Worker ret void 228*9880d681SAndroid Build Coastguard Worker} 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker; (fsub (fneg (fmul x, y)), z) -> (fma (fneg x), y, (fneg z)) 231*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_2_f64_2uses_neg: 232*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 233*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 234*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 235*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], -[[C]] 236*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT1:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], -[[D]] 237*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT0]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 238*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT1]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 239*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 240*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_2_f64_2uses_neg(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 241*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 242*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 243*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 244*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 245*9880d681SAndroid Build Coastguard Worker %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3 246*9880d681SAndroid Build Coastguard Worker %gep.out.0 = getelementptr double, double addrspace(1)* %out, i32 %tid 247*9880d681SAndroid Build Coastguard Worker %gep.out.1 = getelementptr double, double addrspace(1)* %gep.out.0, i32 1 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0 250*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1 251*9880d681SAndroid Build Coastguard Worker %c = load volatile double, double addrspace(1)* %gep.2 252*9880d681SAndroid Build Coastguard Worker %d = load volatile double, double addrspace(1)* %gep.3 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker %mul = fmul double %a, %b 255*9880d681SAndroid Build Coastguard Worker %mul.neg = fsub double -0.0, %mul 256*9880d681SAndroid Build Coastguard Worker %fma0 = fsub double %mul.neg, %c 257*9880d681SAndroid Build Coastguard Worker %fma1 = fsub double %mul.neg, %d 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker store volatile double %fma0, double addrspace(1)* %gep.out.0 260*9880d681SAndroid Build Coastguard Worker store volatile double %fma1, double addrspace(1)* %gep.out.1 261*9880d681SAndroid Build Coastguard Worker ret void 262*9880d681SAndroid Build Coastguard Worker} 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Worker; (fsub (fneg (fmul x, y)), z) -> (fma (fneg x), y, (fneg z)) 265*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}combine_to_fma_fsub_2_f64_2uses_mul: 266*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 267*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 268*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[C:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 269*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], -[[A]], [[B]], -[[C]] 270*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_fma_f64 [[RESULT1:v\[[0-9]+:[0-9]+\]]], [[A]], [[B]], -[[D]] 271*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT0]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 272*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dwordx2 [[RESULT1]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 273*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 274*9880d681SAndroid Build Coastguard Workerdefine void @combine_to_fma_fsub_2_f64_2uses_mul(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 275*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 276*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 277*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 278*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 279*9880d681SAndroid Build Coastguard Worker %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3 280*9880d681SAndroid Build Coastguard Worker %gep.out.0 = getelementptr double, double addrspace(1)* %out, i32 %tid 281*9880d681SAndroid Build Coastguard Worker %gep.out.1 = getelementptr double, double addrspace(1)* %gep.out.0, i32 1 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker %a = load volatile double, double addrspace(1)* %gep.0 284*9880d681SAndroid Build Coastguard Worker %b = load volatile double, double addrspace(1)* %gep.1 285*9880d681SAndroid Build Coastguard Worker %c = load volatile double, double addrspace(1)* %gep.2 286*9880d681SAndroid Build Coastguard Worker %d = load volatile double, double addrspace(1)* %gep.3 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker %mul = fmul double %a, %b 289*9880d681SAndroid Build Coastguard Worker %mul.neg = fsub double -0.0, %mul 290*9880d681SAndroid Build Coastguard Worker %fma0 = fsub double %mul.neg, %c 291*9880d681SAndroid Build Coastguard Worker %fma1 = fsub double %mul, %d 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker store volatile double %fma0, double addrspace(1)* %gep.out.0 294*9880d681SAndroid Build Coastguard Worker store volatile double %fma1, double addrspace(1)* %gep.out.1 295*9880d681SAndroid Build Coastguard Worker ret void 296*9880d681SAndroid Build Coastguard Worker} 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker; fold (fsub (fma x, y, (fmul u, v)), z) -> (fma x, y (fma u, v, (fneg z))) 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}aggressive_combine_to_fma_fsub_0_f64: 301*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[X:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 302*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[Y:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 303*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[Z:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 304*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[U:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:24{{$}} 305*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[V:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:32{{$}} 306*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[FMA0:v\[[0-9]+:[0-9]+\]]], [[U]], [[V]], -[[Z]] 307*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[X]], [[Y]], [[FMA0]] 308*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]] 309*9880d681SAndroid Build Coastguard Workerdefine void @aggressive_combine_to_fma_fsub_0_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 310*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 311*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 312*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 313*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 314*9880d681SAndroid Build Coastguard Worker %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3 315*9880d681SAndroid Build Coastguard Worker %gep.4 = getelementptr double, double addrspace(1)* %gep.0, i32 4 316*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker %x = load volatile double, double addrspace(1)* %gep.0 319*9880d681SAndroid Build Coastguard Worker %y = load volatile double, double addrspace(1)* %gep.1 320*9880d681SAndroid Build Coastguard Worker %z = load volatile double, double addrspace(1)* %gep.2 321*9880d681SAndroid Build Coastguard Worker %u = load volatile double, double addrspace(1)* %gep.3 322*9880d681SAndroid Build Coastguard Worker %v = load volatile double, double addrspace(1)* %gep.4 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul double %u, %v 325*9880d681SAndroid Build Coastguard Worker %tmp1 = call double @llvm.fma.f64(double %x, double %y, double %tmp0) #0 326*9880d681SAndroid Build Coastguard Worker %tmp2 = fsub double %tmp1, %z 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Worker store double %tmp2, double addrspace(1)* %gep.out 329*9880d681SAndroid Build Coastguard Worker ret void 330*9880d681SAndroid Build Coastguard Worker} 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Worker; fold (fsub x, (fma y, z, (fmul u, v))) 333*9880d681SAndroid Build Coastguard Worker; -> (fma (fneg y), z, (fma (fneg u), v, x)) 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}aggressive_combine_to_fma_fsub_1_f64: 336*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[X:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 337*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[Y:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}} 338*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[Z:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:16{{$}} 339*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[U:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:24{{$}} 340*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[V:v\[[0-9]+:[0-9]+\]]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:32{{$}} 341*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[FMA0:v\[[0-9]+:[0-9]+\]]], -[[U]], [[V]], [[X]] 342*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[RESULT:v\[[0-9]+:[0-9]+\]]], -[[Y]], [[Z]], [[FMA0]] 343*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT]] 344*9880d681SAndroid Build Coastguard Workerdefine void @aggressive_combine_to_fma_fsub_1_f64(double addrspace(1)* noalias %out, double addrspace(1)* noalias %in) #1 { 345*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.amdgcn.workitem.id.x() #0 346*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid 347*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1 348*9880d681SAndroid Build Coastguard Worker %gep.2 = getelementptr double, double addrspace(1)* %gep.0, i32 2 349*9880d681SAndroid Build Coastguard Worker %gep.3 = getelementptr double, double addrspace(1)* %gep.0, i32 3 350*9880d681SAndroid Build Coastguard Worker %gep.4 = getelementptr double, double addrspace(1)* %gep.0, i32 4 351*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr double, double addrspace(1)* %out, i32 %tid 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Worker %x = load volatile double, double addrspace(1)* %gep.0 354*9880d681SAndroid Build Coastguard Worker %y = load volatile double, double addrspace(1)* %gep.1 355*9880d681SAndroid Build Coastguard Worker %z = load volatile double, double addrspace(1)* %gep.2 356*9880d681SAndroid Build Coastguard Worker %u = load volatile double, double addrspace(1)* %gep.3 357*9880d681SAndroid Build Coastguard Worker %v = load volatile double, double addrspace(1)* %gep.4 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Worker %tmp0 = fmul double %u, %v 360*9880d681SAndroid Build Coastguard Worker %tmp1 = call double @llvm.fma.f64(double %y, double %z, double %tmp0) #0 361*9880d681SAndroid Build Coastguard Worker %tmp2 = fsub double %x, %tmp1 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Worker store double %tmp2, double addrspace(1)* %gep.out 364*9880d681SAndroid Build Coastguard Worker ret void 365*9880d681SAndroid Build Coastguard Worker} 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Worker; 368*9880d681SAndroid Build Coastguard Worker; Patterns (+ fneg variants): mul(add(1.0,x),y), mul(sub(1.0,x),y), mul(sub(x,1.0),y) 369*9880d681SAndroid Build Coastguard Worker; 370*9880d681SAndroid Build Coastguard Worker 371*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_add_x_one_y: 372*9880d681SAndroid Build Coastguard Worker; SI: v_mac_f32_e32 [[VY:v[0-9]]], [[VY:v[0-9]]], [[VX:v[0-9]]] 373*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_add_x_one_y(float addrspace(1)* %out, 374*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 375*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 376*9880d681SAndroid Build Coastguard Worker %x = load volatile float, float addrspace(1)* %in1 377*9880d681SAndroid Build Coastguard Worker %y = load volatile float, float addrspace(1)* %in2 378*9880d681SAndroid Build Coastguard Worker %a = fadd float %x, 1.0 379*9880d681SAndroid Build Coastguard Worker %m = fmul float %a, %y 380*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 381*9880d681SAndroid Build Coastguard Worker ret void 382*9880d681SAndroid Build Coastguard Worker} 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_add_x_one: 385*9880d681SAndroid Build Coastguard Worker; SI: v_mac_f32_e32 [[VY:v[0-9]]], [[VY:v[0-9]]], [[VX:v[0-9]]] 386*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_add_x_one(float addrspace(1)* %out, 387*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 388*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 389*9880d681SAndroid Build Coastguard Worker %x = load volatile float, float addrspace(1)* %in1 390*9880d681SAndroid Build Coastguard Worker %y = load volatile float, float addrspace(1)* %in2 391*9880d681SAndroid Build Coastguard Worker %a = fadd float %x, 1.0 392*9880d681SAndroid Build Coastguard Worker %m = fmul float %y, %a 393*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 394*9880d681SAndroid Build Coastguard Worker ret void 395*9880d681SAndroid Build Coastguard Worker} 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_add_x_negone_y: 398*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], [[VX]], [[VY:v[0-9]]], -[[VY]] 399*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_add_x_negone_y(float addrspace(1)* %out, 400*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 401*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 402*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 403*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 404*9880d681SAndroid Build Coastguard Worker %a = fadd float %x, -1.0 405*9880d681SAndroid Build Coastguard Worker %m = fmul float %a, %y 406*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 407*9880d681SAndroid Build Coastguard Worker ret void 408*9880d681SAndroid Build Coastguard Worker} 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_add_x_negone: 411*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], [[VX]], [[VY:v[0-9]]], -[[VY]] 412*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_add_x_negone(float addrspace(1)* %out, 413*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 414*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 415*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 416*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 417*9880d681SAndroid Build Coastguard Worker %a = fadd float %x, -1.0 418*9880d681SAndroid Build Coastguard Worker %m = fmul float %y, %a 419*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 420*9880d681SAndroid Build Coastguard Worker ret void 421*9880d681SAndroid Build Coastguard Worker} 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_sub_one_x_y: 424*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], -[[VX]], [[VY:v[0-9]]], [[VY]] 425*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_sub_one_x_y(float addrspace(1)* %out, 426*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 427*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 428*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 429*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 430*9880d681SAndroid Build Coastguard Worker %s = fsub float 1.0, %x 431*9880d681SAndroid Build Coastguard Worker %m = fmul float %s, %y 432*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 433*9880d681SAndroid Build Coastguard Worker ret void 434*9880d681SAndroid Build Coastguard Worker} 435*9880d681SAndroid Build Coastguard Worker 436*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_sub_one_x: 437*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], -[[VX]], [[VY:v[0-9]]], [[VY]] 438*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_sub_one_x(float addrspace(1)* %out, 439*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 440*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 441*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 442*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 443*9880d681SAndroid Build Coastguard Worker %s = fsub float 1.0, %x 444*9880d681SAndroid Build Coastguard Worker %m = fmul float %y, %s 445*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 446*9880d681SAndroid Build Coastguard Worker ret void 447*9880d681SAndroid Build Coastguard Worker} 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_sub_negone_x_y: 450*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], -[[VX]], [[VY:v[0-9]]], -[[VY]] 451*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_sub_negone_x_y(float addrspace(1)* %out, 452*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 453*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 454*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 455*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 456*9880d681SAndroid Build Coastguard Worker %s = fsub float -1.0, %x 457*9880d681SAndroid Build Coastguard Worker %m = fmul float %s, %y 458*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 459*9880d681SAndroid Build Coastguard Worker ret void 460*9880d681SAndroid Build Coastguard Worker} 461*9880d681SAndroid Build Coastguard Worker 462*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_sub_negone_x: 463*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], -[[VX]], [[VY:v[0-9]]], -[[VY]] 464*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_sub_negone_x(float addrspace(1)* %out, 465*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 466*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 467*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 468*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 469*9880d681SAndroid Build Coastguard Worker %s = fsub float -1.0, %x 470*9880d681SAndroid Build Coastguard Worker %m = fmul float %y, %s 471*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 472*9880d681SAndroid Build Coastguard Worker ret void 473*9880d681SAndroid Build Coastguard Worker} 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_sub_x_one_y: 476*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], [[VX]], [[VY:v[0-9]]], -[[VY]] 477*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_sub_x_one_y(float addrspace(1)* %out, 478*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 479*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 480*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 481*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 482*9880d681SAndroid Build Coastguard Worker %s = fsub float %x, 1.0 483*9880d681SAndroid Build Coastguard Worker %m = fmul float %s, %y 484*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 485*9880d681SAndroid Build Coastguard Worker ret void 486*9880d681SAndroid Build Coastguard Worker} 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_sub_x_one: 489*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VX:v[0-9]]], [[VX]], [[VY:v[0-9]]], -[[VY]] 490*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_sub_x_one(float addrspace(1)* %out, 491*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 492*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 493*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 494*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 495*9880d681SAndroid Build Coastguard Worker %s = fsub float %x, 1.0 496*9880d681SAndroid Build Coastguard Worker %m = fmul float %y, %s 497*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 498*9880d681SAndroid Build Coastguard Worker ret void 499*9880d681SAndroid Build Coastguard Worker} 500*9880d681SAndroid Build Coastguard Worker 501*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_sub_x_negone_y: 502*9880d681SAndroid Build Coastguard Worker; SI: v_mac_f32_e32 [[VY:v[0-9]]], [[VY]], [[VX:v[0-9]]] 503*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_sub_x_negone_y(float addrspace(1)* %out, 504*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 505*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 506*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 507*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 508*9880d681SAndroid Build Coastguard Worker %s = fsub float %x, -1.0 509*9880d681SAndroid Build Coastguard Worker %m = fmul float %s, %y 510*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 511*9880d681SAndroid Build Coastguard Worker ret void 512*9880d681SAndroid Build Coastguard Worker} 513*9880d681SAndroid Build Coastguard Worker 514*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_mul_y_sub_x_negone: 515*9880d681SAndroid Build Coastguard Worker; SI: v_mac_f32_e32 [[VY:v[0-9]]], [[VY]], [[VX:v[0-9]]] 516*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_mul_y_sub_x_negone(float addrspace(1)* %out, 517*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 518*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2) { 519*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 520*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 521*9880d681SAndroid Build Coastguard Worker %s = fsub float %x, -1.0 522*9880d681SAndroid Build Coastguard Worker %m = fmul float %y, %s 523*9880d681SAndroid Build Coastguard Worker store float %m, float addrspace(1)* %out 524*9880d681SAndroid Build Coastguard Worker ret void 525*9880d681SAndroid Build Coastguard Worker} 526*9880d681SAndroid Build Coastguard Worker 527*9880d681SAndroid Build Coastguard Worker; 528*9880d681SAndroid Build Coastguard Worker; Interpolation Patterns: add(mul(x,t),mul(sub(1.0,t),y)) 529*9880d681SAndroid Build Coastguard Worker; 530*9880d681SAndroid Build Coastguard Worker 531*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f32_interp: 532*9880d681SAndroid Build Coastguard Worker; SI: v_mad_f32 [[VR:v[0-9]]], -[[VT:v[0-9]]], [[VY:v[0-9]]], [[VY]] 533*9880d681SAndroid Build Coastguard Worker; SI: v_mac_f32_e32 [[VR]], [[VT]], [[VX:v[0-9]]] 534*9880d681SAndroid Build Coastguard Workerdefine void @test_f32_interp(float addrspace(1)* %out, 535*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in1, 536*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2, 537*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in3) { 538*9880d681SAndroid Build Coastguard Worker %x = load float, float addrspace(1)* %in1 539*9880d681SAndroid Build Coastguard Worker %y = load float, float addrspace(1)* %in2 540*9880d681SAndroid Build Coastguard Worker %t = load float, float addrspace(1)* %in3 541*9880d681SAndroid Build Coastguard Worker %t1 = fsub float 1.0, %t 542*9880d681SAndroid Build Coastguard Worker %tx = fmul float %x, %t 543*9880d681SAndroid Build Coastguard Worker %ty = fmul float %y, %t1 544*9880d681SAndroid Build Coastguard Worker %r = fadd float %tx, %ty 545*9880d681SAndroid Build Coastguard Worker store float %r, float addrspace(1)* %out 546*9880d681SAndroid Build Coastguard Worker ret void 547*9880d681SAndroid Build Coastguard Worker} 548*9880d681SAndroid Build Coastguard Worker 549*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_f64_interp: 550*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[VR:v\[[0-9]+:[0-9]+\]]], -[[VT:v\[[0-9]+:[0-9]+\]]], [[VY:v\[[0-9]+:[0-9]+\]]], [[VY]] 551*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f64 [[VR:v\[[0-9]+:[0-9]+\]]], [[VX:v\[[0-9]+:[0-9]+\]]], [[VT]], [[VR]] 552*9880d681SAndroid Build Coastguard Workerdefine void @test_f64_interp(double addrspace(1)* %out, 553*9880d681SAndroid Build Coastguard Worker double addrspace(1)* %in1, 554*9880d681SAndroid Build Coastguard Worker double addrspace(1)* %in2, 555*9880d681SAndroid Build Coastguard Worker double addrspace(1)* %in3) { 556*9880d681SAndroid Build Coastguard Worker %x = load double, double addrspace(1)* %in1 557*9880d681SAndroid Build Coastguard Worker %y = load double, double addrspace(1)* %in2 558*9880d681SAndroid Build Coastguard Worker %t = load double, double addrspace(1)* %in3 559*9880d681SAndroid Build Coastguard Worker %t1 = fsub double 1.0, %t 560*9880d681SAndroid Build Coastguard Worker %tx = fmul double %x, %t 561*9880d681SAndroid Build Coastguard Worker %ty = fmul double %y, %t1 562*9880d681SAndroid Build Coastguard Worker %r = fadd double %tx, %ty 563*9880d681SAndroid Build Coastguard Worker store double %r, double addrspace(1)* %out 564*9880d681SAndroid Build Coastguard Worker ret void 565*9880d681SAndroid Build Coastguard Worker} 566*9880d681SAndroid Build Coastguard Worker 567*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 568*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind } 569