From: Vyacheslav Klochkov Date: Tue, 22 Nov 2016 20:52:53 +0000 (+0000) Subject: Fixed the lost FastMathFlags in GVN(Global Value Numbering). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f907632b3599060dd4ace8dc2f6554aa4078a862;p=llvm Fixed the lost FastMathFlags in GVN(Global Value Numbering). Reviewer: Hal Finkel. Differential Revision: https://reviews.llvm.org/D26952 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287700 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index b6591531265..d5234c0f7e3 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -1731,7 +1731,12 @@ static void patchReplacementInstruction(Instruction *I, Value *Repl) { // Patch the replacement so that it is not more restrictive than the value // being replaced. - ReplInst->andIRFlags(I); + // Note that if 'I' is a load being replaced by some operation, + // for example, by an arithmetic operation, then andIRFlags() + // would just erase all math flags from the original arithmetic + // operation, which is clearly not wanted and not needed. + if (!isa(I)) + ReplInst->andIRFlags(I); // FIXME: If both the original and replacement value are part of the // same control-flow region (meaning that the execution of one diff --git a/test/Transforms/GVN/propagate-ir-flags.ll b/test/Transforms/GVN/propagate-ir-flags.ll new file mode 100644 index 00000000000..07367a2ec51 --- /dev/null +++ b/test/Transforms/GVN/propagate-ir-flags.ll @@ -0,0 +1,29 @@ + +; RUN: opt < %s -gvn -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 +} +