[PATCH] Invariant intrinsic canonicalization

hfinkel at anl.gov hfinkel at anl.gov
Sun Jul 13 22:45:10 PDT 2014


Hi chandlerc,

This patch adds some simple canonicalization of invariant intrinsics to instcombine. For now, only this:
  invariant(a && b) -> invariant(a); invariant(b)

http://reviews.llvm.org/D4491

Files:
  lib/Transforms/InstCombine/InstCombineCalls.cpp
  test/Transforms/InstCombine/invariants.ll

Index: lib/Transforms/InstCombine/InstCombineCalls.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -997,6 +997,17 @@
       return EraseInstFromFunction(CI);
     break;
   }
+  case Intrinsic::invariant: {
+    // Canonicalize invariant(a && b) -> invariant(a); invariant(b);
+    Value *IIOperand = II->getArgOperand(0), *A, *B;
+    if (match(IIOperand, m_And(m_Value(A), m_Value(B)))) {
+      Builder->CreateCall(II->getCalledValue(), A, II->getName());
+      Builder->CreateCall(II->getCalledValue(), B, II->getName());
+      return EraseInstFromFunction(*II);
+    }
+
+    break;
+  }
   }
 
   return visitCallSite(II);
Index: test/Transforms/InstCombine/invariants.ll
===================================================================
--- test/Transforms/InstCombine/invariants.ll
+++ test/Transforms/InstCombine/invariants.ll
@@ -115,6 +115,22 @@
   ret i32 %and1
 }
 
+; Function Attrs: nounwind uwtable
+define i32 @can1(i1 %a, i1 %b, i1 %c) {
+entry:
+  %and1 = and i1 %a, %b
+  %and  = and i1 %and1, %c
+  tail call void @llvm.invariant(i1 %and)
+
+; CHECK-LABEL: @can1
+; CHECK: call void @llvm.invariant(i1 %a)
+; CHECK: call void @llvm.invariant(i1 %b)
+; CHECK: call void @llvm.invariant(i1 %c)
+; CHECK: ret i32
+
+  ret i32 5
+}
+
 attributes #0 = { nounwind uwtable }
 attributes #1 = { nounwind }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4491.11362.patch
Type: text/x-patch
Size: 1456 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140714/eddfafe1/attachment.bin>


More information about the llvm-commits mailing list