Skip to content

Commit 96bb375

Browse files
authored
[flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv (#110063)
nsw is now added to do-variable increment when -fno-wrapv is enabled as GFortran seems to do. That means the option introduced by #91579 isn't necessary any more. Note that the feature of -flang-experimental-integer-overflow is enabled by default.
1 parent 3a4cceb commit 96bb375

40 files changed

+119
-676
lines changed

clang/include/clang/Driver/Options.td

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

6785-
def flang_experimental_integer_overflow : Flag<["-"], "flang-experimental-integer-overflow">,
6786-
Flags<[HelpHidden]>, Visibility<[FlangOption, FC1Option]>,
6787-
HelpText<"Add nsw flag to internal operations such as do-variable increment (experimental)">;
6788-
67896785
//===----------------------------------------------------------------------===//
67906786
// FLangOption + CoreOption + NoXarchOption
67916787
//===----------------------------------------------------------------------===//

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/Transforms/Passes.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ 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();
69+
std::unique_ptr<mlir::Pass> createCFGConversionPassWithoutNSW();
7070
std::unique_ptr<mlir::Pass> createMemDataFlowOptPass();
7171
std::unique_ptr<mlir::Pass> createPromoteToAffinePass();
7272
std::unique_ptr<mlir::Pass>
@@ -83,7 +83,7 @@ createVScaleAttrPass(std::pair<unsigned, unsigned> vscaleAttr);
8383

8484
void populateCfgConversionRewrites(mlir::RewritePatternSet &patterns,
8585
bool forceLoopToExecuteOnce = false,
86-
bool setNSW = false);
86+
bool setNSW = true);
8787

8888
// declarative passes
8989
#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
};
127127

128128
struct OffloadModuleOpts {

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,12 +1350,6 @@ bool CompilerInvocation::createFromArgs(
13501350
invoc.loweringOpts.setNoPPCNativeVecElemOrder(true);
13511351
}
13521352

1353-
// -flang-experimental-integer-overflow
1354-
if (args.hasArg(
1355-
clang::driver::options::OPT_flang_experimental_integer_overflow)) {
1356-
invoc.loweringOpts.setNSWOnLoopVarInc(true);
1357-
}
1358-
13591353
// Preserve all the remark options requested, i.e. -Rpass, -Rpass-missed or
13601354
// -Rpass-analysis. This will be used later when processing and outputting the
13611355
// 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
@@ -828,8 +828,8 @@ void CodeGenAction::generateLLVMIR() {
828828
config.VScaleMax = vsr->second;
829829
}
830830

831-
if (ci.getInvocation().getLoweringOpts().getNSWOnLoopVarInc())
832-
config.NSWOnLoopVarInc = true;
831+
if (ci.getInvocation().getLoweringOpts().getIntegerWrapAround())
832+
config.NSWOnLoopVarInc = false;
833833

834834
// Create the pass pipeline
835835
fir::createMLIRToLLVMPassPipeline(pm, config, getCurrentFile());

flang/lib/Lower/Bridge.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2271,7 +2271,7 @@ class FirConverter : public Fortran::lower::AbstractConverter {
22712271
assert(!incrementLoopNestInfo.empty() && "empty loop nest");
22722272
mlir::Location loc = toLocation();
22732273
mlir::arith::IntegerOverflowFlags flags{};
2274-
if (getLoweringOptions().getNSWOnLoopVarInc())
2274+
if (!getLoweringOptions().getIntegerWrapAround())
22752275
flags = bitEnumSet(flags, mlir::arith::IntegerOverflowFlags::nsw);
22762276
auto iofAttr = mlir::arith::IntegerOverflowFlagsAttr::get(
22772277
builder->getContext(), flags);

flang/lib/Lower/IO.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,7 @@ static void genIoLoop(Fortran::lower::AbstractConverter &converter,
929929
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
930930
mlir::Location loc = converter.getCurrentLocation();
931931
mlir::arith::IntegerOverflowFlags flags{};
932-
if (converter.getLoweringOptions().getNSWOnLoopVarInc())
932+
if (!converter.getLoweringOptions().getIntegerWrapAround())
933933
flags = bitEnumSet(flags, mlir::arith::IntegerOverflowFlags::nsw);
934934
auto iofAttr =
935935
mlir::arith::IntegerOverflowFlagsAttr::get(builder.getContext(), flags);

flang/lib/Optimizer/Passes/Pipelines.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm) {
3535
void addCfgConversionPass(mlir::PassManager &pm,
3636
const MLIRToLLVMPassPipelineConfig &config) {
3737
if (config.NSWOnLoopVarInc)
38-
addNestedPassToAllTopLevelOperationsConditionally(
39-
pm, disableCfgConversion, fir::createCFGConversionPassWithNSW);
40-
else
4138
addNestedPassToAllTopLevelOperationsConditionally(pm, disableCfgConversion,
4239
fir::createCFGConversion);
40+
else
41+
addNestedPassToAllTopLevelOperationsConditionally(
42+
pm, disableCfgConversion, fir::createCFGConversionPassWithoutNSW);
4343
}
4444

4545
void addAVC(mlir::PassManager &pm, const llvm::OptimizationLevel &optLevel) {

flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,6 @@ class CfgConversion : public fir::impl::CFGConversionBase<CfgConversion> {
332332
public:
333333
using CFGConversionBase<CfgConversion>::CFGConversionBase;
334334

335-
CfgConversion(bool setNSW) { this->setNSW = setNSW; }
336-
337335
void runOnOperation() override {
338336
auto *context = &this->getContext();
339337
mlir::RewritePatternSet patterns(context);
@@ -366,6 +364,8 @@ void fir::populateCfgConversionRewrites(mlir::RewritePatternSet &patterns,
366364
patterns.getContext(), forceLoopToExecuteOnce, setNSW);
367365
}
368366

369-
std::unique_ptr<mlir::Pass> fir::createCFGConversionPassWithNSW() {
370-
return std::make_unique<CfgConversion>(true);
367+
std::unique_ptr<mlir::Pass> fir::createCFGConversionPassWithoutNSW() {
368+
fir::CFGConversionOptions options;
369+
options.setNSW = false;
370+
return fir::createCFGConversion(options);
371371
}

flang/test/Driver/frontend-forwarding.f90

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
! RUN: -fversion-loops-for-stride \
2121
! RUN: -flang-experimental-hlfir \
2222
! RUN: -flang-deprecated-no-hlfir \
23-
! RUN: -flang-experimental-integer-overflow \
2423
! RUN: -fno-ppc-native-vector-element-order \
2524
! RUN: -fppc-native-vector-element-order \
2625
! RUN: -mllvm -print-before-all \
@@ -52,7 +51,6 @@
5251
! CHECK: "-fversion-loops-for-stride"
5352
! CHECK: "-flang-experimental-hlfir"
5453
! CHECK: "-flang-deprecated-no-hlfir"
55-
! CHECK: "-flang-experimental-integer-overflow"
5654
! CHECK: "-fno-ppc-native-vector-element-order"
5755
! CHECK: "-fppc-native-vector-element-order"
5856
! CHECK: "-Rpass"

flang/test/Fir/convert-to-llvm-openmp-and-fir.fir

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -358,10 +358,10 @@ func.func @_QPopenmp_target_data_region() {
358358
%9 = arith.subi %8, %c1_i64 : i64
359359
%10 = fir.coordinate_of %0, %9 : (!fir.ref<!fir.array<1024xi32>>, i64) -> !fir.ref<i32>
360360
fir.store %6 to %10 : !fir.ref<i32>
361-
%11 = arith.addi %arg0, %c1 : index
361+
%11 = arith.addi %arg0, %c1 overflow<nsw> : index
362362
%12 = fir.convert %c1 : (index) -> i32
363363
%13 = fir.load %1 : !fir.ref<i32>
364-
%14 = arith.addi %13, %12 : i32
364+
%14 = arith.addi %13, %12 overflow<nsw> : i32
365365
fir.result %11, %14 : index, i32
366366
}
367367
fir.store %5#1 to %1 : !fir.ref<i32>
@@ -404,11 +404,11 @@ func.func @_QPopenmp_target_data_region() {
404404
// CHECK: %[[VAL_21:.*]] = llvm.sub %[[VAL_19]], %[[VAL_20]] : i64
405405
// CHECK: %[[VAL_22:.*]] = llvm.getelementptr %[[VAL_1]][0, %[[VAL_21]]] : (!llvm.ptr, i64) -> !llvm.ptr
406406
// CHECK: llvm.store %[[VAL_17]], %[[VAL_22]] : i32, !llvm.ptr
407-
// CHECK: %[[VAL_23:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] : i64
407+
// CHECK: %[[VAL_23:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] overflow<nsw> : i64
408408
// CHECK: %[[VAL_24:.*]] = llvm.trunc %[[VAL_8]] : i64 to i32
409409
// CHECK: %[[VAL_25:.*]] = llvm.load %[[VAL_3]] : !llvm.ptr -> i32
410-
// CHECK: %[[VAL_26:.*]] = llvm.add %[[VAL_25]], %[[VAL_24]] : i32
411-
// CHECK: %[[VAL_27:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] : i64
410+
// CHECK: %[[VAL_26:.*]] = llvm.add %[[VAL_25]], %[[VAL_24]] overflow<nsw> : i32
411+
// CHECK: %[[VAL_27:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] overflow<nsw> : i64
412412
// CHECK: %[[VAL_28:.*]] = llvm.mlir.constant(1 : index) : i64
413413
// CHECK: %[[VAL_29:.*]] = llvm.sub %[[VAL_14]], %[[VAL_28]] : i64
414414
// CHECK: llvm.br ^bb1(%[[VAL_27]], %[[VAL_26]], %[[VAL_29]] : i64, i32, i64)

0 commit comments

Comments
 (0)