Browse Source

Scalarize aggregates before loop unroll to enable mem2reg (#1417)

* Scalarize aggregates to enable mem2reg

* Accomodate CR comments
Vishal Sharma 7 năm trước cách đây
mục cha
commit
68c0437c71

+ 2 - 0
lib/HLSL/DxilLegalizeSampleOffsetPass.cpp

@@ -153,6 +153,8 @@ void DxilLegalizeSampleOffsetPass::FinalCheck(
 void DxilLegalizeSampleOffsetPass::TryUnrollLoop(
 void DxilLegalizeSampleOffsetPass::TryUnrollLoop(
     std::vector<Instruction *> &illegalOffsets, Function &F) {
     std::vector<Instruction *> &illegalOffsets, Function &F) {
   legacy::FunctionPassManager PM(F.getParent());
   legacy::FunctionPassManager PM(F.getParent());
+  // Scalarize aggregates as mem2reg only applies on scalars.
+  PM.add(createSROAPass());
   // Always need mem2reg for simplify illegal offsets.
   // Always need mem2reg for simplify illegal offsets.
   PM.add(createPromoteMemoryToRegisterPass());
   PM.add(createPromoteMemoryToRegisterPass());
 
 

+ 12 - 0
tools/clang/test/CodeGenHLSL/quick-test/sample-offset-imm-test01.hlsl

@@ -0,0 +1,12 @@
+// RUN: %dxc /O0 /Tps_6_0 /Emain > %s | FileCheck %s
+// CHECK: define void @main()
+// CHECK: entry
+Texture2D g_Tex;
+SamplerState g_Sampler;
+void unused() { }
+float4 main(float4 pos : SV_Position, float4 user : USER, bool b : B) : SV_Target {
+	unused();
+	int2 offset = int2(0,-1);
+	if (b) user = g_Tex.SampleLevel(g_Sampler, pos.xy, 0.0, offset.xy);
+	return user * pos;
+}

+ 14 - 0
tools/clang/test/CodeGenHLSL/quick-test/sample-offset-imm-test02.hlsl

@@ -0,0 +1,14 @@
+// RUN: %dxc /O0 /Tps_6_0 /Emain > %s | FileCheck %s
+// CHECK: define void @main()
+// CHECK: entry
+Texture2D g_Tex;
+SamplerState g_Sampler;
+void unused() { }
+float4 main(float4 pos : SV_Position, float4 user : USER, bool b : B) : SV_Target {
+	unused();
+	int2 offset = int2(0,-1);
+	float4 g_Buffer = {-1.0, 1.0, -2.0, 2.0};
+	float4 shift = float4(g_Buffer[offset.x], g_Buffer[offset.x], g_Buffer[offset.x], g_Buffer[offset.y]);
+	if (b) user = g_Tex.SampleLevel(g_Sampler, pos.xy, 0.0, offset.xy);
+	return user * (pos * shift);
+}

+ 18 - 0
tools/clang/test/CodeGenHLSL/quick-test/sample-offset-imm-test03.hlsl

@@ -0,0 +1,18 @@
+// RUN: %dxc /O0 /Od /Tps_6_0 /Emain > %s | FileCheck %s
+// CHECK: define void @main()
+// CHECK: entry
+Texture2D g_Tex;
+SamplerState g_Sampler;
+void unused() { }
+float4 main(float4 pos : SV_Position, float4 user : USER, bool b : B) : SV_Target {
+	unused();
+	int2 offset = int2(0,1);
+	float2x4 g_Buffer =
+	{
+	-1.0, 1.0, -2.0, 2.0,
+	-1.0, -1.0, 2.0, -2.0,
+	};
+	float4 shift = float4(g_Buffer[offset.x][offset.x], g_Buffer[offset.y][offset.x], g_Buffer[offset.x][offset.y], g_Buffer[offset.y][offset.y]);
+	if (b) user = g_Tex.SampleLevel(g_Sampler, pos.xy, 0.0, offset.xy);
+	return user * (pos * shift);
+}

+ 12 - 0
tools/clang/test/CodeGenHLSL/quick-test/sample-offset-imm-test04.hlsl

@@ -0,0 +1,12 @@
+// RUN: %dxc /O0 /Od /Tps_6_0 /Emain > %s | FileCheck %s
+// CHECK: define void @main()
+// CHECK: entry
+Texture2D g_Tex;
+SamplerState g_Sampler;
+void unused() { }
+float4 main(float4 pos : SV_Position, float4 user : USER, bool b : B) : SV_Target {
+	unused();
+	int2 offset[2] = { int2(0,1), int2(1,0) };
+	if (b) user = g_Tex.SampleLevel(g_Sampler, pos.xy, 0.0, int2(offset[1].x, offset[0].y));
+	return user * pos;
+}