[llvm] 641b98a - [GlobalISel] Fix crash in tryFoldAndOrOrICmpsUsingRanges() with pointer types.
Amara Emerson via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 7 12:56:54 PST 2024
Author: Amara Emerson
Date: 2024-03-07T12:56:40-08:00
New Revision: 641b98a0d1e20da9500aa012ced41e53967a423f
URL: https://github.com/llvm/llvm-project/commit/641b98a0d1e20da9500aa012ced41e53967a423f
DIFF: https://github.com/llvm/llvm-project/commit/641b98a0d1e20da9500aa012ced41e53967a423f.diff
LOG: [GlobalISel] Fix crash in tryFoldAndOrOrICmpsUsingRanges() with pointer types.
Added:
Modified:
llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
llvm/test/CodeGen/AArch64/GlobalISel/combine-logic-of-compare.mir
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
index 2f18a64ca285bd..4862207d53f492 100644
--- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -6713,6 +6713,9 @@ bool CombinerHelper::tryFoldAndOrOrICmpsUsingRanges(GLogicalBinOp *Logic,
LLT CmpTy = MRI.getType(Cmp1->getReg(0));
LLT CmpOperandTy = MRI.getType(R1);
+ if (CmpOperandTy.isPointer())
+ return false;
+
// We build ands, adds, and constants of type CmpOperandTy.
// They must be legal to build.
if (!isLegalOrBeforeLegalizer({TargetOpcode::G_AND, CmpOperandTy}) ||
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/combine-logic-of-compare.mir b/llvm/test/CodeGen/AArch64/GlobalISel/combine-logic-of-compare.mir
index d050823e3b9494..1eb445c03efcd6 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/combine-logic-of-compare.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/combine-logic-of-compare.mir
@@ -406,3 +406,66 @@ body: |
%zext:_(<2 x s64>) = G_ZEXT %and(<2 x s1>)
$q0 = COPY %zext
...
+---
+name: test_dont_combine_pointers
+body: |
+ ; CHECK-LABEL: name: test_dont_combine_pointers
+ ; CHECK: bb.0:
+ ; CHECK-NEXT: successors: %bb.1(0x80000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
+ ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -8
+ ; CHECK-NEXT: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[C1]](s64)
+ ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 -16
+ ; CHECK-NEXT: [[INTTOPTR1:%[0-9]+]]:_(p0) = G_INTTOPTR [[C2]](s64)
+ ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s1) = G_CONSTANT i1 false
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.1:
+ ; CHECK-NEXT: successors: %bb.2(0x60000000), %bb.3(0x20000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[C]](p0) :: (load (p0))
+ ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](p0), [[INTTOPTR]]
+ ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](p0), [[INTTOPTR1]]
+ ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s1) = G_AND [[ICMP]], [[ICMP1]]
+ ; CHECK-NEXT: G_BRCOND [[AND]](s1), %bb.3
+ ; CHECK-NEXT: G_BR %bb.2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.2:
+ ; CHECK-NEXT: successors: %bb.1(0x55555555), %bb.3(0x2aaaaaab)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: G_BRCOND [[C3]](s1), %bb.1
+ ; CHECK-NEXT: G_BR %bb.3
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.3:
+ ; CHECK-NEXT: successors: %bb.1(0x80000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: G_BR %bb.1
+ bb.1:
+ %1:_(p0) = G_CONSTANT i64 0
+ %3:_(s64) = G_CONSTANT i64 -8
+ %2:_(p0) = G_INTTOPTR %3(s64)
+ %6:_(s64) = G_CONSTANT i64 -16
+ %5:_(p0) = G_INTTOPTR %6(s64)
+ %10:_(s1) = G_CONSTANT i1 false
+
+ bb.2:
+ successors: %bb.4(0x60000000), %bb.3(0x20000000)
+
+ %0:_(p0) = G_LOAD %1(p0) :: (load (p0))
+ %4:_(s1) = G_ICMP intpred(eq), %0(p0), %2
+ %7:_(s1) = G_ICMP intpred(eq), %0(p0), %5
+ %8:_(s1) = G_OR %4, %7
+ %9:_(s1) = G_SELECT %8(s1), %10, %10
+ G_BRCOND %8(s1), %bb.4
+ G_BR %bb.3
+
+ bb.4:
+ successors: %bb.2(0x55555555), %bb.3(0x2aaaaaab)
+
+ G_BRCOND %10(s1), %bb.2
+ G_BR %bb.3
+
+ bb.3:
+ G_BR %bb.2
+
+...
More information about the llvm-commits
mailing list