pengfei created this revision. pengfei added reviewers: RKSimon, arsenm. Herald added a project: All. pengfei requested review of this revision. Herald added subscribers: cfe-commits, wdng. Herald added a project: clang.
@arsenm raised a good question that we should use a flag guard. But I found it is not a problem as long as user uses intrinsics only: https://godbolt.org/z/WoYsqqjh3 Anyway, it is still nice to have. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D140467 Files: clang/lib/CodeGen/CGBuiltin.cpp Index: clang/lib/CodeGen/CGBuiltin.cpp =================================================================== --- clang/lib/CodeGen/CGBuiltin.cpp +++ clang/lib/CodeGen/CGBuiltin.cpp @@ -14737,8 +14737,11 @@ case X86::BI__builtin_ia32_reduce_fadd_ph128: { Function *F = CGM.getIntrinsic(Intrinsic::vector_reduce_fadd, Ops[1]->getType()); + FastMathFlags FMF = Builder.getFastMathFlags(); Builder.getFastMathFlags().setAllowReassoc(); - return Builder.CreateCall(F, {Ops[0], Ops[1]}); + Value *FAdd = Builder.CreateCall(F, {Ops[0], Ops[1]}); + Builder.getFastMathFlags() &= (FMF); + return FAdd; } case X86::BI__builtin_ia32_reduce_fmul_pd512: case X86::BI__builtin_ia32_reduce_fmul_ps512: @@ -14747,8 +14750,11 @@ case X86::BI__builtin_ia32_reduce_fmul_ph128: { Function *F = CGM.getIntrinsic(Intrinsic::vector_reduce_fmul, Ops[1]->getType()); + FastMathFlags FMF = Builder.getFastMathFlags(); Builder.getFastMathFlags().setAllowReassoc(); - return Builder.CreateCall(F, {Ops[0], Ops[1]}); + Value *FMul = Builder.CreateCall(F, {Ops[0], Ops[1]}); + Builder.getFastMathFlags() &= (FMF); + return FMul; } case X86::BI__builtin_ia32_reduce_fmax_pd512: case X86::BI__builtin_ia32_reduce_fmax_ps512: @@ -14757,8 +14763,11 @@ case X86::BI__builtin_ia32_reduce_fmax_ph128: { Function *F = CGM.getIntrinsic(Intrinsic::vector_reduce_fmax, Ops[0]->getType()); + FastMathFlags FMF = Builder.getFastMathFlags(); Builder.getFastMathFlags().setNoNaNs(); - return Builder.CreateCall(F, {Ops[0]}); + Value *FMax = Builder.CreateCall(F, {Ops[0]}); + Builder.getFastMathFlags() &= (FMF); + return FMax; } case X86::BI__builtin_ia32_reduce_fmin_pd512: case X86::BI__builtin_ia32_reduce_fmin_ps512: @@ -14767,8 +14776,11 @@ case X86::BI__builtin_ia32_reduce_fmin_ph128: { Function *F = CGM.getIntrinsic(Intrinsic::vector_reduce_fmin, Ops[0]->getType()); + FastMathFlags FMF = Builder.getFastMathFlags(); Builder.getFastMathFlags().setNoNaNs(); - return Builder.CreateCall(F, {Ops[0]}); + Value *FMin = Builder.CreateCall(F, {Ops[0]}); + Builder.getFastMathFlags() &= (FMF); + return FMin; } // 3DNow!
Index: clang/lib/CodeGen/CGBuiltin.cpp =================================================================== --- clang/lib/CodeGen/CGBuiltin.cpp +++ clang/lib/CodeGen/CGBuiltin.cpp @@ -14737,8 +14737,11 @@ case X86::BI__builtin_ia32_reduce_fadd_ph128: { Function *F = CGM.getIntrinsic(Intrinsic::vector_reduce_fadd, Ops[1]->getType()); + FastMathFlags FMF = Builder.getFastMathFlags(); Builder.getFastMathFlags().setAllowReassoc(); - return Builder.CreateCall(F, {Ops[0], Ops[1]}); + Value *FAdd = Builder.CreateCall(F, {Ops[0], Ops[1]}); + Builder.getFastMathFlags() &= (FMF); + return FAdd; } case X86::BI__builtin_ia32_reduce_fmul_pd512: case X86::BI__builtin_ia32_reduce_fmul_ps512: @@ -14747,8 +14750,11 @@ case X86::BI__builtin_ia32_reduce_fmul_ph128: { Function *F = CGM.getIntrinsic(Intrinsic::vector_reduce_fmul, Ops[1]->getType()); + FastMathFlags FMF = Builder.getFastMathFlags(); Builder.getFastMathFlags().setAllowReassoc(); - return Builder.CreateCall(F, {Ops[0], Ops[1]}); + Value *FMul = Builder.CreateCall(F, {Ops[0], Ops[1]}); + Builder.getFastMathFlags() &= (FMF); + return FMul; } case X86::BI__builtin_ia32_reduce_fmax_pd512: case X86::BI__builtin_ia32_reduce_fmax_ps512: @@ -14757,8 +14763,11 @@ case X86::BI__builtin_ia32_reduce_fmax_ph128: { Function *F = CGM.getIntrinsic(Intrinsic::vector_reduce_fmax, Ops[0]->getType()); + FastMathFlags FMF = Builder.getFastMathFlags(); Builder.getFastMathFlags().setNoNaNs(); - return Builder.CreateCall(F, {Ops[0]}); + Value *FMax = Builder.CreateCall(F, {Ops[0]}); + Builder.getFastMathFlags() &= (FMF); + return FMax; } case X86::BI__builtin_ia32_reduce_fmin_pd512: case X86::BI__builtin_ia32_reduce_fmin_ps512: @@ -14767,8 +14776,11 @@ case X86::BI__builtin_ia32_reduce_fmin_ph128: { Function *F = CGM.getIntrinsic(Intrinsic::vector_reduce_fmin, Ops[0]->getType()); + FastMathFlags FMF = Builder.getFastMathFlags(); Builder.getFastMathFlags().setNoNaNs(); - return Builder.CreateCall(F, {Ops[0]}); + Value *FMin = Builder.CreateCall(F, {Ops[0]}); + Builder.getFastMathFlags() &= (FMF); + return FMin; } // 3DNow!
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits