[PATCH] D108734: [InstCombine] Replace icmp invariant group operands with the invariant group's operands

Arthur Eubanks via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 25 15:13:40 PDT 2021


aeubanks created this revision.
Herald added subscribers: hiraditya, Prazek.
aeubanks requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

icmp does not care about pointer provenance, only the pointer value.
Since the invariant group intrinsics are only there to disallow CSE of
pointers with different provenances, icmp shouldn't care about invariant
group intrinsics.

This fixes a missed optimization in llvm-test-suite's MultiSource lambda
benchmark under -fstrict-vtable-pointers.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D108734

Files:
  llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
  llvm/test/Transforms/InstCombine/invariant.group.ll


Index: llvm/test/Transforms/InstCombine/invariant.group.ll
===================================================================
--- llvm/test/Transforms/InstCombine/invariant.group.ll
+++ llvm/test/Transforms/InstCombine/invariant.group.ll
@@ -107,7 +107,6 @@
 
 define i1 @simplifyForCompare(i8* %a) {
 ; CHECK-LABEL: @simplifyForCompare(
-; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @llvm.strip.invariant.group.p0i8(i8* [[A:%.*]])
 ; CHECK-NEXT:    ret i1 true
 ;
   %a2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %a)
@@ -161,10 +160,7 @@
 
 define i1 @icmp1(i8* %a) {
 ; CHECK-LABEL: @icmp1(
-; CHECK-NEXT:    [[A2:%.*]] = call i8* @llvm.launder.invariant.group.p0i8(i8* [[A:%.*]])
-; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @llvm.strip.invariant.group.p0i8(i8* [[A]])
-; CHECK-NEXT:    [[R:%.*]] = icmp eq i8* [[A2]], [[TMP1]]
-; CHECK-NEXT:    ret i1 [[R]]
+; CHECK-NEXT:    ret i1 true
 ;
   %a2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %a)
   %a3 = call i8* @llvm.strip.invariant.group.p0i8(i8* %a2)
@@ -174,9 +170,7 @@
 
 define i1 @icmp2(i8* %a, i8* %b) {
 ; CHECK-LABEL: @icmp2(
-; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @llvm.strip.invariant.group.p0i8(i8* [[A:%.*]])
-; CHECK-NEXT:    [[TMP2:%.*]] = call i8* @llvm.launder.invariant.group.p0i8(i8* [[B:%.*]])
-; CHECK-NEXT:    [[R:%.*]] = icmp eq i8* [[TMP1]], [[TMP2]]
+; CHECK-NEXT:    [[R:%.*]] = icmp eq i8* [[A:%.*]], [[B:%.*]]
 ; CHECK-NEXT:    ret i1 [[R]]
 ;
   %a2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %a)
Index: llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -5702,6 +5702,27 @@
   return ExtractValueInst::Create(UAddOv, 1);
 }
 
+static bool foldICmpInvariantGroup(ICmpInst &I) {
+  bool Changed = false;
+  while (auto *O = dyn_cast<Instruction>(I.getOperand(0))) {
+    if (O->isLaunderOrStripInvariantGroup()) {
+      I.setOperand(0, O->getOperand(0));
+      Changed = true;
+    } else {
+      break;
+    }
+  }
+  while (auto *O = dyn_cast<Instruction>(I.getOperand(1))) {
+    if (O->isLaunderOrStripInvariantGroup()) {
+      I.setOperand(1, O->getOperand(0));
+      Changed = true;
+    } else {
+      break;
+    }
+  }
+  return Changed;
+}
+
 Instruction *InstCombinerImpl::visitICmpInst(ICmpInst &I) {
   bool Changed = false;
   const SimplifyQuery Q = SQ.getWithInstruction(&I);
@@ -5942,6 +5963,8 @@
     if (Instruction *Res = foldVectorCmp(I, Builder))
       return Res;
 
+  Changed |= foldICmpInvariantGroup(I);
+
   return Changed ? &I : nullptr;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D108734.368749.patch
Type: text/x-patch
Size: 2677 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210825/f8d3ced9/attachment.bin>


More information about the llvm-commits mailing list