Skip to content

Commit a88677e

Browse files
authored
Reland "[flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv" (#118933)
This relands #110063. The performance issue on 503.bwaves_r is found not to be related to the patch, and is resolved by fbd89bc when LTO is enabled.
1 parent 411196b commit a88677e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+144
-704
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6840,10 +6840,6 @@ def flang_deprecated_no_hlfir : Flag<["-"], "flang-deprecated-no-hlfir">,
68406840
Flags<[HelpHidden]>, Visibility<[FlangOption, FC1Option]>,
68416841
HelpText<"Do not use HLFIR lowering (deprecated)">;
68426842

6843-
def flang_experimental_integer_overflow : Flag<["-"], "flang-experimental-integer-overflow">,
6844-
Flags<[HelpHidden]>, Visibility<[FlangOption, FC1Option]>,
6845-
HelpText<"Add nsw flag to internal operations such as do-variable increment (experimental)">;
6846-
68476843
//===----------------------------------------------------------------------===//
68486844
// FLangOption + CoreOption + NoXarchOption
68496845
//===----------------------------------------------------------------------===//

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ void Flang::addCodegenOptions(const ArgList &Args,
148148

149149
Args.addAllArgs(CmdArgs, {options::OPT_flang_experimental_hlfir,
150150
options::OPT_flang_deprecated_no_hlfir,
151-
options::OPT_flang_experimental_integer_overflow,
152151
options::OPT_fno_ppc_native_vec_elem_order,
153152
options::OPT_fppc_native_vec_elem_order});
154153
}

flang/include/flang/Lower/LoweringOptions.def

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,5 @@ ENUM_LOWERINGOPT(Underscoring, unsigned, 1, 1)
3838
/// (i.e. wraps around as two's complement). Off by default.
3939
ENUM_LOWERINGOPT(IntegerWrapAround, unsigned, 1, 0)
4040

41-
/// If true, add nsw flags to loop variable increments.
42-
/// Off by default.
43-
/// TODO: integrate this option with the above
44-
ENUM_LOWERINGOPT(NSWOnLoopVarInc, unsigned, 1, 0)
45-
4641
#undef LOWERINGOPT
4742
#undef ENUM_LOWERINGOPT

flang/include/flang/Optimizer/Passes/Pipelines.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,16 @@ namespace fir {
3333

3434
using PassConstructor = std::unique_ptr<mlir::Pass>();
3535

36-
template <typename OP>
37-
void addNestedPassToOps(mlir::PassManager &pm, PassConstructor ctor) {
36+
template <typename F, typename OP>
37+
void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
3838
pm.addNestedPass<OP>(ctor());
3939
}
4040

41-
template <typename OP, typename... OPS,
41+
template <typename F, typename OP, typename... OPS,
4242
typename = std::enable_if_t<sizeof...(OPS) != 0>>
43-
void addNestedPassToOps(mlir::PassManager &pm, PassConstructor ctor) {
44-
addNestedPassToOps<OP>(pm, ctor);
45-
addNestedPassToOps<OPS...>(pm, ctor);
43+
void addNestedPassToOps(mlir::PassManager &pm, F ctor) {
44+
addNestedPassToOps<F, OP>(pm, ctor);
45+
addNestedPassToOps<F, OPS...>(pm, ctor);
4646
}
4747

4848
/// Generic for adding a pass to the pass manager if it is not disabled.
@@ -60,11 +60,12 @@ void addNestedPassConditionally(mlir::PassManager &pm,
6060
pm.addNestedPass<OP>(ctor());
6161
}
6262

63-
void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm,
64-
PassConstructor ctor);
63+
template <typename F>
64+
void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm, F ctor);
6565

66+
template <typename F>
6667
void addNestedPassToAllTopLevelOperationsConditionally(
67-
mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, PassConstructor ctor);
68+
mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, F ctor);
6869

6970
/// Add MLIR Canonicalizer pass with region simplification disabled.
7071
/// FIR does not support the promotion of some SSA value to block arguments (or

