From 353bd1981da4352b642d09e66cc4c27551c098d7 Mon Sep 17 00:00:00 2001 From: gshaowei6 Date: Sat, 16 May 2026 15:36:24 +0800 Subject: [PATCH] Fix unused local scope codegen --- .../aparapi/internal/writer/BlockWriter.java | 24 +++++++++------ .../aparapi/codegen/test/ArbitraryScope.java | 2 +- .../codegen/test/ArbitraryScopeTest.java | 5 +--- .../aparapi/codegen/test/NonNullCheck.java | 2 +- .../codegen/test/NonNullCheckTest.java | 30 ++++++++++++++++--- 5 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/aparapi/internal/writer/BlockWriter.java b/src/main/java/com/aparapi/internal/writer/BlockWriter.java index 013239d0..967ba4e0 100644 --- a/src/main/java/com/aparapi/internal/writer/BlockWriter.java +++ b/src/main/java/com/aparapi/internal/writer/BlockWriter.java @@ -420,17 +420,23 @@ public void writeInstruction(Instruction _instruction) throws CodeGenException { write(localVariableInfo.getVariableName()); } } else { - if (assignToLocalVariable.isDeclaration()) { - final String descriptor = localVariableInfo.getVariableDescriptor(); - // Arrays always map to __global arrays - if (descriptor.startsWith("[")) { - write(" __global "); - } - write(convertType(descriptor, true, false)); - } if (localVariableInfo == null) { - throw new CodeGenException("outOfScope" + _instruction.getThisPC() + " = "); + // javac can omit LocalVariableTable entries for unused stores at the + // end of a scope. Preserve any RHS side effects but do not emit a + // synthetic local name that cannot be recovered from the bytecode. + for (Instruction operand = _instruction.getFirstChild(); operand != null; operand = operand.getNextExpr()) { + writeInstruction(operand); + } + return; } else { + if (assignToLocalVariable.isDeclaration()) { + final String descriptor = localVariableInfo.getVariableDescriptor(); + // Arrays always map to __global arrays + if (descriptor.startsWith("[")) { + write(" __global "); + } + write(convertType(descriptor, true, false)); + } write(localVariableInfo.getVariableName() + " = "); } } diff --git a/src/test/java/com/aparapi/codegen/test/ArbitraryScope.java b/src/test/java/com/aparapi/codegen/test/ArbitraryScope.java index 56fb6a6a..b11d85c2 100644 --- a/src/test/java/com/aparapi/codegen/test/ArbitraryScope.java +++ b/src/test/java/com/aparapi/codegen/test/ArbitraryScope.java @@ -109,7 +109,7 @@ __kernel void run( count--; } } - int value = (256 * count) / this->maxIterations; + (256 * count) / this->maxIterations; } float scaleSquare = 1.0f; return; diff --git a/src/test/java/com/aparapi/codegen/test/ArbitraryScopeTest.java b/src/test/java/com/aparapi/codegen/test/ArbitraryScopeTest.java index bbc299b8..f5e0a4c7 100644 --- a/src/test/java/com/aparapi/codegen/test/ArbitraryScopeTest.java +++ b/src/test/java/com/aparapi/codegen/test/ArbitraryScopeTest.java @@ -15,7 +15,6 @@ */ package com.aparapi.codegen.test; -import org.junit.Ignore; import org.junit.Test; public class ArbitraryScopeTest extends com.aparapi.codegen.CodeGenJUnitBase { @@ -68,7 +67,7 @@ public class ArbitraryScopeTest extends com.aparapi.codegen.CodeGenJUnitBase { + " count--;\n" + " }\n" + " }\n" - + " int value = (256 * count) / this->maxIterations;\n" + + " (256 * count) / this->maxIterations;\n" + " }\n" + " float scaleSquare = 1.0f;\n" + " return;\n" @@ -77,13 +76,11 @@ public class ArbitraryScopeTest extends com.aparapi.codegen.CodeGenJUnitBase { + " "}; private static final Class expectedException = null; - @Ignore @Test public void ArbitraryScopeTest() { test(com.aparapi.codegen.test.ArbitraryScope.class, expectedException, expectedOpenCL); } - @Ignore @Test public void ArbitraryScopeTestWorksWithCaching() { test(com.aparapi.codegen.test.ArbitraryScope.class, expectedException, expectedOpenCL); diff --git a/src/test/java/com/aparapi/codegen/test/NonNullCheck.java b/src/test/java/com/aparapi/codegen/test/NonNullCheck.java index aa96eb27..3a71f76e 100644 --- a/src/test/java/com/aparapi/codegen/test/NonNullCheck.java +++ b/src/test/java/com/aparapi/codegen/test/NonNullCheck.java @@ -44,7 +44,7 @@ __kernel void run( this->passid = passid; { if (this->ints != NULL){ - int value = this->ints[0]; + this->ints[0]; } return; } diff --git a/src/test/java/com/aparapi/codegen/test/NonNullCheckTest.java b/src/test/java/com/aparapi/codegen/test/NonNullCheckTest.java index c43708d3..2355c170 100644 --- a/src/test/java/com/aparapi/codegen/test/NonNullCheckTest.java +++ b/src/test/java/com/aparapi/codegen/test/NonNullCheckTest.java @@ -15,14 +15,36 @@ */ package com.aparapi.codegen.test; -import com.aparapi.internal.exception.CodeGenException; -import org.junit.Ignore; import org.junit.Test; public class NonNullCheckTest extends com.aparapi.codegen.CodeGenJUnitBase { - private static final String[] expectedOpenCL = null; - private static final Class expectedException = CodeGenException.class; + private static final String[] expectedOpenCL = { + "typedef struct This_s{\n" + + " __global int *ints;\n" + + " int passid;\n" + + " }This;\n" + + " int get_pass_id(This *this){\n" + + " return this->passid;\n" + + " }\n" + + "\n" + + " __kernel void run(\n" + + " __global int *ints,\n" + + " int passid\n" + + " ){\n" + + " This thisStruct;\n" + + " This* this=&thisStruct;\n" + + " this->ints = ints;\n" + + " this->passid = passid;\n" + + " {\n" + + " if (this->ints != NULL){\n" + + " this->ints[0];\n" + + " }\n" + + " return;\n" + + " }\n" + + " }\n" + + " "}; + private static final Class expectedException = null; @Test public void NonNullCheckTest() {