llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-flang-fir-hlfir Author: Yusuke MINATO (yus3710-fj) <details> <summary>Changes</summary> This relands #<!-- -->110063. The performance issue on 503.bwaves_r is found not to be related to the patch, and is resolved by fbd89bcc when LTO is enabled. --- Patch is 107.53 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/118933.diff 41 Files Affected: - (modified) clang/include/clang/Driver/Options.td (-4) - (modified) clang/lib/Driver/ToolChains/Flang.cpp (-1) - (modified) flang/include/flang/Lower/LoweringOptions.def (-5) - (modified) flang/include/flang/Optimizer/Passes/Pipelines.h (+10-9) - (modified) flang/include/flang/Optimizer/Transforms/Passes.h (+1-2) - (modified) flang/include/flang/Optimizer/Transforms/Passes.td (+1-1) - (modified) flang/include/flang/Tools/CrossToolHelpers.h (+1-1) - (modified) flang/lib/Frontend/CompilerInvocation.cpp (-6) - (modified) flang/lib/Frontend/FrontendActions.cpp (+2-2) - (modified) flang/lib/Lower/Bridge.cpp (+1-1) - (modified) flang/lib/Lower/IO.cpp (+1-1) - (modified) flang/lib/Optimizer/Passes/Pipelines.cpp (+23-20) - (modified) flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp (-6) - (modified) flang/test/Driver/frontend-forwarding.f90 (-2) - (modified) flang/test/Fir/convert-to-llvm-openmp-and-fir.fir (+5-5) - (modified) flang/test/Fir/loop01.fir (+11-219) - (modified) flang/test/Fir/loop02.fir (+2-2) - (modified) flang/test/Lower/HLFIR/goto-do-body.f90 (+2-2) - (modified) flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 (+2-2) - (modified) flang/test/Lower/OpenMP/wsloop-reduction-allocatable-array-minmax.f90 (+2-2) - (modified) flang/test/Lower/OpenMP/wsloop-variable.f90 (+2-2) - (modified) flang/test/Lower/array-character.f90 (+1-1) - (modified) flang/test/Lower/array-derived-assignments.f90 (+1-1) - (modified) flang/test/Lower/array-derived.f90 (+1-1) - (modified) flang/test/Lower/array-elemental-calls-char-byval.f90 (+1-1) - (modified) flang/test/Lower/array-elemental-calls-char.f90 (+1-1) - (modified) flang/test/Lower/array-expression-assumed-size.f90 (+1-1) - (modified) flang/test/Lower/array-expression-slice-1.f90 (+1-1) - (modified) flang/test/Lower/array-substring.f90 (+5-41) - (modified) flang/test/Lower/array-temp.f90 (+1-1) - (modified) flang/test/Lower/components.f90 (+1-1) - (modified) flang/test/Lower/do_loop.f90 (+17-56) - (modified) flang/test/Lower/do_loop_unstructured.f90 (+11-192) - (modified) flang/test/Lower/goto-do-body.f90 (+2-2) - (modified) flang/test/Lower/host-associated.f90 (+1-1) - (modified) flang/test/Lower/infinite_loop.f90 (+5-36) - (modified) flang/test/Lower/io-implied-do-fixes.f90 (+6-43) - (modified) flang/test/Lower/loops2.f90 (+1-1) - (modified) flang/test/Lower/mixed_loops.f90 (+3-3) - (modified) flang/test/Lower/vector-subscript-io.f90 (+17-17) - (modified) flang/tools/bbc/bbc.cpp (+1-8) ``````````diff diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index a89a4e8f8ec985..3384678adf1c1c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -6836,10 +6836,6 @@ def flang_deprecated_no_hlfir : Flag<["-"], "flang-deprecated-no-hlfir">, Flags<[HelpHidden]>, Visibility<[FlangOption, FC1Option]>, HelpText<"Do not use HLFIR lowering (deprecated)">; -def flang_experimental_integer_overflow : Flag<["-"], "flang-experimental-integer-overflow">, - Flags<[HelpHidden]>, Visibility<[FlangOption, FC1Option]>, - HelpText<"Add nsw flag to internal operations such as do-variable increment (experimental)">; - //===----------------------------------------------------------------------===// // FLangOption + CoreOption + NoXarchOption //===----------------------------------------------------------------------===// diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 72c0787d7df993..892940d0b0a129 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -148,7 +148,6 @@ void Flang::addCodegenOptions(const ArgList &Args, Args.addAllArgs(CmdArgs, {options::OPT_flang_experimental_hlfir, options::OPT_flang_deprecated_no_hlfir, - options::OPT_flang_experimental_integer_overflow, options::OPT_fno_ppc_native_vec_elem_order, options::OPT_fppc_native_vec_elem_order}); } diff --git a/flang/include/flang/Lower/LoweringOptions.def b/flang/include/flang/Lower/LoweringOptions.def index 231de533fbd30a..0b22e54b648e94 100644 --- a/flang/include/flang/Lower/LoweringOptions.def +++ b/flang/include/flang/Lower/LoweringOptions.def @@ -38,10 +38,5 @@ ENUM_LOWERINGOPT(Underscoring, unsigned, 1, 1) /// (i.e. wraps around as two's complement). Off by default. ENUM_LOWERINGOPT(IntegerWrapAround, unsigned, 1, 0) -/// If true, add nsw flags to loop variable increments. -/// Off by default. -/// TODO: integrate this option with the above -ENUM_LOWERINGOPT(NSWOnLoopVarInc, unsigned, 1, 0) - #undef LOWERINGOPT #undef ENUM_LOWERINGOPT diff --git a/flang/include/flang/Optimizer/Passes/Pipelines.h b/flang/include/flang/Optimizer/Passes/Pipelines.h index 339182605f818f..ef5d44ded706c7 100644 --- a/flang/include/flang/Optimizer/Passes/Pipelines.h +++ b/flang/include/flang/Optimizer/Passes/Pipelines.h @@ -33,16 +33,16 @@ namespace fir { using PassConstructor = std::unique_ptr<mlir::Pass>(); -template <typename OP> -void addNestedPassToOps(mlir::PassManager &pm, PassConstructor ctor) { +template <typename F, typename OP> +void addNestedPassToOps(mlir::PassManager &pm, F ctor) { pm.addNestedPass<OP>(ctor()); } -template <typename OP, typename... OPS, +template <typename F, typename OP, typename... OPS, typename = std::enable_if_t<sizeof...(OPS) != 0>> -void addNestedPassToOps(mlir::PassManager &pm, PassConstructor ctor) { - addNestedPassToOps<OP>(pm, ctor); - addNestedPassToOps<OPS...>(pm, ctor); +void addNestedPassToOps(mlir::PassManager &pm, F ctor) { + addNestedPassToOps<F, OP>(pm, ctor); + addNestedPassToOps<F, OPS...>(pm, ctor); } /// Generic for adding a pass to the pass manager if it is not disabled. @@ -60,11 +60,12 @@ void addNestedPassConditionally(mlir::PassManager &pm, pm.addNestedPass<OP>(ctor()); } -void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm, - PassConstructor ctor); +template <typename F> +void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm, F ctor); +template <typename F> void addNestedPassToAllTopLevelOperationsConditionally( - mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, PassConstructor ctor); + mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, F ctor); /// Add MLIR Canonicalizer pass with region simplification disabled. /// FIR does not support the promotion of some SSA value to block arguments (or diff --git a/flang/include/flang/Optimizer/Transforms/Passes.h b/flang/include/flang/Optimizer/Transforms/Passes.h index e8f0a8444a31a1..10e1c999d45335 100644 --- a/flang/include/flang/Optimizer/Transforms/Passes.h +++ b/flang/include/flang/Optimizer/Transforms/Passes.h @@ -66,7 +66,6 @@ namespace fir { std::unique_ptr<mlir::Pass> createAffineDemotionPass(); std::unique_ptr<mlir::Pass> createArrayValueCopyPass(fir::ArrayValueCopyOptions options = {}); -std::unique_ptr<mlir::Pass> createCFGConversionPassWithNSW(); std::unique_ptr<mlir::Pass> createMemDataFlowOptPass(); std::unique_ptr<mlir::Pass> createPromoteToAffinePass(); std::unique_ptr<mlir::Pass> @@ -83,7 +82,7 @@ createVScaleAttrPass(std::pair<unsigned, unsigned> vscaleAttr); void populateCfgConversionRewrites(mlir::RewritePatternSet &patterns, bool forceLoopToExecuteOnce = false, - bool setNSW = false); + bool setNSW = true); // declarative passes #define GEN_PASS_REGISTRATION diff --git a/flang/include/flang/Optimizer/Transforms/Passes.td b/flang/include/flang/Optimizer/Transforms/Passes.td index 1db41fa7972bf1..61f8b0835c9583 100644 --- a/flang/include/flang/Optimizer/Transforms/Passes.td +++ b/flang/include/flang/Optimizer/Transforms/Passes.td @@ -153,7 +153,7 @@ def CFGConversion : Pass<"cfg-conversion"> { /*default=*/"false", "force the body of a loop to execute at least once">, Option<"setNSW", "set-nsw", "bool", - /*default=*/"false", + /*default=*/"true", "set nsw on loop variable increment"> ]; } diff --git a/flang/include/flang/Tools/CrossToolHelpers.h b/flang/include/flang/Tools/CrossToolHelpers.h index d936b739e58157..c0091e1c953b8f 100644 --- a/flang/include/flang/Tools/CrossToolHelpers.h +++ b/flang/include/flang/Tools/CrossToolHelpers.h @@ -122,7 +122,7 @@ struct MLIRToLLVMPassPipelineConfig : public FlangEPCallBacks { bool NoSignedZerosFPMath = false; ///< Set no-signed-zeros-fp-math attribute for functions. bool UnsafeFPMath = false; ///< Set unsafe-fp-math attribute for functions. - bool NSWOnLoopVarInc = false; ///< Add nsw flag to loop variable increments. + bool NSWOnLoopVarInc = true; ///< Add nsw flag to loop variable increments. bool EnableOpenMP = false; ///< Enable OpenMP lowering. }; diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 0b79c95eade0d3..648b88e84051c2 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1362,12 +1362,6 @@ bool CompilerInvocation::createFromArgs( invoc.loweringOpts.setNoPPCNativeVecElemOrder(true); } - // -flang-experimental-integer-overflow - if (args.hasArg( - clang::driver::options::OPT_flang_experimental_integer_overflow)) { - invoc.loweringOpts.setNSWOnLoopVarInc(true); - } - // Preserve all the remark options requested, i.e. -Rpass, -Rpass-missed or // -Rpass-analysis. This will be used later when processing and outputting the // remarks generated by LLVM in ExecuteCompilerInvocation.cpp. diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 8c21fe18e67b4d..77631f70dfd19f 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -836,8 +836,8 @@ void CodeGenAction::generateLLVMIR() { Fortran::common::LanguageFeature::OpenMP)) config.EnableOpenMP = true; - if (ci.getInvocation().getLoweringOpts().getNSWOnLoopVarInc()) - config.NSWOnLoopVarInc = true; + if (ci.getInvocation().getLoweringOpts().getIntegerWrapAround()) + config.NSWOnLoopVarInc = false; // Create the pass pipeline fir::createMLIRToLLVMPassPipeline(pm, config, getCurrentFile()); diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index 41b739560aea83..36e72dab674ff6 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -2330,7 +2330,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { assert(!incrementLoopNestInfo.empty() && "empty loop nest"); mlir::Location loc = toLocation(); mlir::arith::IntegerOverflowFlags flags{}; - if (getLoweringOptions().getNSWOnLoopVarInc()) + if (!getLoweringOptions().getIntegerWrapAround()) flags = bitEnumSet(flags, mlir::arith::IntegerOverflowFlags::nsw); auto iofAttr = mlir::arith::IntegerOverflowFlagsAttr::get( builder->getContext(), flags); diff --git a/flang/lib/Lower/IO.cpp b/flang/lib/Lower/IO.cpp index 1894b0cfd1bec2..b534c81a605a90 100644 --- a/flang/lib/Lower/IO.cpp +++ b/flang/lib/Lower/IO.cpp @@ -929,7 +929,7 @@ static void genIoLoop(Fortran::lower::AbstractConverter &converter, fir::FirOpBuilder &builder = converter.getFirOpBuilder(); mlir::Location loc = converter.getCurrentLocation(); mlir::arith::IntegerOverflowFlags flags{}; - if (converter.getLoweringOptions().getNSWOnLoopVarInc()) + if (!converter.getLoweringOptions().getIntegerWrapAround()) flags = bitEnumSet(flags, mlir::arith::IntegerOverflowFlags::nsw); auto iofAttr = mlir::arith::IntegerOverflowFlagsAttr::get(builder.getContext(), flags); diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp index 0743fb60aa847a..19e07ceda317b0 100644 --- a/flang/lib/Optimizer/Passes/Pipelines.cpp +++ b/flang/lib/Optimizer/Passes/Pipelines.cpp @@ -13,18 +13,18 @@ namespace fir { -void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm, - PassConstructor ctor) { - addNestedPassToOps<mlir::func::FuncOp, mlir::omp::DeclareReductionOp, +template <typename F> +void addNestedPassToAllTopLevelOperations(mlir::PassManager &pm, F ctor) { + addNestedPassToOps<F, mlir::func::FuncOp, mlir::omp::DeclareReductionOp, mlir::omp::PrivateClauseOp, fir::GlobalOp, mlir::gpu::GPUModuleOp>(pm, ctor); } +template <typename F> void addNestedPassToAllTopLevelOperationsConditionally( - mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, - PassConstructor ctor) { + mlir::PassManager &pm, llvm::cl::opt<bool> &disabled, F ctor) { if (!disabled) - addNestedPassToAllTopLevelOperations(pm, ctor); + addNestedPassToAllTopLevelOperations<F>(pm, ctor); } void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm) { @@ -35,12 +35,11 @@ void addCanonicalizerPassWithoutRegionSimplification(mlir::OpPassManager &pm) { void addCfgConversionPass(mlir::PassManager &pm, const MLIRToLLVMPassPipelineConfig &config) { - if (config.NSWOnLoopVarInc) - addNestedPassToAllTopLevelOperationsConditionally( - pm, disableCfgConversion, fir::createCFGConversionPassWithNSW); - else - addNestedPassToAllTopLevelOperationsConditionally(pm, disableCfgConversion, - fir::createCFGConversion); + fir::CFGConversionOptions options; + if (!config.NSWOnLoopVarInc) + options.setNSW = false; + addNestedPassToAllTopLevelOperationsConditionally( + pm, disableCfgConversion, [&]() { return createCFGConversion(options); }); } void addAVC(mlir::PassManager &pm, const llvm::OptimizationLevel &optLevel) { @@ -161,7 +160,8 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm, config.enableRegionSimplification = mlir::GreedySimplifyRegionLevel::Disabled; pm.addPass(mlir::createCSEPass()); fir::addAVC(pm, pc.OptLevel); - addNestedPassToAllTopLevelOperations(pm, fir::createCharacterConversion); + addNestedPassToAllTopLevelOperations<PassConstructor>( + pm, fir::createCharacterConversion); pm.addPass(mlir::createCanonicalizerPass(config)); pm.addPass(fir::createSimplifyRegionLite()); if (pc.OptLevel.isOptimizingForSpeed()) { @@ -195,7 +195,8 @@ void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm, if (pc.AliasAnalysis && !disableFirAliasTags && !useOldAliasTags) pm.addPass(fir::createAddAliasTags()); - addNestedPassToAllTopLevelOperations(pm, fir::createStackReclaim); + addNestedPassToAllTopLevelOperations<PassConstructor>( + pm, fir::createStackReclaim); // convert control flow to CFG form fir::addCfgConversionPass(pm, pc); pm.addPass(mlir::createConvertSCFToCFPass()); @@ -217,15 +218,16 @@ void createHLFIRToFIRPassPipeline(mlir::PassManager &pm, bool enableOpenMP, llvm::OptimizationLevel optLevel) { if (optLevel.isOptimizingForSpeed()) { addCanonicalizerPassWithoutRegionSimplification(pm); - addNestedPassToAllTopLevelOperations(pm, - hlfir::createSimplifyHLFIRIntrinsics); + addNestedPassToAllTopLevelOperations<PassConstructor>( + pm, hlfir::createSimplifyHLFIRIntrinsics); } - addNestedPassToAllTopLevelOperations(pm, hlfir::createInlineElementals); + addNestedPassToAllTopLevelOperations<PassConstructor>( + pm, hlfir::createInlineElementals); if (optLevel.isOptimizingForSpeed()) { addCanonicalizerPassWithoutRegionSimplification(pm); pm.addPass(mlir::createCSEPass()); - addNestedPassToAllTopLevelOperations(pm, - hlfir::createOptimizedBufferization); + addNestedPassToAllTopLevelOperations<PassConstructor>( + pm, hlfir::createOptimizedBufferization); } pm.addPass(hlfir::createLowerHLFIROrderedAssignments()); pm.addPass(hlfir::createLowerHLFIRIntrinsics()); @@ -265,7 +267,8 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig config, llvm::StringRef inputFilename) { fir::addBoxedProcedurePass(pm); - addNestedPassToAllTopLevelOperations(pm, fir::createAbstractResultOpt); + addNestedPassToAllTopLevelOperations<PassConstructor>( + pm, fir::createAbstractResultOpt); fir::addCodeGenRewritePass( pm, (config.DebugInfo != llvm::codegenoptions::NoDebugInfo)); fir::addExternalNameConversionPass(pm, config.Underscoring); diff --git a/flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp b/flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp index 3b79d6d311b71c..b09bbf6106dbbb 100644 --- a/flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp +++ b/flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp @@ -332,8 +332,6 @@ class CfgConversion : public fir::impl::CFGConversionBase<CfgConversion> { public: using CFGConversionBase<CfgConversion>::CFGConversionBase; - CfgConversion(bool setNSW) { this->setNSW = setNSW; } - void runOnOperation() override { auto *context = &this->getContext(); mlir::RewritePatternSet patterns(context); @@ -365,7 +363,3 @@ void fir::populateCfgConversionRewrites(mlir::RewritePatternSet &patterns, patterns.insert<CfgLoopConv, CfgIfConv, CfgIterWhileConv>( patterns.getContext(), forceLoopToExecuteOnce, setNSW); } - -std::unique_ptr<mlir::Pass> fir::createCFGConversionPassWithNSW() { - return std::make_unique<CfgConversion>(true); -} diff --git a/flang/test/Driver/frontend-forwarding.f90 b/flang/test/Driver/frontend-forwarding.f90 index ff2d6609521464..55a74ccf40467b 100644 --- a/flang/test/Driver/frontend-forwarding.f90 +++ b/flang/test/Driver/frontend-forwarding.f90 @@ -20,7 +20,6 @@ ! RUN: -fversion-loops-for-stride \ ! RUN: -flang-experimental-hlfir \ ! RUN: -flang-deprecated-no-hlfir \ -! RUN: -flang-experimental-integer-overflow \ ! RUN: -fno-ppc-native-vector-element-order \ ! RUN: -fppc-native-vector-element-order \ ! RUN: -mllvm -print-before-all \ @@ -52,7 +51,6 @@ ! CHECK: "-fversion-loops-for-stride" ! CHECK: "-flang-experimental-hlfir" ! CHECK: "-flang-deprecated-no-hlfir" -! CHECK: "-flang-experimental-integer-overflow" ! CHECK: "-fno-ppc-native-vector-element-order" ! CHECK: "-fppc-native-vector-element-order" ! CHECK: "-Rpass" diff --git a/flang/test/Fir/convert-to-llvm-openmp-and-fir.fir b/flang/test/Fir/convert-to-llvm-openmp-and-fir.fir index 6e4ac824fbd9cf..8e4e1fe824d9f5 100644 --- a/flang/test/Fir/convert-to-llvm-openmp-and-fir.fir +++ b/flang/test/Fir/convert-to-llvm-openmp-and-fir.fir @@ -358,10 +358,10 @@ func.func @_QPopenmp_target_data_region() { %9 = arith.subi %8, %c1_i64 : i64 %10 = fir.coordinate_of %0, %9 : (!fir.ref<!fir.array<1024xi32>>, i64) -> !fir.ref<i32> fir.store %6 to %10 : !fir.ref<i32> - %11 = arith.addi %arg0, %c1 : index + %11 = arith.addi %arg0, %c1 overflow<nsw> : index %12 = fir.convert %c1 : (index) -> i32 %13 = fir.load %1 : !fir.ref<i32> - %14 = arith.addi %13, %12 : i32 + %14 = arith.addi %13, %12 overflow<nsw> : i32 fir.result %11, %14 : index, i32 } fir.store %5#1 to %1 : !fir.ref<i32> @@ -404,11 +404,11 @@ func.func @_QPopenmp_target_data_region() { // CHECK: %[[VAL_21:.*]] = llvm.sub %[[VAL_19]], %[[VAL_20]] : i64 // CHECK: %[[VAL_22:.*]] = llvm.getelementptr %[[VAL_1]][0, %[[VAL_21]]] : (!llvm.ptr, i64) -> !llvm.ptr // CHECK: llvm.store %[[VAL_17]], %[[VAL_22]] : i32, !llvm.ptr -// CHECK: %[[VAL_23:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] : i64 +// CHECK: %[[VAL_23:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] overflow<nsw> : i64 // CHECK: %[[VAL_24:.*]] = llvm.trunc %[[VAL_8]] : i64 to i32 // CHECK: %[[VAL_25:.*]] = llvm.load %[[VAL_3]] : !llvm.ptr -> i32 -// CHECK: %[[VAL_26:.*]] = llvm.add %[[VAL_25]], %[[VAL_24]] : i32 -// CHECK: %[[VAL_27:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] : i64 +// CHECK: %[[VAL_26:.*]] = llvm.add %[[VAL_25]], %[[VAL_24]] overflow<nsw> : i32 +// CHECK: %[[VAL_27:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] overflow<nsw> : i64 // CHECK: %[[VAL_28:.*]] = llvm.mlir.constant(1 : index) : i64 // CHECK: %[[VAL_29:.*]] = llvm.sub %[[VAL_14]], %[[VAL_28]] : i64 // CHECK: llvm.br ^bb1(%[[VAL_27]], %[[VAL_26]], %[[VAL_29]] : i64, i32, i64) diff --git a/flang/test/Fir/loop01.fir b/flang/test/Fir/loop01.fir index c1cbb522c378c0..30d10b9bbdb979 100644 --- a/flang/test/Fir/loop01.fir +++ b/flang/test/Fir/loop01.fir @@ -1,5 +1,7 @@ // RUN: fir-opt --split-input-file --cfg-conversion %s | FileCheck %s -// RUN: fir-opt --split-input-file --cfg-conversion="set-nsw=true" %s | FileCheck %s --check-prefix=NSW +// RUN: fir-opt --split-input-file --cfg-conversion="set-nsw=false" %s | FileCheck %s --check-prefix=NO-NSW + +// NO-NSW-NOT: overflow<nsw> func.func @x(%lb : index, %ub : index, %step : index, %b : i1, %addr : !fir.ref<index>) { fir.do_loop %iv = %lb to %ub step %step unordered { @@ -35,7 +37,7 @@ func.func private @f2() -> i1 // CHECK: fir.store %[[VAL_12]] to %[[VAL_4]] : !fir.ref<index> // CHECK: br ^bb5 // CHECK: ^bb5: -// CHECK: %[[VAL_13:.*]] = arith.addi %[[VAL_8]], %[[VAL_2]] : index +// CHECK: %[[VAL_13:.*]] = arith.addi %[[VAL_8]], %[[VAL_2]] overflow<nsw> : index // CHECK: %[[VAL_14:.*]] = arith.constant 1 : index // CHECK: %[[VAL_15:.*]] = arith.subi %[[VAL_9]], %[[VAL_14]] : index // CHECK: br ^bb1(%[[VAL_13]], %[[VAL_15]] : index, index) @@ -44,34 +46,6 @@ func.func private @f2() -> i1 // CHECK: } // CHECK: func private @f2() -> i1 -// NSW: func @x(%[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: index, %[[VAL_3:.*]]: i1, %[[VAL_4:.*]]: !fir.ref<index>) { -// NSW: %[[VAL_5:.*]] = arith.subi %[[VAL_1]], %[[VAL_0]] : index -// NSW: %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %[[VAL_2]] : index -// NSW: %[[VAL_7:.*]] = arith.divsi %[[VAL_6]], %[[VAL_2]] : index -// NSW: br ^bb1(%[[VAL_0]], %[[VAL_7]] : index, index) -// NSW: ^bb1(%[[VAL_8:.*]]: index, %[[VAL_9:.*]]: index): -// NSW: %[[VAL_10:.*]] = arith.constant 0 : index -// NSW: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_9]], %[[VAL_10]] : index -// NSW: cond_br %[[VAL_11]], ^bb2, ^bb6 -// NSW: ^bb2: -// NSW: cond_br %[[VAL_3]], ^bb3, ^bb4 -// NSW: ^bb3: -// NSW: fir.store %[[VAL_8]] to %[[VAL_4]] : !fir.ref<index> -// NSW: br ^bb5... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/118933 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits