[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