mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
99591fa12d
Summary: This rewrites store expression/leader handling. We no longer use the value operand as the leader, instead, we store it separately. We also now store the stored value as part of the expression, and compare it when comparing stores for equality. This enables us to get rid of a bunch of our previous hacks and machinations, as the existing machinery takes care of everything *except* updating the stored value on classes. The only time we have to update it is if the storecount goes to 0, and when we do, we destroy it. Since we no longer use the value operand as the leader, during elimination, we have to use the value operand. Doing this also fixes a bunch of store forwarding cases we were missing. Any value operand we use is guaranteed to either be updated by previous eliminations, or minimized by future ones. (IE the fact that we don't use the most dominating value operand when it's not a constant does not affect anything). Sadly, this change also exposes that we didn't pay attention to the output of the pr31594.ll test, as it also very clearly exposes the same store leader bug we are fixing here. (I added pr31682.ll anyway, but maybe we think that's too large to be useful) On the plus side, propagate-ir-flags.ll now passes due to the corrected store forwarding. This change was 3 stage'd on darwin and linux, with the full test-suite. Reviewers: davide Subscribers: llvm-commits llvm-svn: 292648
29 lines
757 B
LLVM
29 lines
757 B
LLVM
; RUN: opt < %s -newgvn -S | FileCheck %s
|
|
|
|
; CHECK-LABEL: func_fast
|
|
; CHECK: fadd fast double
|
|
; CHECK-NEXT: store
|
|
; CHECK-NEXT: ret
|
|
define double @func_fast(double %a, double %b) {
|
|
entry:
|
|
%a.addr = alloca double, align 8
|
|
%add = fadd fast double %b, 3.000000e+00
|
|
store double %add, double* %a.addr, align 8
|
|
%load_add = load double, double* %a.addr, align 8
|
|
ret double %load_add
|
|
}
|
|
|
|
; CHECK-LABEL: func_no_fast
|
|
; CHECK: fadd double
|
|
; CHECK-NEXT: store
|
|
; CHECK-NEXT: ret
|
|
define double @func_no_fast(double %a, double %b) {
|
|
entry:
|
|
%a.addr = alloca double, align 8
|
|
%add = fadd fast double %b, 3.000000e+00
|
|
store double %add, double* %a.addr, align 8
|
|
%duplicated_add = fadd double %b, 3.000000e+00
|
|
ret double %duplicated_add
|
|
}
|
|
|