RFR: 8361494: [IR Framework] Escape too much in replacement of placeholder

Marc Chevalier mchevalier at openjdk.org
Thu Jul 10 14:24:21 UTC 2025


In `RawIRNode::regex`, the call to `String::replaceAll` doesn't quote the replace string.

Meaning that in the IR rule

@IR(failOn = {IRNode.ALLOC_OF, "\\w+"})

The interpreted `\w` is interpreted as a group reference, and we get

java.lang.IllegalArgumentException: Illegal group reference

so we should write instead

@IR(failOn = {IRNode.ALLOC_OF, "\\\\w+"})

To mean the interpreted string `\\w`, to mean an escaped single backslash. Same goes with `$` (used for nested classes).

Since we don't want to refer to groups (and anyway, there are not in `IRNode.IS_REPLACED`), we just quote the replacement string with `java.util.regex.Matcher.quoteReplacement` to make it more usable.

Note that you would still need to write `\$` since the `$` is the end of string regex, and needs to be escaped at the regex level (and not at the string, so it's not `$`, since `$` is not a special character). Before the fix, it should be `\\\$`. Phew! Regexes are bad enough, let's not escape them manually twice!

In `test/hotspot/jtreg/compiler/c2/TestMergeStores.java`, that makes us save 1344 backslashes.

Thanks,
Marc

-------------

Commit messages:
 - Fix test/hotspot/jtreg/compiler/c2/TestMergeStores.java
 - quoteReplacement

Changes: https://git.openjdk.org/jdk/pull/26243/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=26243&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8361494
  Stats: 238 lines in 3 files changed: 13 ins; 0 del; 225 mod
  Patch: https://git.openjdk.org/jdk/pull/26243.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/26243/head:pull/26243

PR: https://git.openjdk.org/jdk/pull/26243


More information about the hotspot-compiler-dev mailing list