--- ./libgo/runtime/runtime.h.ORIGIN	2017-04-12 15:20:31 -0500
+++ ./libgo/runtime/runtime.h	2017-04-12 15:24:36 -0500
@@ -275,6 +275,11 @@
   __asm__ (GOSYM_PREFIX "runtime.goenvs_unix");
 void	runtime_throw(const char*) __attribute__ ((noreturn));
 void	runtime_panicstring(const char*) __attribute__ ((noreturn));
+#ifdef _AIX
+#define runtime_panic_nil(ptr) runtime_panicstring("Dereferencing <nil> pointer")
+#else
+#define runtime_panic_nil(ptr) ptr = NULL
+#endif
 bool	runtime_canpanic(G*);
 void	runtime_printf(const char*, ...);
 int32	runtime_snprintf(byte*, int32, const char*, ...);
--- ./libgo/go/runtime/internal/atomic/atomic.c.ORIGIN	2017-04-12 15:13:23 -0500
+++ ./libgo/go/runtime/internal/atomic/atomic.c	2017-04-12 15:27:06 -0500
@@ -34,7 +34,7 @@
 Load64 (uint64_t *ptr)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    runtime_panic_nil(ptr);
   return __atomic_load_n (ptr, __ATOMIC_ACQUIRE);
 }
 
@@ -66,7 +66,7 @@
 Loadint64 (int64_t *ptr)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    runtime_panic_nil(ptr);
   return __atomic_load_n (ptr, __ATOMIC_ACQUIRE);
 }
 
@@ -88,7 +88,7 @@
 Xadd64 (uint64_t *ptr, int64_t delta)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    runtime_panic_nil(ptr);
   return __atomic_add_fetch (ptr, (uint64_t) delta, __ATOMIC_SEQ_CST);
 }
 
@@ -110,7 +110,7 @@
 Xaddint64 (int64_t *ptr, int64_t delta)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    runtime_panic_nil(ptr);
   return __atomic_add_fetch (ptr, delta, __ATOMIC_SEQ_CST);
 }
 
@@ -132,7 +132,7 @@
 Xchg64 (uint64_t *ptr, uint64_t new)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    runtime_panic_nil(ptr);
   return __atomic_exchange_n (ptr, new, __ATOMIC_SEQ_CST);
 }
 
@@ -184,7 +184,7 @@
 Cas64 (uint64_t *ptr, uint64_t old, uint64_t new)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    runtime_panic_nil(ptr);
   return __atomic_compare_exchange_n (ptr, &old, new, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);
 }
 
@@ -226,7 +226,7 @@
 Store64 (uint64_t *ptr, uint64_t val)
 {
   if (((uintptr_t) ptr & 7) != 0)
-    ptr = NULL;
+    runtime_panic_nil(ptr);
   __atomic_store_n (ptr, val, __ATOMIC_SEQ_CST);
 }
 
--- ./libgo/go/sync/atomic/atomic.c.ORIGIN	2017-04-12 15:31:11 -0500
+++ ./libgo/go/sync/atomic/atomic.c	2017-04-12 15:32:04 -0500
@@ -26,7 +26,7 @@
 SwapInt64 (int64_t *addr, int64_t new)
 {
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    runtime_panic_nil(addr);
   return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
 }
 
@@ -48,7 +48,7 @@
 SwapUint64 (uint64_t *addr, uint64_t new)
 {
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    runtime_panic_nil(addr);
   return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
 }
 
@@ -90,7 +90,7 @@
 CompareAndSwapInt64 (int64_t *val, int64_t old, int64_t new)
 {
   if (((uintptr_t) val & 7) != 0)
-    val = NULL;
+    runtime_panic_nil(val);
   return __sync_bool_compare_and_swap (val, old, new);
 }
 
@@ -112,7 +112,7 @@
 CompareAndSwapUint64 (uint64_t *val, uint64_t old, uint64_t new)
 {
   if (((uintptr_t) val & 7) != 0)
-    val = NULL;
+    runtime_panic_nil(val);
   return __sync_bool_compare_and_swap (val, old, new);
 }
 
@@ -164,7 +164,7 @@
 AddInt64 (int64_t *val, int64_t delta)
 {
   if (((uintptr_t) val & 7) != 0)
-    val = NULL;
+    runtime_panic_nil(val);
   return __sync_add_and_fetch (val, delta);
 }
 
@@ -176,7 +176,7 @@
 AddUint64 (uint64_t *val, uint64_t delta)
 {
   if (((uintptr_t) val & 7) != 0)
-    val = NULL;
+    runtime_panic_nil(val);
   return __sync_add_and_fetch (val, delta);
 }
 
@@ -215,7 +215,7 @@
   int64_t v;
 
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    runtime_panic_nil(addr);
   v = *addr;
   while (! __sync_bool_compare_and_swap (addr, v, v))
     v = *addr;
@@ -247,7 +247,7 @@
   uint64_t v;
 
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    runtime_panic_nil(addr);
   v = *addr;
   while (! __sync_bool_compare_and_swap (addr, v, v))
     v = *addr;
@@ -308,7 +308,7 @@
   int64_t v;
 
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    runtime_panic_nil(addr);
   v = *addr;
   while (! __sync_bool_compare_and_swap (addr, v, val))
     v = *addr;
@@ -338,7 +338,7 @@
   uint64_t v;
 
   if (((uintptr_t) addr & 7) != 0)
-    addr = NULL;
+    runtime_panic_nil(addr);
   v = *addr;
   while (! __sync_bool_compare_and_swap (addr, v, val))
     v = *addr;
--- ./gcc/go/gofrontend/expressions.cc.orig	2017-01-27 09:08:23 -0600
+++ ./gcc/go/gofrontend/expressions.cc	2017-05-31 15:49:21 -0500
@@ -3784,6 +3796,7 @@
               go_assert(saw_errors());
               return Expression::make_error(this->location());
             }
+#ifndef _AIX
           if (s >= 4096 || this->issue_nil_check_)
             {
               Temporary_statement* temp =
@@ -3792,6 +3805,7 @@
               this->expr_ =
                   Expression::make_temporary_reference(temp, location);
             }
+#endif
         }
     }
 
@@ -4398,7 +4412,11 @@
                 go_assert(saw_errors());
                 return gogo->backend()->error_expression();
               }
+#ifndef _AIX
 	    if (s >= 4096 || this->issue_nil_check_)
+#else
+	    if (this->expr_->is_variable())
+#endif
 	      {
                 go_assert(this->expr_->is_variable());
                 Bexpression* nil =
