From 305a0390702aea37efe89d2c13bb4d5e32b31608 Mon Sep 17 00:00:00 2001
From: Gary Frost <frost.gary@gmail.com>
Date: Mon, 3 Sep 2012 16:41:30 +0000
Subject: [PATCH]

---
 .../src/java/com/amd/aparapi/BlockWriter.java | 21 +++++++++-
 .../com/amd/aparapi/test/NonNullCheck.java    | 37 ++++++++++++++++++
 .../java/com/amd/aparapi/test/NullCheck.java  | 38 +++++++++++++++++++
 3 files changed, 95 insertions(+), 1 deletion(-)
 create mode 100644 test/codegen/src/java/com/amd/aparapi/test/NonNullCheck.java
 create mode 100644 test/codegen/src/java/com/amd/aparapi/test/NullCheck.java

diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java b/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java
index 7a9a63d3..6ca9d5b1 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java
@@ -75,6 +75,8 @@ import com.amd.aparapi.InstructionSet.I_IINC;
 import com.amd.aparapi.InstructionSet.I_POP;
 import com.amd.aparapi.InstructionSet.If;
 import com.amd.aparapi.InstructionSet.IfUnary;
+import com.amd.aparapi.InstructionSet.I_IFNULL;
+import com.amd.aparapi.InstructionSet.I_IFNONNULL;
 import com.amd.aparapi.InstructionSet.IncrementInstruction;
 import com.amd.aparapi.InstructionSet.InlineAssignInstruction;
 import com.amd.aparapi.InstructionSet.MethodCall;
@@ -127,7 +129,25 @@ abstract class BlockWriter{
          writeInstruction(iff.getLhs());
          write(_branch16.getOperator().getText(_invert));
          writeInstruction(iff.getRhs());
+      } else if (_branch16 instanceof I_IFNULL) {
+         I_IFNULL iff = (I_IFNULL) _branch16;
+         writeInstruction(iff.getFirstChild());
 
+         if (_invert) {
+            write(" != NULL");
+         } else {
+            write(" == NULL");
+         }
+
+      } else if (_branch16 instanceof I_IFNONNULL) {
+         I_IFNONNULL iff = (I_IFNONNULL) _branch16;
+         writeInstruction(iff.getFirstChild());
+
+         if (_invert) {
+            write(" == NULL");
+         } else {
+            write(" != NULL");
+         }
       } else if (_branch16 instanceof IfUnary) {
          IfUnary branch16 = (IfUnary) _branch16;
          Instruction comparison = branch16.getUnary();
@@ -154,7 +174,6 @@ abstract class BlockWriter{
          }
 
       }
-
    }
 
    protected void writeComposite(CompositeInstruction instruction) throws CodeGenException {
diff --git a/test/codegen/src/java/com/amd/aparapi/test/NonNullCheck.java b/test/codegen/src/java/com/amd/aparapi/test/NonNullCheck.java
new file mode 100644
index 00000000..5c6580fe
--- /dev/null
+++ b/test/codegen/src/java/com/amd/aparapi/test/NonNullCheck.java
@@ -0,0 +1,37 @@
+package com.amd.aparapi.test;
+
+public class NonNullCheck{
+   int[] ints = new int[1024];
+
+   public void run() {
+      if (ints != null){
+         int value = ints[0];
+      }
+    
+   }
+}
+/**{OpenCL{
+typedef struct This_s{
+   __global int *ints;
+    int passid;
+}This;
+int get_pass_id(This *this){
+   return this->passid;
+}
+
+__kernel void run(
+   __global int *ints,
+   int passid
+){
+   This thisStruct;
+   This* this=&thisStruct;
+   this->ints = ints;
+   this->passid = passid;
+   {
+      if (this->ints != NULL){
+         int value = this->ints[0];
+      }
+      return;
+   }
+}
+}OpenCL}**/
diff --git a/test/codegen/src/java/com/amd/aparapi/test/NullCheck.java b/test/codegen/src/java/com/amd/aparapi/test/NullCheck.java
new file mode 100644
index 00000000..319815a1
--- /dev/null
+++ b/test/codegen/src/java/com/amd/aparapi/test/NullCheck.java
@@ -0,0 +1,38 @@
+package com.amd.aparapi.test;
+
+public class NullCheck{
+   int[] ints = new int[1024];
+
+   public void run() {
+      if (ints == null){
+         return;
+      }
+      int value = ints[0];
+   }
+}
+/**{OpenCL{
+typedef struct This_s{
+   __global int *ints;
+    int passid;
+}This;
+int get_pass_id(This *this){
+   return this->passid;
+}
+
+__kernel void run(
+   __global int *ints,
+   int passid
+){
+   This thisStruct;
+   This* this=&thisStruct;
+   this->ints = ints;
+   this->passid = passid;
+   {
+      if (this->ints == NULL){
+         return;
+      }
+      int value = this->ints[0];
+      return;
+   }
+}
+}OpenCL}**/
-- 
GitLab