flang/include/flang/Optimizer/Transforms/Passes.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ namespace fir {
6666
std::unique_ptr<mlir::Pass> createAffineDemotionPass();
6767
std::unique_ptr<mlir::Pass>
6868
createArrayValueCopyPass(fir::ArrayValueCopyOptions options = {});
69-
std::unique_ptr<mlir::Pass> createCFGConversionPassWithNSW();
7069
std::unique_ptr<mlir::Pass> createMemDataFlowOptPass();
7170
std::unique_ptr<mlir::Pass> createPromoteToAffinePass();
7271
std::unique_ptr<mlir::Pass>
@@ -83,7 +82,7 @@ createVScaleAttrPass(std::pair<unsigned, unsigned> vscaleAttr);
8382

8483
void populateCfgConversionRewrites(mlir::RewritePatternSet &patterns,
8584
bool forceLoopToExecuteOnce = false,
86-
bool setNSW = false);
85+
bool setNSW = true);
8786

8887
// declarative passes
8988
#define GEN_PASS_REGISTRATION

flang/include/flang/Optimizer/Transforms/Passes.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ def CFGConversion : Pass<"cfg-conversion"> {
153153
/*default=*/"false",
154154
"force the body of a loop to execute at least once">,
155155
Option<"setNSW", "set-nsw", "bool",
156-
/*default=*/"false",
156+
/*default=*/"true",
157157
"set nsw on loop variable increment">
158158
];
159159
}

flang/include/flang/Tools/CrossToolHelpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ struct MLIRToLLVMPassPipelineConfig : public FlangEPCallBacks {
122122
bool NoSignedZerosFPMath =
123123
false; ///< Set no-signed-zeros-fp-math attribute for functions.
124124
bool UnsafeFPMath = false; ///< Set unsafe-fp-math attribute for functions.
125-
bool NSWOnLoopVarInc = false; ///< Add nsw flag to loop variable increments.
125+
bool NSWOnLoopVarInc = true; ///< Add nsw flag to loop variable increments.
126126
bool EnableOpenMP = false; ///< Enable OpenMP lowering.
127127
};
128128

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,12 +1362,6 @@ bool CompilerInvocation::createFromArgs(
13621362
invoc.loweringOpts.setNoPPCNativeVecElemOrder(true);
13631363
}
13641364

1365-
// -flang-experimental-integer-overflow
1366-
if (args.hasArg(
1367-
clang::driver::options::OPT_flang_experimental_integer_overflow)) {
1368-
invoc.loweringOpts.setNSWOnLoopVarInc(true);
1369-
}
1370-
13711365
// Preserve all the remark options requested, i.e. -Rpass, -Rpass-missed or
13721366
// -Rpass-analysis. This will be used later when processing and outputting the
13731367
// remarks generated by LLVM in ExecuteCompilerInvocation.cpp.

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -836,8 +836,8 @@ void CodeGenAction::generateLLVMIR() {
836836
Fortran::common::LanguageFeature::OpenMP))
837837
config.EnableOpenMP = true;
838838

839-
if (ci.getInvocation().getLoweringOpts().getNSWOnLoopVarInc())
840-
config.NSWOnLoopVarInc = true;
839+
if (ci.getInvocation().getLoweringOpts().getIntegerWrapAround())
840+
config.NSWOnLoopVarInc = false;
841841

842842
// Create the pass pipeline
843843
fir::createMLIRToLLVMPassPipeline(pm, config, getCurrentFile());

flang/lib/Lower/Bridge.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2330,7 +2330,7 @@ class FirConverter : public Fortran::lower::AbstractConverter {
23302330
assert(!incrementLoopNestInfo.empty() && "empty loop nest");
23312331
mlir::Location loc = toLocation();
23322332
mlir::arith::IntegerOverflowFlags flags{};
2333-
if (getLoweringOptions().getNSWOnLoopVarInc())
2333+
if (!getLoweringOptions().getIntegerWrapAround())
23342334
flags = bitEnumSet(flags, mlir::arith::IntegerOverflowFlags::nsw);
23352335
auto iofAttr = mlir::arith::IntegerOverflowFlagsAttr::get(
23362336
builder->getContext(), flags);

0 commit comments

Comments
 (0)