diff --git a/gm/beziereffects.cpp b/gm/beziereffects.cpp
index f150b7c..f2e09b0 100644
--- a/gm/beziereffects.cpp
+++ b/gm/beziereffects.cpp
@@ -166,7 +166,7 @@
 
                     GrTestTarget tt;
                     context->getTestTarget(&tt);
-                    SkASSERT(NULL != tt.target());
+                    SkASSERT(tt.target());
                     GrDrawState* drawState = tt.target()->drawState();
                     drawState->setVertexAttribs<kAttribs>(2, sizeof(Vertex));
 
@@ -321,7 +321,7 @@
 
                     GrTestTarget tt;
                     context->getTestTarget(&tt);
-                    SkASSERT(NULL != tt.target());
+                    SkASSERT(tt.target());
                     GrDrawState* drawState = tt.target()->drawState();
                     drawState->setVertexAttribs<kAttribs>(2, sizeof(Vertex));
 
@@ -505,7 +505,7 @@
 
                     GrTestTarget tt;
                     context->getTestTarget(&tt);
-                    SkASSERT(NULL != tt.target());
+                    SkASSERT(tt.target());
                     GrDrawState* drawState = tt.target()->drawState();
                     drawState->setVertexAttribs<kAttribs>(2, sizeof(Vertex));
 
diff --git a/gm/bleed.cpp b/gm/bleed.cpp
index 99dba70..aa2b0df 100644
--- a/gm/bleed.cpp
+++ b/gm/bleed.cpp
@@ -212,7 +212,7 @@
 #if SK_SUPPORT_GPU
             GrContext* ctx = canvas->getGrContext();
             int oldMaxTextureSize = 0;
