[flang] Speed up folding of LEN_TRIM()
authorPeter Klausler <pklausler@nvidia.com>
Mon, 10 Oct 2022 21:42:16 +0000 (14:42 -0700)
committerPeter Klausler <pklausler@nvidia.com>
Sat, 29 Oct 2022 20:26:42 +0000 (13:26 -0700)
LEN_TRIM's folding is currently based on VERIFY(), and it is kind of
slow for the very large CHARACTER arguments that can show up in artificial
test suites.  Rewrite in terms of single-character accesses.

Differential Revision: https://reviews.llvm.org/D136901

flang/lib/Evaluate/character.h

index f5464c7..7948726 100644 (file)
@@ -94,7 +94,13 @@ public:
   }
 
   static ConstantSubscript LEN_TRIM(const Character &str) {
-    return VERIFY(str, Character{' '}, true);
+    auto j{str.length()};
+    for (; j >= 1; --j) {
+      if (str[j - 1] != ' ') {
+        break;
+      }
+    }
+    return static_cast<ConstantSubscript>(j);
   }
 
   static Character REPEAT(const Character &str, ConstantSubscript ncopies) {