forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[SimplifyLibCalls] refactor pow(x, n) expansion where n is a constant…
… integer value Since the backend's codegen is capable to expand powi into fmul's, it is not needed anymore to do so in the ::optimizePow() function of SimplifyLibCalls.cpp. What is sufficient is to always turn pow(x, n) into powi(x, n) for the cases where n is a constant integer value. Dropping the current expansion code allowed relaxation of the folding conditions and now this can also happen at optimization levels below Ofast. The added CodeGen/AArch64/powi.ll test case ensures that powi is actually expanded into fmul's, confirming that this refactor did not cause any performance degradation. Following an idea proposed by David Sherwood <david.sherwood@arm.com>. Differential Revision: https://reviews.llvm.org/D128591
- Loading branch information
1 parent
976de71
commit b17754b
Showing
5 changed files
with
182 additions
and
215 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s | ||
|
||
declare double @llvm.powi.f64.i32(double, i32) | ||
declare float @llvm.powi.f32.i32(float, i32) | ||
declare float @pow(double noundef, double noundef) | ||
|
||
define float @powi_f32(float %x) nounwind { | ||
; CHECK-LABEL: powi_f32: | ||
; CHECK: // %bb.0: | ||
; CHECK-NEXT: fmul s0, s0, s0 | ||
; CHECK-NEXT: fmul s0, s0, s0 | ||
; CHECK-NEXT: ret | ||
%1 = tail call float @llvm.powi.f32.i32(float %x, i32 4) | ||
ret float %1 | ||
} | ||
|
||
define double @powi_f64(double %x) nounwind { | ||
; CHECK-LABEL: powi_f64: | ||
; CHECK: // %bb.0: | ||
; CHECK-NEXT: fmul d1, d0, d0 | ||
; CHECK-NEXT: fmul d0, d0, d1 | ||
; CHECK-NEXT: ret | ||
%1 = tail call double @llvm.powi.f64.i32(double %x, i32 3) | ||
ret double %1 | ||
} |
Oops, something went wrong.