-            if (NULL != ctx) {
+            if (ctx) {
                 // shrink the max texture size so all our textures can be reasonably sized
                 oldMaxTextureSize = ctx->getMaxTextureSize();
                 ctx->setMaxTextureSizeOverride(kMaxTextureSize);
@@ -244,7 +244,7 @@
             this->drawCase4(canvas, kCol6X, kRow3Y, SkCanvas::kBleed_DrawBitmapRectFlag, SkPaint::kHigh_FilterLevel);
 
 #if SK_SUPPORT_GPU
-            if (NULL != ctx) {
+            if (ctx) {
                 ctx->setMaxTextureSizeOverride(oldMaxTextureSize);
             }
 #endif
diff --git a/gm/convexpolyclip.cpp b/gm/convexpolyclip.cpp
index 35c4426..328cdb5 100644
--- a/gm/convexpolyclip.cpp
+++ b/gm/convexpolyclip.cpp
@@ -158,7 +158,7 @@
         int testLayers = kBench_Mode != this->getMode();
         for (int doLayer = 0; doLayer <= testLayers; ++doLayer) {
             for (SkTLList<Clip>::Iter iter(fClips, SkTLList<Clip>::Iter::kHead_IterStart);
-                 NULL != iter.get();
+                 iter.get();
                  iter.next()) {
                 const Clip* clip = iter.get();
                 SkScalar x = startX;
diff --git a/gm/convexpolyeffect.cpp b/gm/convexpolyeffect.cpp
index 275193f..8d73da5 100644
--- a/gm/convexpolyeffect.cpp
+++ b/gm/convexpolyeffect.cpp
@@ -114,7 +114,7 @@
 
         SkScalar y = 0;
         for (SkTLList<SkPath>::Iter iter(fPaths, SkTLList<SkPath>::Iter::kHead_IterStart);
-             NULL != iter.get();
+             iter.get();
              iter.next()) {
             const SkPath* path = iter.get();
             SkScalar x = 0;
@@ -172,7 +172,7 @@
         }
 
         for (SkTLList<SkRect>::Iter iter(fRects, SkTLList<SkRect>::Iter::kHead_IterStart);
-             NULL != iter.get();
+             iter.get();
              iter.next()) {
 
             SkScalar x = 0;
diff --git a/gm/factory.cpp b/gm/factory.cpp
index 608c049..a9bf519 100644
--- a/gm/factory.cpp
+++ b/gm/factory.cpp
@@ -32,7 +32,7 @@
         // Copyright-free file from http://openclipart.org/detail/29213/paper-plane-by-ddoo
         SkString pngFilename = GetResourcePath("plane.png");
         SkAutoDataUnref data(SkData::NewFromFileName(pngFilename.c_str()));
-        if (NULL != data.get()) {
+        if (data.get()) {
             // Create a cache which will boot the pixels out anytime the
             // bitmap is unlocked.
             SkAutoTUnref<SkDiscardableMemoryPool> pool(
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp
index 40d616e..94df02c 100644
--- a/gm/gmmain.cpp
+++ b/gm/gmmain.cpp
@@ -849,7 +849,7 @@
             // If we have access to a single expected bitmap, log more
             // detail about the mismatch.
             const SkBitmap *expectedBitmapPtr = expectations.asBitmap();
-            if (NULL != expectedBitmapPtr) {
+            if (expectedBitmapPtr) {
                 report_bitmap_diffs(*expectedBitmapPtr, actualBitmapAndDigest.fBitmap,
                                     completeName);
             }
@@ -1762,7 +1762,7 @@
                 desc.fHeight = gm->getISize().height();
                 desc.fSampleCnt = config.fSampleCnt;
                 auGpuTarget.reset(gr->createUncachedTexture(desc, NULL, 0));
-                if (NULL != auGpuTarget) {
+                if (auGpuTarget) {
                     gpuTarget = auGpuTarget;
                     grSuccess = true;
                     // Set the user specified cache limits if non-default.
@@ -2297,10 +2297,10 @@
         if (FLAGS_writePath.count() == 1) {
             SkDebugf("writing to %s\n", FLAGS_writePath[0]);
         }
-        if (NULL != gmmain.fMismatchPath) {
+        if (gmmain.fMismatchPath) {
             SkDebugf("writing mismatches to %s\n", gmmain.fMismatchPath);
         }
-        if (NULL != gmmain.fMissingExpectationsPath) {
+        if (gmmain.fMissingExpectationsPath) {
             SkDebugf("writing images without expectations to %s\n",
                      gmmain.fMissingExpectationsPath);
         }
@@ -2324,13 +2324,13 @@
                 return -1;
             }
         }
-        if (NULL != gmmain.fMismatchPath) {
+        if (gmmain.fMismatchPath) {
             if (!prepare_subdirectories(gmmain.fMismatchPath, gmmain.fUseFileHierarchy,
                                         configs, pdfRasterizers)) {
                 return -1;
             }
         }
-        if (NULL != gmmain.fMissingExpectationsPath) {
+        if (gmmain.fMissingExpectationsPath) {
             if (!prepare_subdirectories(gmmain.fMissingExpectationsPath, gmmain.fUseFileHierarchy,
                                         configs, pdfRasterizers)) {
                 return -1;
diff --git a/gm/image.cpp b/gm/image.cpp
index ff184d1..e405a05 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -192,7 +192,7 @@
         canvas->translate(80, 0);
         test_surface(canvas, surf1, true);
 #if SK_SUPPORT_GPU
-        if (NULL != ctx) {
+        if (ctx) {
             canvas->translate(80, 0);
             test_surface(canvas, surf4, true);
         }
diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp
index 37ed885..8af268e 100644
--- a/gm/imagefiltersgraph.cpp
+++ b/gm/imagefiltersgraph.cpp
@@ -46,7 +46,7 @@
         SkBitmap source = src;
         SkImageFilter* input = getInput(0);
         SkIPoint srcOffset = SkIPoint::Make(0, 0);
-        if (NULL != input && !input->filterImage(proxy, src, ctx, &source, &srcOffset)) {
+        if (input && !input->filterImage(proxy, src, ctx, &source, &srcOffset)) {
             return false;
         }
 
diff --git a/gm/samplerstress.cpp b/gm/samplerstress.cpp
index c395b08..29be684 100644
--- a/gm/samplerstress.cpp
+++ b/gm/samplerstress.cpp
@@ -71,7 +71,7 @@
     }
 
     void createShader() {
-        if (NULL != fShader.get()) {
+        if (fShader.get()) {
             return;
         }
 
@@ -83,7 +83,7 @@
     }
 
     void createMaskFilter() {
-        if (NULL != fMaskFilter.get()) {
+        if (fMaskFilter.get()) {
             return;
         }
 
diff --git a/gm/xfermodes3.cpp b/gm/xfermodes3.cpp
index e3e1629..74ca643 100644
--- a/gm/xfermodes3.cpp
+++ b/gm/xfermodes3.cpp
@@ -125,7 +125,7 @@
         SkCanvas* tempCanvas = NULL;
 #if SK_SUPPORT_GPU
         GrContext* context = baseCanvas->getGrContext();
-        if (NULL != context) {
+        if (context) {
             GrTextureDesc desc;
             desc.fWidth = w;
             desc.fHeight = h;
@@ -133,7 +133,7 @@
             desc.fFlags = kRenderTarget_GrTextureFlagBit;
             SkAutoTUnref<GrSurface> surface(context->createUncachedTexture(desc, NULL, 0));
             SkAutoTUnref<SkBaseDevice> device(SkGpuDevice::Create(surface.get()));
-            if (NULL != device.get()) {
+            if (device.get()) {
                 tempCanvas = SkNEW_ARGS(SkCanvas, (device.get()));
             }
         }
