Skip to content

Commit 641b98a

Browse files
committed
[GlobalISel] Fix crash in tryFoldAndOrOrICmpsUsingRanges() with pointer types.
1 parent ecf7db8 commit 641b98a

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6713,6 +6713,9 @@ bool CombinerHelper::tryFoldAndOrOrICmpsUsingRanges(GLogicalBinOp *Logic,
67136713
LLT CmpTy = MRI.getType(Cmp1->getReg(0));
67146714
LLT CmpOperandTy = MRI.getType(R1);
67156715

6716+
if (CmpOperandTy.isPointer())
6717+
return false;
6718+
67166719
// We build ands, adds, and constants of type CmpOperandTy.
67176720
// They must be legal to build.
67186721
if (!isLegalOrBeforeLegalizer({TargetOpcode::G_AND, CmpOperandTy}) ||

llvm/test/CodeGen/AArch64/GlobalISel/combine-logic-of-compare.mir

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,3 +406,66 @@ body: |
406406
%zext:_(<2 x s64>) = G_ZEXT %and(<2 x s1>)
407407
$q0 = COPY %zext
408408
...
409+
---
410+
name: test_dont_combine_pointers
411+
body: |
412+
; CHECK-LABEL: name: test_dont_combine_pointers
413+
; CHECK: bb.0:
414+
; CHECK-NEXT: successors: %bb.1(0x80000000)
415+
; CHECK-NEXT: {{ $}}
416+
; CHECK-NEXT: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
417+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -8
418+
; CHECK-NEXT: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[C1]](s64)
419+
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 -16
420+
; CHECK-NEXT: [[INTTOPTR1:%[0-9]+]]:_(p0) = G_INTTOPTR [[C2]](s64)
421+
; CHECK-NEXT: [[C3:%[0-9]+]]:_(s1) = G_CONSTANT i1 false
422+
; CHECK-NEXT: {{ $}}
423+
; CHECK-NEXT: bb.1:
424+
; CHECK-NEXT: successors: %bb.2(0x60000000), %bb.3(0x20000000)
425+
; CHECK-NEXT: {{ $}}
426+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[C]](p0) :: (load (p0))
427+
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](p0), [[INTTOPTR]]
428+
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](p0), [[INTTOPTR1]]
429+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s1) = G_AND [[ICMP]], [[ICMP1]]
430+
; CHECK-NEXT: G_BRCOND [[AND]](s1), %bb.3
431+
; CHECK-NEXT: G_BR %bb.2
432+
; CHECK-NEXT: {{ $}}
433+
; CHECK-NEXT: bb.2:
434+
; CHECK-NEXT: successors: %bb.1(0x55555555), %bb.3(0x2aaaaaab)
435+
; CHECK-NEXT: {{ $}}
436+
; CHECK-NEXT: G_BRCOND [[C3]](s1), %bb.1
437+
; CHECK-NEXT: G_BR %bb.3
438+
; CHECK-NEXT: {{ $}}
439+
; CHECK-NEXT: bb.3:
440+
; CHECK-NEXT: successors: %bb.1(0x80000000)
441+
; CHECK-NEXT: {{ $}}
442+
; CHECK-NEXT: G_BR %bb.1
443+
bb.1:
444+
%1:_(p0) = G_CONSTANT i64 0
445+
%3:_(s64) = G_CONSTANT i64 -8
446+
%2:_(p0) = G_INTTOPTR %3(s64)
447+
%6:_(s64) = G_CONSTANT i64 -16
448+
%5:_(p0) = G_INTTOPTR %6(s64)
449+
%10:_(s1) = G_CONSTANT i1 false
450+
451+
bb.2:
452+
successors: %bb.4(0x60000000), %bb.3(0x20000000)
453+
454+
%0:_(p0) = G_LOAD %1(p0) :: (load (p0))
455+
%4:_(s1) = G_ICMP intpred(eq), %0(p0), %2
456+
%7:_(s1) = G_ICMP intpred(eq), %0(p0), %5
457+
%8:_(s1) = G_OR %4, %7
458+
%9:_(s1) = G_SELECT %8(s1), %10, %10
459+
G_BRCOND %8(s1), %bb.4
460+
G_BR %bb.3
461+
462+
bb.4:
463+
successors: %bb.2(0x55555555), %bb.3(0x2aaaaaab)
464+
465+
G_BRCOND %10(s1), %bb.2
466+
G_BR %bb.3
467+
468+
bb.3:
469+
G_BR %bb.2
470+
471+
...

0 commit comments

Comments
 (0)