D3D12: Enable Integer Range Analysis behind a toggle

With this CL the performance of dawn_perf_tests
"ShaderRobustnessPerf" with integer range analysis enabled will be
on par with the one with robustness disabled on D3D12.

Bug: 348701956
Change-Id: I6873801f5ff4f3382fb52ef0a3c10049612f8055
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/242976
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/dawn/native/Toggles.cpp b/src/dawn/native/Toggles.cpp
index cb5f5aa..218dc1f 100644
--- a/src/dawn/native/Toggles.cpp
+++ b/src/dawn/native/Toggles.cpp
@@ -647,6 +647,11 @@
       "Adds a small amount of work to empty render passes which perform a resolve. This toggle is "
       "enabled by default on Qualcomm GPUs, where it is needed to force the resolve to complete.",
       "https://crbug.com/411656647", ToggleStage::Device}},
+    {Toggle::EnableIntegerRangeAnalysisInRobustness,
+     {"enable_integer_range_analysis_in_robustness",
+      "Compute the range of the index with Integer Range Analysis in the robustness transform and "
+      "skip doing index clamping when the out of bound access cannot happen.",
+      "https://crbug.com/348701956", ToggleStage::Device}},
     {Toggle::NoWorkaroundSampleMaskBecomesZeroForAllButLastColorTarget,
      {"no_workaround_sample_mask_becomes_zero_for_all_but_last_color_target",
       "MacOS 12.0+ Intel has a bug where the sample mask is only applied for the last color "
diff --git a/src/dawn/native/Toggles.h b/src/dawn/native/Toggles.h
index 92ac359..de32833 100644
--- a/src/dawn/native/Toggles.h
+++ b/src/dawn/native/Toggles.h
@@ -153,6 +153,7 @@
     UseVulkanMemoryModel,
     VulkanScalarizeClampBuiltin,
     VulkanAddWorkToEmptyResolvePass,
+    EnableIntegerRangeAnalysisInRobustness,
 
     // Unresolved issues.
     NoWorkaroundSampleMaskBecomesZeroForAllButLastColorTarget,
diff --git a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
index 74c5f66..ca4b0d6 100644
--- a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
+++ b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
@@ -376,6 +376,8 @@
         device->IsToggleEnabled(Toggle::DisablePolyfillsOnIntegerDivisonAndModulo);
     req.hlsl.tintOptions.polyfill_pack_unpack_4x8 =
         device->IsToggleEnabled(Toggle::D3D12PolyFillPackUnpack4x8);
+    req.hlsl.tintOptions.enable_integer_range_analysis =
+        device->IsToggleEnabled(Toggle::EnableIntegerRangeAnalysisInRobustness);
 
     req.hlsl.limits = LimitsForCompilationRequest::Create(device->GetLimits().v1);
     req.hlsl.adapterSupportedLimits =
diff --git a/src/dawn/tests/perf_tests/ShaderRobustnessPerf.cpp b/src/dawn/tests/perf_tests/ShaderRobustnessPerf.cpp
index 9a65d75..495bb0a 100644
--- a/src/dawn/tests/perf_tests/ShaderRobustnessPerf.cpp
+++ b/src/dawn/tests/perf_tests/ShaderRobustnessPerf.cpp
@@ -594,19 +594,19 @@
     RunTest();
 }
 
-DAWN_INSTANTIATE_TEST_P(ShaderRobustnessPerf,
-                        {D3D12Backend(), D3D12Backend({"disable_robustness"}, {}), MetalBackend(),
-                         MetalBackend({"disable_robustness"}, {}), OpenGLBackend(),
-                         OpenGLBackend({"disable_robustness"}, {}), VulkanBackend(),
-                         VulkanBackend({"disable_robustness"}, {})},
-                        {MatMulMethod::MatMulFloatOneDimSharedArray,
-                         MatMulMethod::MatMulFloatTwoDimSharedArray,
-                         MatMulMethod::MatMulVec4OneDimSharedArray,
-                         MatMulMethod::MatMulVec4TwoDimSharedArray},
-                        {ElemType::F32, ElemType::F16},
-                        {512u},
-                        {512u},
-                        {512u});
+DAWN_INSTANTIATE_TEST_P(
+    ShaderRobustnessPerf,
+    {D3D12Backend({"use_tint_ir"}), D3D12Backend({"disable_robustness", "use_tint_ir"}, {}),
+     D3D12Backend({"enable_integer_range_analysis_in_robustness", "use_tint_ir"}, {}),
+     MetalBackend(), MetalBackend({"disable_robustness"}, {}), OpenGLBackend(),
+     OpenGLBackend({"disable_robustness"}, {}), VulkanBackend(),
+     VulkanBackend({"disable_robustness"}, {})},
+    {MatMulMethod::MatMulFloatOneDimSharedArray, MatMulMethod::MatMulFloatTwoDimSharedArray,
+     MatMulMethod::MatMulVec4OneDimSharedArray, MatMulMethod::MatMulVec4TwoDimSharedArray},
+    {ElemType::F32, ElemType::F16},
+    {512u},
+    {512u},
+    {512u});
 
 }  // anonymous namespace
 }  // namespace dawn
