[PATCH] D20173: [InstCombine] Avoid combining the bitcast of a var that is used as both address and result of the same load instruction

Guozhi Wei via llvm-commits llvm-commits at lists.llvm.org
Wed May 11 16:12:24 PDT 2016


Carrot updated this revision to Diff 56976.
Carrot added a comment.

The original patch considers only one load instruction. There may be multiple load instructions, each loaded value is used as address of later load instruction, just as Caroline's testcase, it still causes problem. This updated patch solves the problem. Detecting the exact pattern is too complex. For simplicity the code gives up if the load address comes from another load instruction.

Please review it again.


http://reviews.llvm.org/D20173

Files:
  lib/Transforms/InstCombine/InstCombineCasts.cpp
  test/Transforms/InstCombine/pr27703.ll

Index: test/Transforms/InstCombine/pr27703.ll
===================================================================
--- test/Transforms/InstCombine/pr27703.ll
+++ test/Transforms/InstCombine/pr27703.ll
@@ -0,0 +1,20 @@
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+define void @mem() {
+bb:
+  br label %bb6
+
+bb6:
+  %.0 = phi i8** [ undef, %bb ], [ %t2, %bb6 ]
+  %tmp = load i8*, i8** %.0, align 8
+  %bc = bitcast i8* %tmp to i8**
+  %t1 = load i8*, i8** %bc, align 8
+  %t2 = bitcast i8* %t1 to i8**
+  br label %bb6
+
+bb206:
+  ret void
+; CHECK: phi
+; CHECK: bitcast
+; CHECK: load
+}
Index: lib/Transforms/InstCombine/InstCombineCasts.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -1820,6 +1820,13 @@
 
       auto *LI = dyn_cast<LoadInst>(IncValue);
       if (LI) {
+        // If there is a sequence of one or more load instructions, each loaded
+        // value is used as address of later load instruction, bitcast is
+        // necessary to change the value type, don't optimize it. For
+        // simplicity we give up if the load address comes from another load.
+        Value *Addr = LI->getOperand(0);
+        if (Addr == &CI || isa<LoadInst>(Addr))
+          return nullptr;
         if (LI->hasOneUse() && LI->isSimple())
           continue;
         // If a LoadInst has more than one use, changing the type of loaded


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20173.56976.patch
Type: text/x-patch
Size: 1485 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160511/921c5f66/attachment.bin>


More information about the llvm-commits mailing list