[vm/aot] Support optimization of bitwise not.

Improves performance of MD5 by 3X on ARM32.

Cq-Include-Trybots: luci.dart.try:vm-kernel-optcounter-threshold-linux-release-x64-try, vm-kernel-precomp-linux-debug-x64-try, vm-kernel-precomp-linux-release-simarm-try, vm-kernel-precomp-linux-release-simarm64-try, vm-kernel-precomp-linux-release-x64-try, vm-kernel-precomp-mac-release-simarm64-try, vm-kernel-precomp-win-release-x64-try
Change-Id: I235fece1d6adfb15ce8c3beed6ffb6ee3e753de7
Reviewed-on: https://dart-review.googlesource.com/c/88709
Commit-Queue: Samir Jindel <sjindel@google.com>
Auto-Submit: Samir Jindel <sjindel@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index e919c17..1e6a8b3 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -550,14 +550,13 @@
       return false;
     }
 
-    // Issue http://dartbug.com/35180 for adding support for Token::kBIT_NOT
-    // here.
 #ifndef TARGET_ARCH_DBC
-    if (op_kind == Token::kNEGATE) {
-      left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
-      replacement =
-          new (Z) UnaryInt64OpInstr(Token::kNEGATE, left_value, DeoptId::kNone,
-                                    Instruction::kNotSpeculative);
+    if (FlowGraphCompiler::SupportsUnboxedInt64()) {
+      if (op_kind == Token::kNEGATE || op_kind == Token::kBIT_NOT) {
+        left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
+        replacement = new (Z) UnaryInt64OpInstr(
+            op_kind, left_value, DeoptId::kNone, Instruction::kNotSpeculative);
+      }
     }
 #endif
   }