Skip to content

Commit 2631531

Browse files
committed
[InstCombine] Removing the combine of fmuladd with fast flag
We should treat fmuladd like an fma intrinsic, and any regressions need to be addressed by dealing with fma/fmuladd in other contexts.
1 parent 6246b49 commit 2631531

File tree

2 files changed

+5
-19
lines changed

2 files changed

+5
-19
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2424,17 +2424,6 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
24242424
break;
24252425
}
24262426
case Intrinsic::fmuladd: {
2427-
// Canonicalize fast fmuladd to the separate fmul + fadd.
2428-
if (II->isFast()) {
2429-
BuilderTy::FastMathFlagGuard Guard(Builder);
2430-
Builder.setFastMathFlags(II->getFastMathFlags());
2431-
Value *Mul = Builder.CreateFMul(II->getArgOperand(0),
2432-
II->getArgOperand(1));
2433-
Value *Add = Builder.CreateFAdd(Mul, II->getArgOperand(2));
2434-
Add->takeName(II);
2435-
return replaceInstUsesWith(*II, Add);
2436-
}
2437-
24382427
// Try to simplify the underlying FMul.
24392428
if (Value *V = simplifyFMulInst(II->getArgOperand(0), II->getArgOperand(1),
24402429
II->getFastMathFlags(),

llvm/test/Transforms/InstCombine/fma.ll

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,7 @@ define float @fmuladd_unary_fneg_x_unary_fneg_y(float %x, float %y, float %z) {
194194

195195
define float @fmuladd_fneg_x_fneg_y_fast(float %x, float %y, float %z) {
196196
; CHECK-LABEL: @fmuladd_fneg_x_fneg_y_fast(
197-
; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]]
198-
; CHECK-NEXT: [[FMULADD:%.*]] = fadd fast float [[TMP1]], [[Z:%.*]]
197+
; CHECK-NEXT: [[FMULADD:%.*]] = call fast float @llvm.fmuladd.f32(float [[X:%.*]], float [[Y:%.*]], float [[Z:%.*]])
199198
; CHECK-NEXT: ret float [[FMULADD]]
200199
;
201200
%x.fneg = fsub float -0.0, %x
@@ -206,8 +205,7 @@ define float @fmuladd_fneg_x_fneg_y_fast(float %x, float %y, float %z) {
206205

207206
define float @fmuladd_unary_fneg_x_unary_fneg_y_fast(float %x, float %y, float %z) {
208207
; CHECK-LABEL: @fmuladd_unary_fneg_x_unary_fneg_y_fast(
209-
; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]]
210-
; CHECK-NEXT: [[FMULADD:%.*]] = fadd fast float [[TMP1]], [[Z:%.*]]
208+
; CHECK-NEXT: [[FMULADD:%.*]] = call fast float @llvm.fmuladd.f32(float [[X:%.*]], float [[Y:%.*]], float [[Z:%.*]])
211209
; CHECK-NEXT: ret float [[FMULADD]]
212210
;
213211
%x.fneg = fneg float %x
@@ -285,8 +283,7 @@ define float @fmuladd_fabs_x_fabs_x(float %x, float %z) {
285283

286284
define float @fmuladd_fabs_x_fabs_x_fast(float %x, float %z) {
287285
; CHECK-LABEL: @fmuladd_fabs_x_fabs_x_fast(
288-
; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float [[X:%.*]], [[X]]
289-
; CHECK-NEXT: [[FMULADD:%.*]] = fadd fast float [[TMP1]], [[Z:%.*]]
286+
; CHECK-NEXT: [[FMULADD:%.*]] = call fast float @llvm.fmuladd.f32(float [[X:%.*]], float [[X]], float [[Z:%.*]])
290287
; CHECK-NEXT: ret float [[FMULADD]]
291288
;
292289
%x.fabs = call float @llvm.fabs.f32(float %x)
@@ -312,10 +309,10 @@ define float @fma_k_y_z_fast(float %y, float %z) {
312309
ret float %fma
313310
}
314311

312+
; Treat fmuladd like an fma intrinsic
315313
define float @fmuladd_k_y_z_fast(float %y, float %z) {
316314
; CHECK-LABEL: @fmuladd_k_y_z_fast(
317-
; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float [[Y:%.*]], 4.000000e+00
318-
; CHECK-NEXT: [[FMULADD:%.*]] = fadd fast float [[TMP1]], [[Z:%.*]]
315+
; CHECK-NEXT: [[FMULADD:%.*]] = call fast float @llvm.fmuladd.f32(float [[Y:%.*]], float 4.000000e+00, float [[Z:%.*]])
319316
; CHECK-NEXT: ret float [[FMULADD]]
320317
;
321318
%fmuladd = call fast float @llvm.fmuladd.f32(float 4.0, float %y, float %z)

0 commit comments

Comments
 (0)