mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
3e0a55b362
This algorithm (explained more in the source code) takes into account global redundancies by building a "pair map" to find common subexprs. The primary motivation of this is to handle situations like foo = (a * b) * c bar = (a * d) * c where we currently don't identify that "a * c" is redundant. Accordingly, it prioritizes the emission of a * c so that CSE can remove the redundant calculation later. Does not change the actual reassociation algorithm -- only the order in which the reassociated operand chain is reconstructed. Gives ~1.5% floating point math instruction count reduction on a large offline suite of graphics shaders. llvm-svn: 320515
47 lines
1.3 KiB
LLVM
47 lines
1.3 KiB
LLVM
; RUN: opt -reassociate -S < %s | FileCheck %s
|
|
|
|
declare void @use(float)
|
|
|
|
define void @test1(float %x, float %y) {
|
|
; CHECK-LABEL: @test1(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float %y, %x
|
|
; CHECK-NEXT: [[TMP2:%.*]] = fmul fast float %y, %x
|
|
; CHECK-NEXT: [[TMP3:%.*]] = fsub fast float [[TMP1]], [[TMP2]]
|
|
; CHECK-NEXT: call void @use(float [[TMP1]])
|
|
; CHECK-NEXT: call void @use(float [[TMP3]])
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%1 = fmul fast float %x, %y
|
|
%2 = fmul fast float %y, %x
|
|
%3 = fsub fast float %1, %2
|
|
call void @use(float %1)
|
|
call void @use(float %3)
|
|
ret void
|
|
}
|
|
|
|
define float @test2(float %x, float %y) {
|
|
; CHECK-LABEL: @test2(
|
|
; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float %y, %x
|
|
; CHECK-NEXT: [[TMP2:%.*]] = fmul fast float %y, %x
|
|
; CHECK-NEXT: [[TMP3:%.*]] = fsub fast float [[TMP1]], [[TMP2]]
|
|
; CHECK-NEXT: ret float [[TMP3]]
|
|
;
|
|
%1 = fmul fast float %x, %y
|
|
%2 = fmul fast float %y, %x
|
|
%3 = fsub fast float %1, %2
|
|
ret float %3
|
|
}
|
|
|
|
define float @test3(float %x, float %y) {
|
|
; CHECK-LABEL: @test3(
|
|
; CHECK-NEXT: [[FACTOR:%.*]] = fmul fast float %y, %x
|
|
; CHECK-NEXT: [[REASS_MUL:%.*]] = fmul fast float [[FACTOR]], 2.000000e+00
|
|
; CHECK-NEXT: ret float [[REASS_MUL]]
|
|
;
|
|
%1 = fmul fast float %x, %y
|
|
%2 = fmul fast float %y, %x
|
|
%3 = fadd fast float %1, %2
|
|
ret float %3
|
|
}
|
|
|