diff --git a/src/tint/lang/hlsl/writer/common/options.h b/src/tint/lang/hlsl/writer/common/options.h
index f080142..e41f6cf 100644
--- a/src/tint/lang/hlsl/writer/common/options.h
+++ b/src/tint/lang/hlsl/writer/common/options.h
@@ -215,6 +215,9 @@
     /// Set to `true` to disable software robustness that prevents out-of-bounds accesses.
     bool disable_robustness = false;
 
+    /// Set to `true` to enable integer range analysis in robustness transform.
+    bool enable_integer_range_analysis = false;
+
     /// Set to `true` to disable workgroup memory zero initialization
     bool disable_workgroup_init = false;
 
@@ -273,6 +276,7 @@
                  remapped_entry_point_name,
                  strip_all_names,
                  disable_robustness,
+                 enable_integer_range_analysis,
                  disable_workgroup_init,
                  truncate_interstage_variables,
                  polyfill_reflect_vec2_f32,
diff --git a/src/tint/lang/hlsl/writer/raise/raise.cc b/src/tint/lang/hlsl/writer/raise/raise.cc
index 6569374..c4d7c3b 100644
--- a/src/tint/lang/hlsl/writer/raise/raise.cc
+++ b/src/tint/lang/hlsl/writer/raise/raise.cc
@@ -173,6 +173,8 @@
         // means nothing gets written to memory.
         config.clamp_texture = false;
 
+        config.use_integer_range_analysis = options.enable_integer_range_analysis;
+
         RUN_TRANSFORM(core::ir::transform::Robustness, module, config);
     }
 
diff --git a/src/tint/lang/hlsl/writer/writer_fuzz.cc b/src/tint/lang/hlsl/writer/writer_fuzz.cc
index f645d55..4c670af 100644
--- a/src/tint/lang/hlsl/writer/writer_fuzz.cc
+++ b/src/tint/lang/hlsl/writer/writer_fuzz.cc
@@ -43,6 +43,7 @@
 struct FuzzedOptions {
     bool strip_all_names;
     bool disable_robustness;
+    bool enable_integer_range_analysis;
     bool disable_workgroup_init;
     bool polyfill_reflect_vec2_f32;
     bool polyfill_dot_4x8_packed;
@@ -54,6 +55,7 @@
     TINT_REFLECT(FuzzedOptions,
                  strip_all_names,
                  disable_robustness,
+                 enable_integer_range_analysis,
                  disable_workgroup_init,
                  polyfill_reflect_vec2_f32,
                  polyfill_dot_4x8_packed,
@@ -68,6 +70,7 @@
     Options options;
     options.strip_all_names = fuzzed_options.strip_all_names;
     options.disable_robustness = fuzzed_options.disable_robustness;
+    options.enable_integer_range_analysis = fuzzed_options.enable_integer_range_analysis;
     options.disable_workgroup_init = fuzzed_options.disable_workgroup_init;
     options.polyfill_reflect_vec2_f32 = fuzzed_options.polyfill_reflect_vec2_f32;
     options.polyfill_dot_4x8_packed = fuzzed_options.polyfill_dot_4x8_packed;