[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