[clang] [flang] [flang] Add nsw flag to do-variable increment with a new option (PR #91579)

2024-05-09 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj created 
https://github.com/llvm/llvm-project/pull/91579

This patch adds nsw flag to the increment of do-variables when a new option is 
enabled.
NOTE 11.10 in the Fortran 2018 standard says they never overflow.

See also the discussion in #74709 and the following discourse post.
https://discourse.llvm.org/t/rfc-add-nsw-flags-to-arithmetic-integer-operations-using-the-option-fno-wrapv/77584/5


>From 26a5d63d6edff20dada4bad39317ba688fbd798a Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 24 Apr 2024 14:42:21 +0900
Subject: [PATCH] [flang] Add nsw flag to do-variable increment with a new
 option

This patch adds nsw flag to the increment of do-variables when
a new option is enabled.
NOTE 11.10 in the Fortran 2018 standard says they never overflow.

See also the discussion in 74709 and
discourse post.
---
 clang/include/clang/Driver/Options.td |   4 +
 clang/lib/Driver/ToolChains/Flang.cpp |   1 +
 flang/include/flang/Lower/LoweringOptions.def |   4 +
 .../flang/Optimizer/Transforms/Passes.h   |   4 +-
 .../flang/Optimizer/Transforms/Passes.td  |   5 +-
 flang/include/flang/Tools/CLOptions.inc   |  13 +-
 flang/include/flang/Tools/CrossToolHelpers.h  |   1 +
 flang/lib/Frontend/CompilerInvocation.cpp |   6 +
 flang/lib/Frontend/FrontendActions.cpp|   3 +
 flang/lib/Lower/Bridge.cpp|  12 +-
 flang/lib/Lower/IO.cpp|   9 +-
 .../Transforms/ControlFlowConverter.cpp   |  44 +++-
 flang/test/Driver/frontend-forwarding.f90 |   2 +
 flang/test/Fir/loop01.fir | 211 ++
 flang/test/Lower/array-substring.f90  |  40 
 flang/test/Lower/do_loop.f90  |  42 
 flang/test/Lower/do_loop_unstructured.f90 | 189 +++-
 flang/test/Lower/infinite_loop.f90|  34 +++
 flang/test/Lower/io-implied-do-fixes.f90  |  51 -
 flang/tools/bbc/bbc.cpp   |   7 +
 20 files changed, 659 insertions(+), 23 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 938d5358eeda6..a59da22fbdfc5 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6530,6 +6530,10 @@ 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 8955b9fb653c2..677a598aa77c2 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -139,6 +139,7 @@ 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 be080a4d29d73..839d2b46249b0 100644
--- a/flang/include/flang/Lower/LoweringOptions.def
+++ b/flang/include/flang/Lower/LoweringOptions.def
@@ -34,5 +34,9 @@ ENUM_LOWERINGOPT(NoPPCNativeVecElemOrder, unsigned, 1, 0)
 /// On by default.
 ENUM_LOWERINGOPT(Underscoring, unsigned, 1, 1)
 
+/// If true, add nsw flags to arithmetic operations for integer.
+/// Off by default.
+ENUM_LOWERINGOPT(NoSignedWrap, unsigned, 1, 0)
+
 #undef LOWERINGOPT
 #undef ENUM_LOWERINGOPT
diff --git a/flang/include/flang/Optimizer/Transforms/Passes.h 
b/flang/include/flang/Optimizer/Transforms/Passes.h
index 470ed8a125ac4..496201a04e29c 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.h
+++ b/flang/include/flang/Optimizer/Transforms/Passes.h
@@ -54,6 +54,7 @@ namespace fir {
 std::unique_ptr createAffineDemotionPass();
 std::unique_ptr
 createArrayValueCopyPass(fir::ArrayValueCopyOptions options = {});
+std::unique_ptr createCFGConversionPassWithNSW();
 std::unique_ptr createExternalNameConversionPass();
 std::unique_ptr
 createExternalNameConversionPass(bool appendUnderscore);
@@ -89,7 +90,8 @@ createFunctionAttrPass(FunctionAttrTypes &functionAttr, bool 
noInfsFPMath,
bool noSignedZerosFPMath, bool unsafeFPMath);
 
 void po

[clang] [flang] [flang] Add nsw flag to do-variable increment with a new option (PR #91579)

2024-05-09 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj updated 
https://github.com/llvm/llvm-project/pull/91579

>From f51cfbe1e50c7a1aa902c684f12a20d0fac39c21 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 24 Apr 2024 14:42:21 +0900
Subject: [PATCH] [flang] Add nsw flag to do-variable increment with a new
 option

This patch adds nsw flag to the increment of do-variables when
a new option is enabled.
NOTE 11.10 in the Fortran 2018 standard says they never overflow.

See also the discussion in 74709 and
discourse post.
---
 clang/include/clang/Driver/Options.td |   4 +
 clang/lib/Driver/ToolChains/Flang.cpp |   1 +
 flang/include/flang/Lower/LoweringOptions.def |   4 +
 .../flang/Optimizer/Transforms/Passes.h   |   4 +-
 .../flang/Optimizer/Transforms/Passes.td  |   5 +-
 flang/include/flang/Tools/CLOptions.inc   |  13 +-
 flang/include/flang/Tools/CrossToolHelpers.h  |   1 +
 flang/lib/Frontend/CompilerInvocation.cpp |   6 +
 flang/lib/Frontend/FrontendActions.cpp|   3 +
 flang/lib/Lower/Bridge.cpp|  12 +-
 flang/lib/Lower/IO.cpp|   9 +-
 .../Transforms/ControlFlowConverter.cpp   |  44 +++-
 flang/test/Driver/frontend-forwarding.f90 |   2 +
 flang/test/Fir/loop01.fir | 211 ++
 flang/test/Lower/array-substring.f90  |  40 
 flang/test/Lower/do_loop.f90  |  42 
 flang/test/Lower/do_loop_unstructured.f90 | 189 +++-
 flang/test/Lower/infinite_loop.f90|  34 +++
 flang/test/Lower/io-implied-do-fixes.f90  |  51 -
 flang/tools/bbc/bbc.cpp   |   7 +
 20 files changed, 659 insertions(+), 23 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 1429528975853..0d032076f7163 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6539,6 +6539,10 @@ 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 436a9c418a5f9..0ae489a823078 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -139,6 +139,7 @@ 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 be080a4d29d73..839d2b46249b0 100644
--- a/flang/include/flang/Lower/LoweringOptions.def
+++ b/flang/include/flang/Lower/LoweringOptions.def
@@ -34,5 +34,9 @@ ENUM_LOWERINGOPT(NoPPCNativeVecElemOrder, unsigned, 1, 0)
 /// On by default.
 ENUM_LOWERINGOPT(Underscoring, unsigned, 1, 1)
 
+/// If true, add nsw flags to arithmetic operations for integer.
+/// Off by default.
+ENUM_LOWERINGOPT(NoSignedWrap, unsigned, 1, 0)
+
 #undef LOWERINGOPT
 #undef ENUM_LOWERINGOPT
diff --git a/flang/include/flang/Optimizer/Transforms/Passes.h 
b/flang/include/flang/Optimizer/Transforms/Passes.h
index 470ed8a125ac4..496201a04e29c 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.h
+++ b/flang/include/flang/Optimizer/Transforms/Passes.h
@@ -54,6 +54,7 @@ namespace fir {
 std::unique_ptr createAffineDemotionPass();
 std::unique_ptr
 createArrayValueCopyPass(fir::ArrayValueCopyOptions options = {});
+std::unique_ptr createCFGConversionPassWithNSW();
 std::unique_ptr createExternalNameConversionPass();
 std::unique_ptr
 createExternalNameConversionPass(bool appendUnderscore);
@@ -89,7 +90,8 @@ createFunctionAttrPass(FunctionAttrTypes &functionAttr, bool 
noInfsFPMath,
bool noSignedZerosFPMath, bool unsafeFPMath);
 
 void populateCfgConversionRewrites(mlir::RewritePatternSet &patterns,
-   bool forceLoopToExecuteOnce = false);
+   bool forceLoopToExecuteOnce = false,
+   bool setNSW = false);
 
 // declarative passes
 #define GEN_PASS_REGISTRATION
diff --git a/flan

[clang] [flang] [flang] Add nsw flag to do-variable increment with a new option (PR #91579)

2024-05-09 Thread Yusuke MINATO via cfe-commits

yus3710-fj wrote:

Windows build failed with the following message.

> fatal error C1060: compiler is out of heap space

I'll try re-running CI with an empty commit because it might have been happend 
by accident.


https://github.com/llvm/llvm-project/pull/91579
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang] Add nsw flag to do-variable increment with a new option (PR #91579)

2024-05-09 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj updated 
https://github.com/llvm/llvm-project/pull/91579

>From f51cfbe1e50c7a1aa902c684f12a20d0fac39c21 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 24 Apr 2024 14:42:21 +0900
Subject: [PATCH 1/2] [flang] Add nsw flag to do-variable increment with a new
 option

This patch adds nsw flag to the increment of do-variables when
a new option is enabled.
NOTE 11.10 in the Fortran 2018 standard says they never overflow.

See also the discussion in 74709 and
discourse post.
---
 clang/include/clang/Driver/Options.td |   4 +
 clang/lib/Driver/ToolChains/Flang.cpp |   1 +
 flang/include/flang/Lower/LoweringOptions.def |   4 +
 .../flang/Optimizer/Transforms/Passes.h   |   4 +-
 .../flang/Optimizer/Transforms/Passes.td  |   5 +-
 flang/include/flang/Tools/CLOptions.inc   |  13 +-
 flang/include/flang/Tools/CrossToolHelpers.h  |   1 +
 flang/lib/Frontend/CompilerInvocation.cpp |   6 +
 flang/lib/Frontend/FrontendActions.cpp|   3 +
 flang/lib/Lower/Bridge.cpp|  12 +-
 flang/lib/Lower/IO.cpp|   9 +-
 .../Transforms/ControlFlowConverter.cpp   |  44 +++-
 flang/test/Driver/frontend-forwarding.f90 |   2 +
 flang/test/Fir/loop01.fir | 211 ++
 flang/test/Lower/array-substring.f90  |  40 
 flang/test/Lower/do_loop.f90  |  42 
 flang/test/Lower/do_loop_unstructured.f90 | 189 +++-
 flang/test/Lower/infinite_loop.f90|  34 +++
 flang/test/Lower/io-implied-do-fixes.f90  |  51 -
 flang/tools/bbc/bbc.cpp   |   7 +
 20 files changed, 659 insertions(+), 23 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 1429528975853..0d032076f7163 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6539,6 +6539,10 @@ 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 436a9c418a5f9..0ae489a823078 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -139,6 +139,7 @@ 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 be080a4d29d73..839d2b46249b0 100644
--- a/flang/include/flang/Lower/LoweringOptions.def
+++ b/flang/include/flang/Lower/LoweringOptions.def
@@ -34,5 +34,9 @@ ENUM_LOWERINGOPT(NoPPCNativeVecElemOrder, unsigned, 1, 0)
 /// On by default.
 ENUM_LOWERINGOPT(Underscoring, unsigned, 1, 1)
 
+/// If true, add nsw flags to arithmetic operations for integer.
+/// Off by default.
+ENUM_LOWERINGOPT(NoSignedWrap, unsigned, 1, 0)
+
 #undef LOWERINGOPT
 #undef ENUM_LOWERINGOPT
diff --git a/flang/include/flang/Optimizer/Transforms/Passes.h 
b/flang/include/flang/Optimizer/Transforms/Passes.h
index 470ed8a125ac4..496201a04e29c 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.h
+++ b/flang/include/flang/Optimizer/Transforms/Passes.h
@@ -54,6 +54,7 @@ namespace fir {
 std::unique_ptr createAffineDemotionPass();
 std::unique_ptr
 createArrayValueCopyPass(fir::ArrayValueCopyOptions options = {});
+std::unique_ptr createCFGConversionPassWithNSW();
 std::unique_ptr createExternalNameConversionPass();
 std::unique_ptr
 createExternalNameConversionPass(bool appendUnderscore);
@@ -89,7 +90,8 @@ createFunctionAttrPass(FunctionAttrTypes &functionAttr, bool 
noInfsFPMath,
bool noSignedZerosFPMath, bool unsafeFPMath);
 
 void populateCfgConversionRewrites(mlir::RewritePatternSet &patterns,
-   bool forceLoopToExecuteOnce = false);
+   bool forceLoopToExecuteOnce = false,
+   bool setNSW = false);
 
 // declarative passes
 #define GEN_PASS_REGISTRATION
diff --git a/

[clang] [flang] [flang] Add nsw flag to do-variable increment with a new option (PR #91579)

2024-05-14 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj updated 
https://github.com/llvm/llvm-project/pull/91579

>From f51cfbe1e50c7a1aa902c684f12a20d0fac39c21 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 24 Apr 2024 14:42:21 +0900
Subject: [PATCH 1/3] [flang] Add nsw flag to do-variable increment with a new
 option

This patch adds nsw flag to the increment of do-variables when
a new option is enabled.
NOTE 11.10 in the Fortran 2018 standard says they never overflow.

See also the discussion in 74709 and
discourse post.
---
 clang/include/clang/Driver/Options.td |   4 +
 clang/lib/Driver/ToolChains/Flang.cpp |   1 +
 flang/include/flang/Lower/LoweringOptions.def |   4 +
 .../flang/Optimizer/Transforms/Passes.h   |   4 +-
 .../flang/Optimizer/Transforms/Passes.td  |   5 +-
 flang/include/flang/Tools/CLOptions.inc   |  13 +-
 flang/include/flang/Tools/CrossToolHelpers.h  |   1 +
 flang/lib/Frontend/CompilerInvocation.cpp |   6 +
 flang/lib/Frontend/FrontendActions.cpp|   3 +
 flang/lib/Lower/Bridge.cpp|  12 +-
 flang/lib/Lower/IO.cpp|   9 +-
 .../Transforms/ControlFlowConverter.cpp   |  44 +++-
 flang/test/Driver/frontend-forwarding.f90 |   2 +
 flang/test/Fir/loop01.fir | 211 ++
 flang/test/Lower/array-substring.f90  |  40 
 flang/test/Lower/do_loop.f90  |  42 
 flang/test/Lower/do_loop_unstructured.f90 | 189 +++-
 flang/test/Lower/infinite_loop.f90|  34 +++
 flang/test/Lower/io-implied-do-fixes.f90  |  51 -
 flang/tools/bbc/bbc.cpp   |   7 +
 20 files changed, 659 insertions(+), 23 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 1429528975853..0d032076f7163 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6539,6 +6539,10 @@ 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 436a9c418a5f9..0ae489a823078 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -139,6 +139,7 @@ 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 be080a4d29d73..839d2b46249b0 100644
--- a/flang/include/flang/Lower/LoweringOptions.def
+++ b/flang/include/flang/Lower/LoweringOptions.def
@@ -34,5 +34,9 @@ ENUM_LOWERINGOPT(NoPPCNativeVecElemOrder, unsigned, 1, 0)
 /// On by default.
 ENUM_LOWERINGOPT(Underscoring, unsigned, 1, 1)
 
+/// If true, add nsw flags to arithmetic operations for integer.
+/// Off by default.
+ENUM_LOWERINGOPT(NoSignedWrap, unsigned, 1, 0)
+
 #undef LOWERINGOPT
 #undef ENUM_LOWERINGOPT
diff --git a/flang/include/flang/Optimizer/Transforms/Passes.h 
b/flang/include/flang/Optimizer/Transforms/Passes.h
index 470ed8a125ac4..496201a04e29c 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.h
+++ b/flang/include/flang/Optimizer/Transforms/Passes.h
@@ -54,6 +54,7 @@ namespace fir {
 std::unique_ptr createAffineDemotionPass();
 std::unique_ptr
 createArrayValueCopyPass(fir::ArrayValueCopyOptions options = {});
+std::unique_ptr createCFGConversionPassWithNSW();
 std::unique_ptr createExternalNameConversionPass();
 std::unique_ptr
 createExternalNameConversionPass(bool appendUnderscore);
@@ -89,7 +90,8 @@ createFunctionAttrPass(FunctionAttrTypes &functionAttr, bool 
noInfsFPMath,
bool noSignedZerosFPMath, bool unsafeFPMath);
 
 void populateCfgConversionRewrites(mlir::RewritePatternSet &patterns,
-   bool forceLoopToExecuteOnce = false);
+   bool forceLoopToExecuteOnce = false,
+   bool setNSW = false);
 
 // declarative passes
 #define GEN_PASS_REGISTRATION
diff --git a/

[clang] [flang] [flang] Add nsw flag to do-variable increment with a new option (PR #91579)

2024-05-14 Thread Yusuke MINATO via cfe-commits


@@ -34,5 +34,9 @@ ENUM_LOWERINGOPT(NoPPCNativeVecElemOrder, unsigned, 1, 0)
 /// On by default.
 ENUM_LOWERINGOPT(Underscoring, unsigned, 1, 1)
 
+/// If true, add nsw flags to arithmetic operations for integer.
+/// Off by default.
+ENUM_LOWERINGOPT(NoSignedWrap, unsigned, 1, 0)

yus3710-fj wrote:

Thank you for the review!
I changed the name of the lowering option `NoSignedWrap` to `NSWOnLoopVarInc`.

https://github.com/llvm/llvm-project/pull/91579
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang] Add nsw flag to do-variable increment with a new option (PR #91579)

2024-05-15 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj updated 
https://github.com/llvm/llvm-project/pull/91579

>From 262824a13615b700bbfc672c3a2d06e63892c6e3 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 24 Apr 2024 14:42:21 +0900
Subject: [PATCH] [flang] Add nsw flag to do-variable increment with a new
 option

This patch adds nsw flag to the increment of do-variables when
a new option is enabled.
NOTE 11.10 in the Fortran 2018 standard says they never overflow.

See also the discussion in 74709 and
discourse post.

empty commit to re-run CI

modify the name of the lowering option and its comment
---
 clang/include/clang/Driver/Options.td |   4 +
 clang/lib/Driver/ToolChains/Flang.cpp |   1 +
 flang/include/flang/Lower/LoweringOptions.def |   4 +
 .../flang/Optimizer/Transforms/Passes.h   |   4 +-
 .../flang/Optimizer/Transforms/Passes.td  |   5 +-
 flang/include/flang/Tools/CLOptions.inc   |  13 +-
 flang/include/flang/Tools/CrossToolHelpers.h  |   1 +
 flang/lib/Frontend/CompilerInvocation.cpp |   6 +
 flang/lib/Frontend/FrontendActions.cpp|   3 +
 flang/lib/Lower/Bridge.cpp|  12 +-
 flang/lib/Lower/IO.cpp|   9 +-
 .../Transforms/ControlFlowConverter.cpp   |  44 +++-
 flang/test/Driver/frontend-forwarding.f90 |   2 +
 flang/test/Fir/loop01.fir | 211 ++
 flang/test/Lower/array-substring.f90  |  40 
 flang/test/Lower/do_loop.f90  |  42 
 flang/test/Lower/do_loop_unstructured.f90 | 189 +++-
 flang/test/Lower/infinite_loop.f90|  34 +++
 flang/test/Lower/io-implied-do-fixes.f90  |  51 -
 flang/tools/bbc/bbc.cpp   |   7 +
 20 files changed, 659 insertions(+), 23 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c54eb543d6580..03d2ff193d697 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6550,6 +6550,10 @@ 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 d275528b69051..42ca060186fd8 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -139,6 +139,7 @@ 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 be080a4d29d73..7594a57a26291 100644
--- a/flang/include/flang/Lower/LoweringOptions.def
+++ b/flang/include/flang/Lower/LoweringOptions.def
@@ -34,5 +34,9 @@ ENUM_LOWERINGOPT(NoPPCNativeVecElemOrder, unsigned, 1, 0)
 /// On by default.
 ENUM_LOWERINGOPT(Underscoring, unsigned, 1, 1)
 
+/// If true, add nsw flags to loop variable increments.
+/// Off by default.
+ENUM_LOWERINGOPT(NSWOnLoopVarInc, unsigned, 1, 0)
+
 #undef LOWERINGOPT
 #undef ENUM_LOWERINGOPT
diff --git a/flang/include/flang/Optimizer/Transforms/Passes.h 
b/flang/include/flang/Optimizer/Transforms/Passes.h
index ae1d72a3526bf..25fe61488f4f6 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.h
+++ b/flang/include/flang/Optimizer/Transforms/Passes.h
@@ -54,6 +54,7 @@ namespace fir {
 std::unique_ptr createAffineDemotionPass();
 std::unique_ptr
 createArrayValueCopyPass(fir::ArrayValueCopyOptions options = {});
+std::unique_ptr createCFGConversionPassWithNSW();
 std::unique_ptr createExternalNameConversionPass();
 std::unique_ptr
 createExternalNameConversionPass(bool appendUnderscore);
@@ -89,7 +90,8 @@ createFunctionAttrPass(FunctionAttrTypes &functionAttr, bool 
noInfsFPMath,
bool noSignedZerosFPMath, bool unsafeFPMath);
 
 void populateCfgConversionRewrites(mlir::RewritePatternSet &patterns,
-   bool forceLoopToExecuteOnce = false);
+   bool forceLoopToExecuteOnce = false,
+   bool setNSW = fals

[clang] [flang] [flang] Add nsw flag to do-variable increment with a new option (PR #91579)

2024-05-15 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj closed 
https://github.com/llvm/llvm-project/pull/91579
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-14 Thread Yusuke MINATO via cfe-commits

yus3710-fj wrote:

Gentle ping @MaskRay.

https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-06 Thread Yusuke MINATO via cfe-commits


@@ -866,6 +866,17 @@ void Flang::ConstructJob(Compilation &C, const JobAction 
&JA,
 }
   }
 
+  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
+  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
+  if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
+if (A->getOption().matches(options::OPT_fwrapv))
+  CmdArgs.push_back("-fwrapv");
+  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
+  options::OPT_fno_strict_overflow)) {
+if (A->getOption().matches(options::OPT_fno_strict_overflow))
+  CmdArgs.push_back("-fwrapv");
+  }
+

yus3710-fj wrote:

That sounds good. I fixed it. Thank you.

https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-06 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj updated 
https://github.com/llvm/llvm-project/pull/110061

>From aea2cfa4b1d812dc84cb1609f93cc2ec2bcd33b4 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 18 Sep 2024 21:12:43 +0900
Subject: [PATCH 1/3] [flang][Driver] Add support for -f[no-]wrapv and
 -f[no]-strict-overflow in the frontend

This patch introduces the options for integer overflow flags into Flang.
---
 clang/include/clang/Driver/Options.td | 11 +++---
 clang/lib/Driver/ToolChains/Flang.cpp | 11 ++
 flang/include/flang/Common/LangOptions.def|  2 ++
 flang/include/flang/Common/LangOptions.h  |  8 +
 flang/include/flang/Lower/LoweringOptions.def |  5 ++-
 flang/lib/Frontend/CompilerInvocation.cpp | 36 +--
 flang/test/Driver/frontend-forwarding.f90 |  2 ++
 flang/test/Driver/integer-overflow.f90| 10 ++
 8 files changed, 75 insertions(+), 10 deletions(-)
 create mode 100644 flang/test/Driver/integer-overflow.f90

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 9d183ff2d69b3c..4610cd917f685d 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -3451,7 +3451,8 @@ def fno_strict_aliasing : Flag<["-"], 
"fno-strict-aliasing">, Group,
 def fstruct_path_tbaa : Flag<["-"], "fstruct-path-tbaa">, Group;
 def fno_struct_path_tbaa : Flag<["-"], "fno-struct-path-tbaa">, Group;
 def fno_strict_enums : Flag<["-"], "fno-strict-enums">, Group;
-def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group;
+def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fno_pointer_tbaa : Flag<["-"], "fno-pointer-tbaa">, Group;
 def fno_temp_file : Flag<["-"], "fno-temp-file">, Group,
   Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>, HelpText<
@@ -3467,7 +3468,8 @@ def fno_verbose_asm : Flag<["-"], "fno-verbose-asm">, 
Group,
   Visibility<[ClangOption, CC1Option]>,
   MarshallingInfoNegativeFlag>;
 def fno_working_directory : Flag<["-"], "fno-working-directory">, 
Group;
-def fno_wrapv : Flag<["-"], "fno-wrapv">, Group;
+def fno_wrapv : Flag<["-"], "fno-wrapv">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fobjc_arc : Flag<["-"], "fobjc-arc">, Group,
   Visibility<[ClangOption, CC1Option]>,
   HelpText<"Synthesize retain and release calls for Objective-C pointers">;
@@ -3963,7 +3965,8 @@ defm strict_vtable_pointers : 
BoolFOption<"strict-vtable-pointers",
   "Enable optimizations based on the strict rules for"
 " overwriting polymorphic C++ objects">,
   NegFlag>;
-def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group;
+def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fpointer_tbaa : Flag<["-"], "fpointer-tbaa">, Group;
 def fdriver_only : Flag<["-"], "fdriver-only">, Flags<[NoXarchOption]>,
   Visibility<[ClangOption, CLOption, DXCOption]>,
@@ -4232,7 +4235,7 @@ defm virtual_function_elimination : 
BoolFOption<"virtual-function-elimination",
   NegFlag, BothFlags<[], [ClangOption, CLOption]>>;
 
 def fwrapv : Flag<["-"], "fwrapv">, Group,
-  Visibility<[ClangOption, CC1Option]>,
+  Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
   HelpText<"Treat signed integer overflow as two's complement">;
 def fwritable_strings : Flag<["-"], "fwritable-strings">, Group,
   Visibility<[ClangOption, CC1Option]>,
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 98350690f8d20e..1865fd57a2d893 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -866,6 +866,17 @@ void Flang::ConstructJob(Compilation &C, const JobAction 
&JA,
 }
   }
 
+  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
+  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
+  if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
+if (A->getOption().matches(options::OPT_fwrapv))
+  CmdArgs.push_back("-fwrapv");
+  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
+  options::OPT_fno_strict_overflow)) {
+if (A->getOption().matches(options::OPT_fno_strict_overflow))
+  CmdArgs.push_back("-fwrapv");
+  }
+
   assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");
   if (Output.isFilename()) {
 CmdArgs.push_back("-o");
diff --git a/flang/include/flang/Common/LangOptions.def 
b/flang/include/flang/Common/LangOptions.def
index d3e1e972d1519f..1bfdba9cc2c1c7 100644
--- a/flang/include/flang/Common/LangOptions.def
+++ b/flang/include/flang/Common/LangOptions.def
@@ -20,6 +20,8 @@ LANGOPT(Name, Bits, Default)
 #endif
 
 ENUM_LANGOPT(FPContractMode, FPModeKind, 2, FPM_Fast) ///< FP Contract Mode 
(off/fast)
+/// signed integer overflow handling
+ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBeha

[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-06 Thread Yusuke MINATO via cfe-commits


@@ -6921,16 +6921,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
 
   Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
 
-  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
-  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
-  if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
-if (A->getOption().matches(options::OPT_fwrapv))
-  CmdArgs.push_back("-fwrapv");
-  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
-  options::OPT_fno_strict_overflow)) {
-if (A->getOption().matches(options::OPT_fno_strict_overflow))
-  CmdArgs.push_back("-fwrapv");
-  }
+  // handle -f[no-]wrapv and -f[no-]strict-overflow, which are used by both

yus3710-fj wrote:

Thank you for pointing it out. I fixed it.

https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-06 Thread Yusuke MINATO via cfe-commits


@@ -27,6 +27,14 @@ namespace Fortran::common {
 class LangOptionsBase {
 
 public:
+  enum SignedOverflowBehaviorTy {
+// -fno-wrapv (default behavior in Flang)
+SOB_Undefined,

yus3710-fj wrote:

This is used as the default value of a LangOption `SignedOverflowBehavior`. If 
the behavior is not defined, `nsw` could be added to some operations such as 
`add`.
FWIW, this implementation is simliar to [that of 
Clang](https://github.com/llvm/llvm-project/blob/b672071ba51ef6b64651a62bcfaf78bdfdb7d3d4/clang/include/clang/Basic/LangOptions.h#L87-L96).

https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-04 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj updated 
https://github.com/llvm/llvm-project/pull/110061

>From aea2cfa4b1d812dc84cb1609f93cc2ec2bcd33b4 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 18 Sep 2024 21:12:43 +0900
Subject: [PATCH 1/2] [flang][Driver] Add support for -f[no-]wrapv and
 -f[no]-strict-overflow in the frontend

This patch introduces the options for integer overflow flags into Flang.
---
 clang/include/clang/Driver/Options.td | 11 +++---
 clang/lib/Driver/ToolChains/Flang.cpp | 11 ++
 flang/include/flang/Common/LangOptions.def|  2 ++
 flang/include/flang/Common/LangOptions.h  |  8 +
 flang/include/flang/Lower/LoweringOptions.def |  5 ++-
 flang/lib/Frontend/CompilerInvocation.cpp | 36 +--
 flang/test/Driver/frontend-forwarding.f90 |  2 ++
 flang/test/Driver/integer-overflow.f90| 10 ++
 8 files changed, 75 insertions(+), 10 deletions(-)
 create mode 100644 flang/test/Driver/integer-overflow.f90

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 9d183ff2d69b3c..4610cd917f685d 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -3451,7 +3451,8 @@ def fno_strict_aliasing : Flag<["-"], 
"fno-strict-aliasing">, Group,
 def fstruct_path_tbaa : Flag<["-"], "fstruct-path-tbaa">, Group;
 def fno_struct_path_tbaa : Flag<["-"], "fno-struct-path-tbaa">, Group;
 def fno_strict_enums : Flag<["-"], "fno-strict-enums">, Group;
-def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group;
+def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fno_pointer_tbaa : Flag<["-"], "fno-pointer-tbaa">, Group;
 def fno_temp_file : Flag<["-"], "fno-temp-file">, Group,
   Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>, HelpText<
@@ -3467,7 +3468,8 @@ def fno_verbose_asm : Flag<["-"], "fno-verbose-asm">, 
Group,
   Visibility<[ClangOption, CC1Option]>,
   MarshallingInfoNegativeFlag>;
 def fno_working_directory : Flag<["-"], "fno-working-directory">, 
Group;
-def fno_wrapv : Flag<["-"], "fno-wrapv">, Group;
+def fno_wrapv : Flag<["-"], "fno-wrapv">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fobjc_arc : Flag<["-"], "fobjc-arc">, Group,
   Visibility<[ClangOption, CC1Option]>,
   HelpText<"Synthesize retain and release calls for Objective-C pointers">;
@@ -3963,7 +3965,8 @@ defm strict_vtable_pointers : 
BoolFOption<"strict-vtable-pointers",
   "Enable optimizations based on the strict rules for"
 " overwriting polymorphic C++ objects">,
   NegFlag>;
-def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group;
+def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fpointer_tbaa : Flag<["-"], "fpointer-tbaa">, Group;
 def fdriver_only : Flag<["-"], "fdriver-only">, Flags<[NoXarchOption]>,
   Visibility<[ClangOption, CLOption, DXCOption]>,
@@ -4232,7 +4235,7 @@ defm virtual_function_elimination : 
BoolFOption<"virtual-function-elimination",
   NegFlag, BothFlags<[], [ClangOption, CLOption]>>;
 
 def fwrapv : Flag<["-"], "fwrapv">, Group,
-  Visibility<[ClangOption, CC1Option]>,
+  Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
   HelpText<"Treat signed integer overflow as two's complement">;
 def fwritable_strings : Flag<["-"], "fwritable-strings">, Group,
   Visibility<[ClangOption, CC1Option]>,
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 98350690f8d20e..1865fd57a2d893 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -866,6 +866,17 @@ void Flang::ConstructJob(Compilation &C, const JobAction 
&JA,
 }
   }
 
+  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
+  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
+  if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
+if (A->getOption().matches(options::OPT_fwrapv))
+  CmdArgs.push_back("-fwrapv");
+  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
+  options::OPT_fno_strict_overflow)) {
+if (A->getOption().matches(options::OPT_fno_strict_overflow))
+  CmdArgs.push_back("-fwrapv");
+  }
+
   assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");
   if (Output.isFilename()) {
 CmdArgs.push_back("-o");
diff --git a/flang/include/flang/Common/LangOptions.def 
b/flang/include/flang/Common/LangOptions.def
index d3e1e972d1519f..1bfdba9cc2c1c7 100644
--- a/flang/include/flang/Common/LangOptions.def
+++ b/flang/include/flang/Common/LangOptions.def
@@ -20,6 +20,8 @@ LANGOPT(Name, Bits, Default)
 #endif
 
 ENUM_LANGOPT(FPContractMode, FPModeKind, 2, FPM_Fast) ///< FP Contract Mode 
(off/fast)
+/// signed integer overflow handling
+ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBeha

[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-04 Thread Yusuke MINATO via cfe-commits


@@ -866,6 +866,17 @@ void Flang::ConstructJob(Compilation &C, const JobAction 
&JA,
 }
   }
 
+  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
+  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
+  if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
+if (A->getOption().matches(options::OPT_fwrapv))
+  CmdArgs.push_back("-fwrapv");
+  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
+  options::OPT_fno_strict_overflow)) {
+if (A->getOption().matches(options::OPT_fno_strict_overflow))
+  CmdArgs.push_back("-fwrapv");
+  }
+

yus3710-fj wrote:

Thank you for showing me a better way.
I created a function `renderIntegerOverflowOptions` to handle common options 
between clang and flang. However, I'm not sure the name of the function is 
appropriate because there are other related options handled only by clang (e.g. 
`-ftrapv`).

https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-04 Thread Yusuke MINATO via cfe-commits


@@ -0,0 +1,10 @@
+! Test for correct forwarding of integer overflow flags from the compiler 
driver
+! to the frontend driver
+
+! RUN: %flang -### -fno-strict-overflow %s 2>&1 | FileCheck %s 
--check-prefixes CHECK,INDUCED

yus3710-fj wrote:

As you mentioned, the check for `CHECK` is redundant. I removed it.

https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv (PR #110063)

2024-10-21 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj edited 
https://github.com/llvm/llvm-project/pull/110063
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang] integrate the option -flang-experimental-integer-overflow into -fno-wrapv (PR #110063)

2024-10-21 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj updated 
https://github.com/llvm/llvm-project/pull/110063

>From 934a116155c63fdad76096faa4edd3a9c19ff5d8 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Thu, 19 Sep 2024 14:44:49 +0900
Subject: [PATCH] [flang] integrate the option
 -flang-experimental-integer-overflow into -fno-wrapv

nsw is added to do-variable increment when -fno-wrapv is enabled
as GFortran seems to do.
Therefore, the option introduced by PR91579 isn't necessary any
more.

Note that the feature of -flang-experimental-integer-overflow
is now enabled by default.
---
 clang/include/clang/Driver/Options.td |   4 -
 clang/lib/Driver/ToolChains/Flang.cpp |   1 -
 flang/include/flang/Lower/LoweringOptions.def |   5 -
 .../flang/Optimizer/Transforms/Passes.h   |   4 +-
 .../flang/Optimizer/Transforms/Passes.td  |   2 +-
 flang/include/flang/Tools/CrossToolHelpers.h  |   2 +-
 flang/lib/Frontend/CompilerInvocation.cpp |   6 -
 flang/lib/Frontend/FrontendActions.cpp|   4 +-
 flang/lib/Lower/Bridge.cpp|   2 +-
 flang/lib/Lower/IO.cpp|   2 +-
 flang/lib/Optimizer/Passes/Pipelines.cpp  |   6 +-
 .../Transforms/ControlFlowConverter.cpp   |   8 +-
 flang/test/Driver/frontend-forwarding.f90 |   2 -
 .../Fir/convert-to-llvm-openmp-and-fir.fir|  10 +-
 flang/test/Fir/loop01.fir | 230 +-
 flang/test/Fir/loop02.fir |   4 +-
 flang/test/Lower/HLFIR/goto-do-body.f90   |   4 +-
 .../OpenMP/parallel-private-clause-fixes.f90  |   4 +-
 ...oop-reduction-allocatable-array-minmax.f90 |   4 +-
 flang/test/Lower/OpenMP/wsloop-variable.f90   |   4 +-
 flang/test/Lower/array-character.f90  |   2 +-
 .../test/Lower/array-derived-assignments.f90  |   2 +-
 flang/test/Lower/array-derived.f90|   2 +-
 .../array-elemental-calls-char-byval.f90  |   2 +-
 .../test/Lower/array-elemental-calls-char.f90 |   2 +-
 .../Lower/array-expression-assumed-size.f90   |   2 +-
 flang/test/Lower/array-expression-slice-1.f90 |   2 +-
 flang/test/Lower/array-substring.f90  |  46 +---
 flang/test/Lower/array-temp.f90   |   2 +-
 flang/test/Lower/components.f90   |   2 +-
 flang/test/Lower/do_loop.f90  |  73 ++
 flang/test/Lower/do_loop_unstructured.f90 | 203 +---
 flang/test/Lower/goto-do-body.f90 |   4 +-
 flang/test/Lower/host-associated.f90  |   2 +-
 flang/test/Lower/infinite_loop.f90|  41 +---
 flang/test/Lower/io-implied-do-fixes.f90  |  49 +---
 flang/test/Lower/loops2.f90   |   2 +-
 flang/test/Lower/mixed_loops.f90  |   6 +-
 flang/test/Lower/vector-subscript-io.f90  |  34 +--
 flang/tools/bbc/bbc.cpp   |   9 +-
 40 files changed, 119 insertions(+), 676 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 152c43d7908ff8..6ac1b3beac8a07 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6771,10 +6771,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 a9d2b7a4dc48f9..366cadc2e54775 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.
-//

[clang] [flang] [flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv (PR #110063)

2024-10-21 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj edited 
https://github.com/llvm/llvm-project/pull/110063
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv (PR #110063)

2024-10-21 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj ready_for_review 
https://github.com/llvm/llvm-project/pull/110063
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-17 Thread Yusuke MINATO via cfe-commits

yus3710-fj wrote:

Thank you all for the review! I'll merge this after rebasing.

https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-17 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj updated 
https://github.com/llvm/llvm-project/pull/110061

>From 6215099ca7da009e98eca138590f78a5e524a1e9 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 18 Sep 2024 21:12:43 +0900
Subject: [PATCH] [flang][Driver] Add support for -f[no-]wrapv and
 -f[no]-strict-overflow in the frontend

This patch introduces the options for integer overflow flags into Flang.
---
 clang/include/clang/Driver/Options.td | 11 +++---
 clang/lib/Driver/ToolChains/Clang.cpp | 13 ++-
 clang/lib/Driver/ToolChains/CommonArgs.cpp| 14 
 clang/lib/Driver/ToolChains/CommonArgs.h  |  3 ++
 clang/lib/Driver/ToolChains/Flang.cpp |  2 ++
 flang/include/flang/Common/LangOptions.def|  2 ++
 flang/include/flang/Common/LangOptions.h  |  8 +
 flang/include/flang/Lower/LoweringOptions.def |  5 ++-
 flang/lib/Frontend/CompilerInvocation.cpp | 36 +--
 flang/test/Driver/frontend-forwarding.f90 |  2 ++
 flang/test/Driver/integer-overflow.f90| 10 ++
 11 files changed, 86 insertions(+), 20 deletions(-)
 create mode 100644 flang/test/Driver/integer-overflow.f90

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 379e75b197cf96..c15b1fdfbbd3e2 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -3454,7 +3454,8 @@ def fno_strict_aliasing : Flag<["-"], 
"fno-strict-aliasing">, Group,
 def fstruct_path_tbaa : Flag<["-"], "fstruct-path-tbaa">, Group;
 def fno_struct_path_tbaa : Flag<["-"], "fno-struct-path-tbaa">, Group;
 def fno_strict_enums : Flag<["-"], "fno-strict-enums">, Group;
-def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group;
+def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fno_pointer_tbaa : Flag<["-"], "fno-pointer-tbaa">, Group;
 def fno_temp_file : Flag<["-"], "fno-temp-file">, Group,
   Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>, HelpText<
@@ -3470,7 +3471,8 @@ def fno_verbose_asm : Flag<["-"], "fno-verbose-asm">, 
Group,
   Visibility<[ClangOption, CC1Option]>,
   MarshallingInfoNegativeFlag>;
 def fno_working_directory : Flag<["-"], "fno-working-directory">, 
Group;
-def fno_wrapv : Flag<["-"], "fno-wrapv">, Group;
+def fno_wrapv : Flag<["-"], "fno-wrapv">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fobjc_arc : Flag<["-"], "fobjc-arc">, Group,
   Visibility<[ClangOption, CC1Option]>,
   HelpText<"Synthesize retain and release calls for Objective-C pointers">;
@@ -3966,7 +3968,8 @@ defm strict_vtable_pointers : 
BoolFOption<"strict-vtable-pointers",
   "Enable optimizations based on the strict rules for"
 " overwriting polymorphic C++ objects">,
   NegFlag>;
-def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group;
+def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fpointer_tbaa : Flag<["-"], "fpointer-tbaa">, Group;
 def fdriver_only : Flag<["-"], "fdriver-only">, Flags<[NoXarchOption]>,
   Visibility<[ClangOption, CLOption, DXCOption]>,
@@ -4235,7 +4238,7 @@ defm virtual_function_elimination : 
BoolFOption<"virtual-function-elimination",
   NegFlag, BothFlags<[], [ClangOption, CLOption]>>;
 
 def fwrapv : Flag<["-"], "fwrapv">, Group,
-  Visibility<[ClangOption, CC1Option]>,
+  Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
   HelpText<"Treat signed integer overflow as two's complement">;
 def fwritable_strings : Flag<["-"], "fwritable-strings">, Group,
   Visibility<[ClangOption, CC1Option]>,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 3fc39296f44281..905b9b4983c1df 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -6914,16 +6914,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
 
   Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
 
-  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
-  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
-  if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
-if (A->getOption().matches(options::OPT_fwrapv))
-  CmdArgs.push_back("-fwrapv");
-  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
-  options::OPT_fno_strict_overflow)) {
-if (A->getOption().matches(options::OPT_fno_strict_overflow))
-  CmdArgs.push_back("-fwrapv");
-  }
+  // Handle -f[no-]wrapv and -f[no-]strict-overflow, which are used by both
+  // clang and flang.
+  renderCommonIntegerOverflowOptions(Args, CmdArgs);
 
   Args.AddLastArg(CmdArgs, options::OPT_ffinite_loops,
   options::OPT_fno_finite_loops);
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index e662c3f0d2fa8f..91605a67a37fc0

[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-18 Thread Yusuke MINATO via cfe-commits

yus3710-fj wrote:

CI failed again, but the test mentioned above was passed this time. So, I think 
I can merge this.

https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-18 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj closed 
https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-17 Thread Yusuke MINATO via cfe-commits

yus3710-fj wrote:

CI failed due to `ClangdTests/25/79` (`DynamicIndexIncludeInsertion` in 
CodeCompleteTests.cpp?). It's weird because there is no functional change on 
clang (and clangd). In addition, I can't reproduce this on my machine.
I'll try re-running CI with an empty commit.

https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-17 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj updated 
https://github.com/llvm/llvm-project/pull/110061

>From 6215099ca7da009e98eca138590f78a5e524a1e9 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 18 Sep 2024 21:12:43 +0900
Subject: [PATCH 1/2] [flang][Driver] Add support for -f[no-]wrapv and
 -f[no]-strict-overflow in the frontend

This patch introduces the options for integer overflow flags into Flang.
---
 clang/include/clang/Driver/Options.td | 11 +++---
 clang/lib/Driver/ToolChains/Clang.cpp | 13 ++-
 clang/lib/Driver/ToolChains/CommonArgs.cpp| 14 
 clang/lib/Driver/ToolChains/CommonArgs.h  |  3 ++
 clang/lib/Driver/ToolChains/Flang.cpp |  2 ++
 flang/include/flang/Common/LangOptions.def|  2 ++
 flang/include/flang/Common/LangOptions.h  |  8 +
 flang/include/flang/Lower/LoweringOptions.def |  5 ++-
 flang/lib/Frontend/CompilerInvocation.cpp | 36 +--
 flang/test/Driver/frontend-forwarding.f90 |  2 ++
 flang/test/Driver/integer-overflow.f90| 10 ++
 11 files changed, 86 insertions(+), 20 deletions(-)
 create mode 100644 flang/test/Driver/integer-overflow.f90

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 379e75b197cf96..c15b1fdfbbd3e2 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -3454,7 +3454,8 @@ def fno_strict_aliasing : Flag<["-"], 
"fno-strict-aliasing">, Group,
 def fstruct_path_tbaa : Flag<["-"], "fstruct-path-tbaa">, Group;
 def fno_struct_path_tbaa : Flag<["-"], "fno-struct-path-tbaa">, Group;
 def fno_strict_enums : Flag<["-"], "fno-strict-enums">, Group;
-def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group;
+def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fno_pointer_tbaa : Flag<["-"], "fno-pointer-tbaa">, Group;
 def fno_temp_file : Flag<["-"], "fno-temp-file">, Group,
   Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>, HelpText<
@@ -3470,7 +3471,8 @@ def fno_verbose_asm : Flag<["-"], "fno-verbose-asm">, 
Group,
   Visibility<[ClangOption, CC1Option]>,
   MarshallingInfoNegativeFlag>;
 def fno_working_directory : Flag<["-"], "fno-working-directory">, 
Group;
-def fno_wrapv : Flag<["-"], "fno-wrapv">, Group;
+def fno_wrapv : Flag<["-"], "fno-wrapv">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fobjc_arc : Flag<["-"], "fobjc-arc">, Group,
   Visibility<[ClangOption, CC1Option]>,
   HelpText<"Synthesize retain and release calls for Objective-C pointers">;
@@ -3966,7 +3968,8 @@ defm strict_vtable_pointers : 
BoolFOption<"strict-vtable-pointers",
   "Enable optimizations based on the strict rules for"
 " overwriting polymorphic C++ objects">,
   NegFlag>;
-def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group;
+def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fpointer_tbaa : Flag<["-"], "fpointer-tbaa">, Group;
 def fdriver_only : Flag<["-"], "fdriver-only">, Flags<[NoXarchOption]>,
   Visibility<[ClangOption, CLOption, DXCOption]>,
@@ -4235,7 +4238,7 @@ defm virtual_function_elimination : 
BoolFOption<"virtual-function-elimination",
   NegFlag, BothFlags<[], [ClangOption, CLOption]>>;
 
 def fwrapv : Flag<["-"], "fwrapv">, Group,
-  Visibility<[ClangOption, CC1Option]>,
+  Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
   HelpText<"Treat signed integer overflow as two's complement">;
 def fwritable_strings : Flag<["-"], "fwritable-strings">, Group,
   Visibility<[ClangOption, CC1Option]>,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 3fc39296f44281..905b9b4983c1df 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -6914,16 +6914,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
 
   Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
 
-  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
-  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
-  if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
-if (A->getOption().matches(options::OPT_fwrapv))
-  CmdArgs.push_back("-fwrapv");
-  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
-  options::OPT_fno_strict_overflow)) {
-if (A->getOption().matches(options::OPT_fno_strict_overflow))
-  CmdArgs.push_back("-fwrapv");
-  }
+  // Handle -f[no-]wrapv and -f[no-]strict-overflow, which are used by both
+  // clang and flang.
+  renderCommonIntegerOverflowOptions(Args, CmdArgs);
 
   Args.AddLastArg(CmdArgs, options::OPT_ffinite_loops,
   options::OPT_fno_finite_loops);
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index e662c3f0d2fa8f..91605a67a3

[clang] [flang] [flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv (PR #110063)

2024-10-24 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj closed 
https://github.com/llvm/llvm-project/pull/110063
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv (PR #110063)

2024-10-29 Thread Yusuke MINATO via cfe-commits

yus3710-fj wrote:

> @yus3710-fj after this patch we get a 7-10% slowdown for 503.bwaves_r from 
> SPEC2017. I built with `-Ofast -mcpu=native -fuse-ld=lld -flto`

@tblah I'm attempting to reproduce the performance issue on my Grace machine, 
but have not yet been successful. Could you please provide the measurement 
conditions?

https://github.com/llvm/llvm-project/pull/110063
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] Revert "[flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv" (PR #113901)

2024-10-28 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj created 
https://github.com/llvm/llvm-project/pull/113901

Reverts llvm/llvm-project#110063 due to the performance regression on 
503.bwaves_r in SPEC2017.

>From 2f315eb090ec08e193acbc59127b958efa93fd35 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Mon, 28 Oct 2024 21:45:39 +0900
Subject: [PATCH] =?UTF-8?q?Revert=20"[flang]=20Integrate=20the=20option=20?=
 =?UTF-8?q?-flang-experimental-integer-overflow=20int=E2=80=A6"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This reverts commit 96bb375f5cedcfcc5dcd96296ba54ff933b39d4d.
---
 clang/include/clang/Driver/Options.td |   4 +
 clang/lib/Driver/ToolChains/Flang.cpp |   1 +
 flang/include/flang/Lower/LoweringOptions.def |   5 +
 .../flang/Optimizer/Transforms/Passes.h   |   4 +-
 .../flang/Optimizer/Transforms/Passes.td  |   2 +-
 flang/include/flang/Tools/CrossToolHelpers.h  |   2 +-
 flang/lib/Frontend/CompilerInvocation.cpp |   6 +
 flang/lib/Frontend/FrontendActions.cpp|   4 +-
 flang/lib/Lower/Bridge.cpp|   2 +-
 flang/lib/Lower/IO.cpp|   2 +-
 flang/lib/Optimizer/Passes/Pipelines.cpp  |   6 +-
 .../Transforms/ControlFlowConverter.cpp   |   8 +-
 flang/test/Driver/frontend-forwarding.f90 |   2 +
 .../Fir/convert-to-llvm-openmp-and-fir.fir|  10 +-
 flang/test/Fir/loop01.fir | 230 +-
 flang/test/Fir/loop02.fir |   4 +-
 flang/test/Lower/HLFIR/goto-do-body.f90   |   4 +-
 .../OpenMP/parallel-private-clause-fixes.f90  |   4 +-
 ...oop-reduction-allocatable-array-minmax.f90 |   4 +-
 flang/test/Lower/OpenMP/wsloop-variable.f90   |   4 +-
 flang/test/Lower/array-character.f90  |   2 +-
 .../test/Lower/array-derived-assignments.f90  |   2 +-
 flang/test/Lower/array-derived.f90|   2 +-
 .../array-elemental-calls-char-byval.f90  |   2 +-
 .../test/Lower/array-elemental-calls-char.f90 |   2 +-
 .../Lower/array-expression-assumed-size.f90   |   2 +-
 flang/test/Lower/array-expression-slice-1.f90 |   2 +-
 flang/test/Lower/array-substring.f90  |  46 +++-
 flang/test/Lower/array-temp.f90   |   2 +-
 flang/test/Lower/components.f90   |   2 +-
 flang/test/Lower/do_loop.f90  |  73 --
 flang/test/Lower/do_loop_unstructured.f90 | 203 +++-
 flang/test/Lower/goto-do-body.f90 |   4 +-
 flang/test/Lower/host-associated.f90  |   2 +-
 flang/test/Lower/infinite_loop.f90|  41 +++-
 flang/test/Lower/io-implied-do-fixes.f90  |  49 +++-
 flang/test/Lower/loops2.f90   |   2 +-
 flang/test/Lower/mixed_loops.f90  |   6 +-
 flang/test/Lower/vector-subscript-io.f90  |  34 +--
 flang/tools/bbc/bbc.cpp   |   9 +-
 40 files changed, 676 insertions(+), 119 deletions(-)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 5df6ddd5e6a0c5..75b4607b1b2391 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -6787,6 +6787,10 @@ 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 366cadc2e54775..a9d2b7a4dc48f9 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -148,6 +148,7 @@ 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 0b22e54b648e94..231de533fbd30a 100644
--- a/flang/include/flang/Lower/LoweringOptions.def
+++ b/flang/include/flang/Lower/LoweringOptions.def
@@ -38,5 +38,10 @@ 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 va

[clang] [flang] [flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv (PR #110063)

2024-10-28 Thread Yusuke MINATO via cfe-commits

yus3710-fj wrote:

Thank you for the information, @tblah. I'll revert this.

> As I understood it, the previous patch was supposed to enable your 
> transformation by default, and this one was only supposed to clean up old 
> flags. Did I understand wrong?

This patch also enables some transformation by default. They would affect the 
performance. I apologize that I didn't check performance regression.

https://github.com/llvm/llvm-project/pull/110063
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv (PR #110063)

2024-10-24 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj edited 
https://github.com/llvm/llvm-project/pull/110063
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv (PR #110063)

2024-10-31 Thread Yusuke MINATO via cfe-commits

yus3710-fj wrote:

I confirmed the performance regression on both Graviton3 and Grace when the 
value of `copies` is set to 1.

The result of the measurement on Graviton3:
||max|min|avg|
|---|---|---|---|
|before this patch|52.56|52.44|52.518|
|after this patch|48.90 (-7.48%)|48.79 (-7.48%)|48.86 (-7.49%)|

The difference in optimization messages (`-Rpass=.*`):
* `zext` is used instead of `sext` after this patch.
* LICM is promoted by this patch.

I'm investigating why the performance gets worse even though the optimization 
is promoted.

https://github.com/llvm/llvm-project/pull/110063
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-09-25 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj created 
https://github.com/llvm/llvm-project/pull/110061

This patch introduces the options for integer overflow flags into Flang.
The behavior is similar to that of Clang.

>From d3a02bcea0cda96694b79c8b22812c29150c00b1 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 18 Sep 2024 21:12:43 +0900
Subject: [PATCH] [flang][Driver] Add support for -f[no-]wrapv and
 -f[no]-strict-overflow in the frontend

This patch introduces the options for integer overflow flags into Flang.
---
 clang/include/clang/Driver/Options.td | 11 +++---
 clang/lib/Driver/ToolChains/Flang.cpp | 11 ++
 flang/include/flang/Frontend/LangOptions.def  |  2 ++
 flang/include/flang/Frontend/LangOptions.h|  8 +
 flang/include/flang/Lower/LoweringOptions.def |  4 +++
 flang/lib/Frontend/CompilerInvocation.cpp | 36 +--
 flang/test/Driver/integer-overflow.f90| 10 ++
 7 files changed, 75 insertions(+), 7 deletions(-)
 create mode 100644 flang/test/Driver/integer-overflow.f90

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 23bd686a85f526..8dfac9088ac7e1 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -3440,7 +3440,8 @@ def fno_strict_aliasing : Flag<["-"], 
"fno-strict-aliasing">, Group,
 def fstruct_path_tbaa : Flag<["-"], "fstruct-path-tbaa">, Group;
 def fno_struct_path_tbaa : Flag<["-"], "fno-struct-path-tbaa">, Group;
 def fno_strict_enums : Flag<["-"], "fno-strict-enums">, Group;
-def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group;
+def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fno_pointer_tbaa : Flag<["-"], "fno-pointer-tbaa">, Group;
 def fno_temp_file : Flag<["-"], "fno-temp-file">, Group,
   Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>, HelpText<
@@ -3456,7 +3457,8 @@ def fno_verbose_asm : Flag<["-"], "fno-verbose-asm">, 
Group,
   Visibility<[ClangOption, CC1Option]>,
   MarshallingInfoNegativeFlag>;
 def fno_working_directory : Flag<["-"], "fno-working-directory">, 
Group;
-def fno_wrapv : Flag<["-"], "fno-wrapv">, Group;
+def fno_wrapv : Flag<["-"], "fno-wrapv">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fobjc_arc : Flag<["-"], "fobjc-arc">, Group,
   Visibility<[ClangOption, CC1Option]>,
   HelpText<"Synthesize retain and release calls for Objective-C pointers">;
@@ -3952,7 +3954,8 @@ defm strict_vtable_pointers : 
BoolFOption<"strict-vtable-pointers",
   "Enable optimizations based on the strict rules for"
 " overwriting polymorphic C++ objects">,
   NegFlag>;
-def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group;
+def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fpointer_tbaa : Flag<["-"], "fpointer-tbaa">, Group;
 def fdriver_only : Flag<["-"], "fdriver-only">, Flags<[NoXarchOption]>,
   Visibility<[ClangOption, CLOption, DXCOption]>,
@@ -4221,7 +4224,7 @@ defm virtual_function_elimination : 
BoolFOption<"virtual-function-elimination",
   NegFlag, BothFlags<[], [ClangOption, CLOption]>>;
 
 def fwrapv : Flag<["-"], "fwrapv">, Group,
-  Visibility<[ClangOption, CC1Option]>,
+  Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
   HelpText<"Treat signed integer overflow as two's complement">;
 def fwritable_strings : Flag<["-"], "fwritable-strings">, Group,
   Visibility<[ClangOption, CC1Option]>,
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 6ce79d27e98c48..0205749407b3df 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -872,6 +872,17 @@ void Flang::ConstructJob(Compilation &C, const JobAction 
&JA,
 }
   }
 
+  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
+  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
+  if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
+if (A->getOption().matches(options::OPT_fwrapv))
+  CmdArgs.push_back("-fwrapv");
+  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
+  options::OPT_fno_strict_overflow)) {
+if (A->getOption().matches(options::OPT_fno_strict_overflow))
+  CmdArgs.push_back("-fwrapv");
+  }
+
   assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");
   if (Output.isFilename()) {
 CmdArgs.push_back("-o");
diff --git a/flang/include/flang/Frontend/LangOptions.def 
b/flang/include/flang/Frontend/LangOptions.def
index d3e1e972d1519f..1bfdba9cc2c1c7 100644
--- a/flang/include/flang/Frontend/LangOptions.def
+++ b/flang/include/flang/Frontend/LangOptions.def
@@ -20,6 +20,8 @@ LANGOPT(Name, Bits, Default)
 #endif
 
 ENUM_LANGOPT(FPContractMode, FPModeKind, 2, FPM_Fast) ///< FP Contract Mode 
(off/fast)
+/// signed integer overflow h

[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-02 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj ready_for_review 
https://github.com/llvm/llvm-project/pull/110061
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [flang] [flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (PR #110061)

2024-10-02 Thread Yusuke MINATO via cfe-commits

https://github.com/yus3710-fj updated 
https://github.com/llvm/llvm-project/pull/110061

>From aea2cfa4b1d812dc84cb1609f93cc2ec2bcd33b4 Mon Sep 17 00:00:00 2001
From: Yusuke MINATO 
Date: Wed, 18 Sep 2024 21:12:43 +0900
Subject: [PATCH] [flang][Driver] Add support for -f[no-]wrapv and
 -f[no]-strict-overflow in the frontend

This patch introduces the options for integer overflow flags into Flang.
---
 clang/include/clang/Driver/Options.td | 11 +++---
 clang/lib/Driver/ToolChains/Flang.cpp | 11 ++
 flang/include/flang/Common/LangOptions.def|  2 ++
 flang/include/flang/Common/LangOptions.h  |  8 +
 flang/include/flang/Lower/LoweringOptions.def |  5 ++-
 flang/lib/Frontend/CompilerInvocation.cpp | 36 +--
 flang/test/Driver/frontend-forwarding.f90 |  2 ++
 flang/test/Driver/integer-overflow.f90| 10 ++
 8 files changed, 75 insertions(+), 10 deletions(-)
 create mode 100644 flang/test/Driver/integer-overflow.f90

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 9d183ff2d69b3c..4610cd917f685d 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -3451,7 +3451,8 @@ def fno_strict_aliasing : Flag<["-"], 
"fno-strict-aliasing">, Group,
 def fstruct_path_tbaa : Flag<["-"], "fstruct-path-tbaa">, Group;
 def fno_struct_path_tbaa : Flag<["-"], "fno-struct-path-tbaa">, Group;
 def fno_strict_enums : Flag<["-"], "fno-strict-enums">, Group;
-def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group;
+def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fno_pointer_tbaa : Flag<["-"], "fno-pointer-tbaa">, Group;
 def fno_temp_file : Flag<["-"], "fno-temp-file">, Group,
   Visibility<[ClangOption, CC1Option, CLOption, DXCOption]>, HelpText<
@@ -3467,7 +3468,8 @@ def fno_verbose_asm : Flag<["-"], "fno-verbose-asm">, 
Group,
   Visibility<[ClangOption, CC1Option]>,
   MarshallingInfoNegativeFlag>;
 def fno_working_directory : Flag<["-"], "fno-working-directory">, 
Group;
-def fno_wrapv : Flag<["-"], "fno-wrapv">, Group;
+def fno_wrapv : Flag<["-"], "fno-wrapv">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fobjc_arc : Flag<["-"], "fobjc-arc">, Group,
   Visibility<[ClangOption, CC1Option]>,
   HelpText<"Synthesize retain and release calls for Objective-C pointers">;
@@ -3963,7 +3965,8 @@ defm strict_vtable_pointers : 
BoolFOption<"strict-vtable-pointers",
   "Enable optimizations based on the strict rules for"
 " overwriting polymorphic C++ objects">,
   NegFlag>;
-def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group;
+def fstrict_overflow : Flag<["-"], "fstrict-overflow">, Group,
+  Visibility<[ClangOption, FlangOption]>;
 def fpointer_tbaa : Flag<["-"], "fpointer-tbaa">, Group;
 def fdriver_only : Flag<["-"], "fdriver-only">, Flags<[NoXarchOption]>,
   Visibility<[ClangOption, CLOption, DXCOption]>,
@@ -4232,7 +4235,7 @@ defm virtual_function_elimination : 
BoolFOption<"virtual-function-elimination",
   NegFlag, BothFlags<[], [ClangOption, CLOption]>>;
 
 def fwrapv : Flag<["-"], "fwrapv">, Group,
-  Visibility<[ClangOption, CC1Option]>,
+  Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
   HelpText<"Treat signed integer overflow as two's complement">;
 def fwritable_strings : Flag<["-"], "fwritable-strings">, Group,
   Visibility<[ClangOption, CC1Option]>,
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 98350690f8d20e..1865fd57a2d893 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -866,6 +866,17 @@ void Flang::ConstructJob(Compilation &C, const JobAction 
&JA,
 }
   }
 
+  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
+  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
+  if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
+if (A->getOption().matches(options::OPT_fwrapv))
+  CmdArgs.push_back("-fwrapv");
+  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
+  options::OPT_fno_strict_overflow)) {
+if (A->getOption().matches(options::OPT_fno_strict_overflow))
+  CmdArgs.push_back("-fwrapv");
+  }
+
   assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");
   if (Output.isFilename()) {
 CmdArgs.push_back("-o");
diff --git a/flang/include/flang/Common/LangOptions.def 
b/flang/include/flang/Common/LangOptions.def
index d3e1e972d1519f..1bfdba9cc2c1c7 100644
--- a/flang/include/flang/Common/LangOptions.def
+++ b/flang/include/flang/Common/LangOptions.def
@@ -20,6 +20,8 @@ LANGOPT(Name, Bits, Default)
 #endif
 
 ENUM_LANGOPT(FPContractMode, FPModeKind, 2, FPM_Fast) ///< FP Contract Mode 
(off/fast)
+/// signed integer overflow handling
+ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehavior

[clang] [flang] Reland "[flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv" (PR #118933)

2024-12-05 Thread Yusuke MINATO via cfe-commits

yus3710-fj wrote:

Please note that there is a (non-functional) change from the previous patch: 
2e6180ed4799230c5e25f85a7c633ff42f3d78ae

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


[clang] [flang] [flang] Integrate the option -flang-experimental-integer-overflow into -fno-wrapv (PR #110063)

2024-12-05 Thread Yusuke MINATO via cfe-commits

yus3710-fj wrote:

Thank you for the informantion, @tblah. I also confirmed that the regression 
doesn't happen after fbd89bcc6647ed611e579d8f9c38c97b8e6f7936. 
I'm a little concerned that the regression still occurs when LTO is diabled. 
However, I'd like to reland this patch because this isn't the root cause of the 
issue.

https://github.com/llvm/llvm-project/pull/110063
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits