164 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -verify-machineinstrs -mcpu=pwr9 -mtriple=powerpc64le-linux-gnu | FileCheck %s3 4; Verify that the fold of a*b-c*d respect the uses of a*b5define double @fsub1(double %a, double %b, double %c, double %d) {6; CHECK-LABEL: fsub1:7; CHECK: # %bb.0: # %entry8; CHECK-NEXT: xsmuldp 0, 2, 19; CHECK-NEXT: fmr 1, 010; CHECK-NEXT: xsnmsubadp 1, 4, 311; CHECK-NEXT: xsmuldp 1, 0, 112; CHECK-NEXT: blr13entry:14 %mul = fmul contract reassoc double %b, %a15 %mul1 = fmul contract reassoc double %d, %c16 %sub = fsub contract reassoc nsz double %mul, %mul117 %mul3 = fmul contract reassoc double %mul, %sub18 ret double %mul319}20 21; Verify that the fold of a*b-c*d respect the uses of c*d22define double @fsub2(double %a, double %b, double %c, double %d) {23; CHECK-LABEL: fsub2:24; CHECK: # %bb.0: # %entry25; CHECK-NEXT: xsmuldp 0, 4, 326; CHECK-NEXT: fmr 3, 027; CHECK-NEXT: xsmsubadp 3, 2, 128; CHECK-NEXT: xsmuldp 1, 0, 329; CHECK-NEXT: blr30entry:31 %mul = fmul contract reassoc double %b, %a32 %mul1 = fmul contract reassoc double %d, %c33 %sub = fsub contract reassoc double %mul, %mul134 %mul3 = fmul contract reassoc double %mul1, %sub35 ret double %mul336}37 38; Verify that the fold of a*b-c*d if there is no uses of a*b and c*d39define double @fsub3(double %a, double %b, double %c, double %d) {40; CHECK-LABEL: fsub3:41; CHECK: # %bb.0: # %entry42; CHECK-NEXT: xsmuldp 0, 4, 343; CHECK-NEXT: xsmsubadp 0, 2, 144; CHECK-NEXT: fmr 1, 045; CHECK-NEXT: blr46entry:47 %mul = fmul contract reassoc double %b, %a48 %mul1 = fmul contract reassoc double %d, %c49 %sub = fsub contract reassoc double %mul, %mul150 ret double %sub51}52 53; Verify that the fold of a*b+c*d respect the uses of a*b54define double @fadd1(double %a, double %b, double %c, double %d) {55; CHECK-LABEL: fadd1:56; CHECK: # %bb.0: # %entry57; CHECK-NEXT: xsmuldp 0, 2, 158; CHECK-NEXT: fmr 1, 059; CHECK-NEXT: xsmaddadp 1, 4, 360; CHECK-NEXT: xsmuldp 1, 0, 161; CHECK-NEXT: blr62entry:63 %mul = fmul contract reassoc double %b, %a64 %mul1 = fmul contract reassoc double %d, %c65 %add = fadd contract reassoc double %mul1, %mul66 %mul3 = fmul contract reassoc double %mul, %add67 ret double %mul368}69 70; Verify that the fold of a*b+c*d respect the uses of c*d71define double @fadd2(double %a, double %b, double %c, double %d) {72; CHECK-LABEL: fadd2:73; CHECK: # %bb.0: # %entry74; CHECK-NEXT: xsmuldp 0, 4, 375; CHECK-NEXT: fmr 3, 076; CHECK-NEXT: xsmaddadp 3, 2, 177; CHECK-NEXT: xsmuldp 1, 0, 378; CHECK-NEXT: blr79entry:80 %mul = fmul contract reassoc double %b, %a81 %mul1 = fmul contract reassoc double %d, %c82 %add = fadd contract reassoc double %mul1, %mul83 %mul3 = fmul contract reassoc double %mul1, %add84 ret double %mul385}86 87; Verify that the fold of a*b+c*d if there is no uses of a*b and c*d88define double @fadd3(double %a, double %b, double %c, double %d) {89; CHECK-LABEL: fadd3:90; CHECK: # %bb.0: # %entry91; CHECK-NEXT: xsmuldp 1, 2, 192; CHECK-NEXT: xsmaddadp 1, 4, 393; CHECK-NEXT: blr94entry:95 %mul = fmul contract reassoc double %b, %a96 %mul1 = fmul contract reassoc double %d, %c97 %add = fadd contract reassoc double %mul1, %mul98 ret double %add99}100 101define double @fma_multi_uses1(double %a, double %b, double %c, double %d, ptr %p1, ptr %p2, ptr %p3) {102; CHECK-LABEL: fma_multi_uses1:103; CHECK: # %bb.0:104; CHECK-NEXT: xsmuldp 1, 1, 2105; CHECK-NEXT: xsmuldp 0, 3, 4106; CHECK-NEXT: stfd 1, 0(7)107; CHECK-NEXT: stfd 1, 0(8)108; CHECK-NEXT: xsnmsubadp 1, 3, 4109; CHECK-NEXT: stfd 0, 0(9)110; CHECK-NEXT: blr111 %ab = fmul contract reassoc double %a, %b112 %cd = fmul contract reassoc double %c, %d113 store double %ab, ptr %p1 ; extra use of %ab114 store double %ab, ptr %p2 ; another extra use of %ab115 store double %cd, ptr %p3 ; extra use of %cd116 %r = fsub contract reassoc nsz double %ab, %cd117 ret double %r118}119 120define double @fma_multi_uses2(double %a, double %b, double %c, double %d, ptr %p1, ptr %p2, ptr %p3) {121; CHECK-LABEL: fma_multi_uses2:122; CHECK: # %bb.0:123; CHECK-NEXT: xsmuldp 5, 1, 2124; CHECK-NEXT: xsmuldp 0, 3, 4125; CHECK-NEXT: stfd 5, 0(7)126; CHECK-NEXT: stfd 0, 0(8)127; CHECK-NEXT: stfd 0, 0(9)128; CHECK-NEXT: xsmsubadp 0, 1, 2129; CHECK-NEXT: fmr 1, 0130; CHECK-NEXT: blr131 %ab = fmul contract reassoc double %a, %b132 %cd = fmul contract reassoc double %c, %d133 store double %ab, ptr %p1 ; extra use of %ab134 store double %cd, ptr %p2 ; extra use of %cd135 store double %cd, ptr %p3 ; another extra use of %cd136 %r = fsub contract reassoc double %ab, %cd137 ret double %r138}139 140define double @fma_multi_uses3(double %a, double %b, double %c, double %d, double %f, double %g, ptr %p1, ptr %p2, ptr %p3) {141; CHECK-LABEL: fma_multi_uses3:142; CHECK: # %bb.0:143; CHECK-NEXT: xsmuldp 0, 1, 2144; CHECK-NEXT: xsmuldp 1, 5, 6145; CHECK-NEXT: ld 3, 96(1)146; CHECK-NEXT: stfd 0, 0(9)147; CHECK-NEXT: stfd 0, 0(10)148; CHECK-NEXT: stfd 1, 0(3)149; CHECK-NEXT: xsnmsubadp 1, 3, 4150; CHECK-NEXT: xsnmsubadp 0, 3, 4151; CHECK-NEXT: xsadddp 1, 0, 1152; CHECK-NEXT: blr153 %ab = fmul contract reassoc double %a, %b154 %cd = fmul contract reassoc double %c, %d155 %fg = fmul contract reassoc double %f, %g156 store double %ab, ptr %p1 ; extra use of %ab157 store double %ab, ptr %p2 ; another extra use of %ab158 store double %fg, ptr %p3 ; extra use of %fg159 %q = fsub contract reassoc nsz double %fg, %cd ; The uses of %cd reduce to 1 after %r is folded. 2 uses of %fg, fold %cd, remove def of %cd160 %r = fsub contract reassoc nsz double %ab, %cd ; Fold %r before %q. 3 uses of %ab, 2 uses of %cd, fold %cd161 %add = fadd contract reassoc double %r, %q162 ret double %add163}164