[llvm] 95dabac - [AArch64][GlobalISel] Make G_PTRTOINT only legal for s64 + p0

Jessica Paquette via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 28 16:22:27 PDT 2022


Author: Jessica Paquette
Date: 2022-09-28T16:20:24-07:00
New Revision: 95dabac7a5adf62af5c43863e7bf6db5d4437b72

URL: https://github.com/llvm/llvm-project/commit/95dabac7a5adf62af5c43863e7bf6db5d4437b72
DIFF: https://github.com/llvm/llvm-project/commit/95dabac7a5adf62af5c43863e7bf6db5d4437b72.diff

LOG: [AArch64][GlobalISel] Make G_PTRTOINT only legal for s64 + p0

A few issues:

  1. There was no legalizer test for G_PTRTOINT
  2. Same clamping issue as in many other opcodes
  3. AArch64 pointers can only be 64b, so in reality we always have to trunc or
     extend with any size other than p0 anyway.

This seems to actually produce more correct selection for narrow types as well.

Differential Revision: https://reviews.llvm.org/D107588

Added: 
    

Modified: 
    llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
    llvm/test/CodeGen/AArch64/GlobalISel/legalize-exceptions.ll
    llvm/test/CodeGen/AArch64/GlobalISel/legalize-ptrtoint.mir
    llvm/test/CodeGen/AArch64/GlobalISel/select-int-ptr-casts.mir

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 1a1feb772c87..541d4c669b52 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -507,10 +507,9 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
     getActionDefinitionsBuilder(G_GLOBAL_VALUE).legalFor({p0});
 
   getActionDefinitionsBuilder(G_PTRTOINT)
-      .legalForCartesianProduct({s8, s16, s32, s64}, {p0})
-      .legalFor({{v2s64, v2p0}})
-      .maxScalar(0, s64)
-      .widenScalarToNextPow2(0, /*Min*/ 8);
+      .legalFor({{s64, p0}, {v2s64, v2p0}})
+      .widenScalarToNextPow2(0, 64)
+      .clampScalar(0, s64, s64);
 
   getActionDefinitionsBuilder(G_INTTOPTR)
       .unsupportedIf([&](const LegalityQuery &Query) {

diff  --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-exceptions.ll b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-exceptions.ll
index 208cf683197f..8ad1dbc695fd 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-exceptions.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-exceptions.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
 ; RUN: llc -O0 -mtriple=aarch64-apple-ios -verify-machineinstrs -global-isel -stop-after=legalizer %s -o - | FileCheck %s
 
 @_ZTIi = external global i8*
@@ -7,21 +8,45 @@ declare i32 @__gxx_personality_v0(...)
 declare i32 @llvm.eh.typeid.for(i8*)
 declare void @_Unwind_Resume(i8*)
 
-; CHECK: name: bar
-; CHECK: body:
-; CHECK-NEXT:   bb.1 (%ir-block.0):
-; CHECK:     successors: %{{bb.[0-9]+.*}}%[[LP:bb.[0-9]+]]
-
-; CHECK:   [[LP]].{{[a-z]+}} (landing-pad):
-; CHECK:     EH_LABEL
-
-; CHECK:     [[PTR:%[0-9]+]]:_(p0) = COPY $x0
-; CHECK:     [[SEL_PTR:%[0-9]+]]:_(p0) = COPY $x1
-; CHECK:     [[SEL_PTR_INT:%[0-9]+]]:_(s32) = G_PTRTOINT [[SEL_PTR]](p0)
-; CHECK:     G_STORE [[PTR]](p0), %0(p0) :: (store (p0) into %ir.exn.slot)
-; CHECK:     G_STORE [[SEL_PTR_INT]](s32), %1(p0) :: (store (s32) into %ir.ehselector.slot)
-
 define void @bar() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+  ; CHECK-LABEL: name: bar
+  ; CHECK: bb.1 (%ir-block.0):
+  ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 42
+  ; CHECK-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0.exn.slot
+  ; CHECK-NEXT:   [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.1.ehselector.slot
+  ; CHECK-NEXT:   EH_LABEL <mcsymbol >
+  ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
+  ; CHECK-NEXT:   $w0 = COPY [[C]](s32)
+  ; CHECK-NEXT:   BL @foo, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w0, implicit-def $w0
+  ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
+  ; CHECK-NEXT:   EH_LABEL <mcsymbol >
+  ; CHECK-NEXT:   G_BR %bb.3
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.2.cleanup (landing-pad):
+  ; CHECK-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-NEXT:   liveins: $x0, $x1
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   EH_LABEL <mcsymbol >
+  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x0
+  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
+  ; CHECK-NEXT:   [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[COPY1]](p0)
+  ; CHECK-NEXT:   [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[PTRTOINT]](s64)
+  ; CHECK-NEXT:   G_STORE [[COPY]](p0), [[FRAME_INDEX]](p0) :: (store (p0) into %ir.exn.slot)
+  ; CHECK-NEXT:   G_STORE [[TRUNC]](s32), [[FRAME_INDEX1]](p0) :: (store (s32) into %ir.ehselector.slot)
+  ; CHECK-NEXT:   G_BR %bb.4
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.3.continue:
+  ; CHECK-NEXT:   RET_ReallyLR
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.4.eh.resume:
+  ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[FRAME_INDEX]](p0) :: (dereferenceable load (p0) from %ir.exn.slot)
+  ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
+  ; CHECK-NEXT:   $x0 = COPY [[LOAD]](p0)
+  ; CHECK-NEXT:   BL @_Unwind_Resume, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $x0
+  ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
+  ; CHECK-NEXT:   G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.trap)
   %exn.slot = alloca i8*
   %ehselector.slot = alloca i32
   %1 = invoke i32 @foo(i32 42) to label %continue unwind label %cleanup

diff  --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-ptrtoint.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-ptrtoint.mir
index ef5916379e04..f62a948a4b36 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-ptrtoint.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-ptrtoint.mir
@@ -1,6 +1,137 @@
 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
 # RUN: llc -mtriple=aarch64 -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck %s
 
+...
+---
+name: p0_s64
+body: |
+  bb.0:
+    liveins: $x0
+    ; CHECK-LABEL: name: p0_s64
+    ; CHECK: liveins: $x0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:_(p0) = COPY $x0
+    ; CHECK-NEXT: %int:_(s64) = G_PTRTOINT %ptr(p0)
+    ; CHECK-NEXT: $x0 = COPY %int(s64)
+    ; CHECK-NEXT: RET_ReallyLR implicit $x0
+    %ptr:_(p0) = COPY $x0
+    %int:_(s64) = G_PTRTOINT %ptr
+    $x0 = COPY %int
+    RET_ReallyLR implicit $x0
+...
+---
+name: p0_s32
+body: |
+  bb.0:
+    liveins: $x0
+    ; CHECK-LABEL: name: p0_s32
+    ; CHECK: liveins: $x0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:_(p0) = COPY $x0
+    ; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT %ptr(p0)
+    ; CHECK-NEXT: %int:_(s32) = G_TRUNC [[PTRTOINT]](s64)
+    ; CHECK-NEXT: $w0 = COPY %int(s32)
+    ; CHECK-NEXT: RET_ReallyLR implicit $w0
+    %ptr:_(p0) = COPY $x0
+    %int:_(s32) = G_PTRTOINT %ptr
+    $w0 = COPY %int
+    RET_ReallyLR implicit $w0
+...
+---
+name: p0_s16
+body: |
+  bb.0:
+    liveins: $x0, $h0
+    ; CHECK-LABEL: name: p0_s16
+    ; CHECK: liveins: $x0, $h0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:_(p0) = COPY $x0
+    ; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT %ptr(p0)
+    ; CHECK-NEXT: %int:_(s16) = G_TRUNC [[PTRTOINT]](s64)
+    ; CHECK-NEXT: $h0 = COPY %int(s16)
+    ; CHECK-NEXT: RET_ReallyLR implicit $h0
+    %ptr:_(p0) = COPY $x0
+    %int:_(s16) = G_PTRTOINT %ptr
+    $h0 = COPY %int
+    RET_ReallyLR implicit $h0
+...
+---
+name: p0_s8
+body: |
+  bb.0:
+    liveins: $x0, $b0
+    ; CHECK-LABEL: name: p0_s8
+    ; CHECK: liveins: $x0, $b0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:_(p0) = COPY $x0
+    ; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT %ptr(p0)
+    ; CHECK-NEXT: %int:_(s8) = G_TRUNC [[PTRTOINT]](s64)
+    ; CHECK-NEXT: $b0 = COPY %int(s8)
+    ; CHECK-NEXT: RET_ReallyLR implicit $b0
+    %ptr:_(p0) = COPY $x0
+    %int:_(s8) = G_PTRTOINT %ptr
+    $b0 = COPY %int
+    RET_ReallyLR implicit $b0
+...
+---
+name: p0_s1
+body: |
+  bb.0:
+    liveins: $x0
+    ; CHECK-LABEL: name: p0_s1
+    ; CHECK: liveins: $x0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:_(p0) = COPY $x0
+    ; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT %ptr(p0)
+    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
+    ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[PTRTOINT]](s64)
+    ; CHECK-NEXT: %ext:_(s32) = G_AND [[TRUNC]], [[C]]
+    ; CHECK-NEXT: $w0 = COPY %ext(s32)
+    ; CHECK-NEXT: RET_ReallyLR implicit $w0
+    %ptr:_(p0) = COPY $x0
+    %int:_(s1) = G_PTRTOINT %ptr
+    %ext:_(s32) = G_ZEXT %int
+    $w0 = COPY %ext
+    RET_ReallyLR implicit $w0
+...
+---
+name: p0_s128
+body: |
+  bb.0:
+    liveins: $x0, $q0
+    ; CHECK-LABEL: name: p0_s128
+    ; CHECK: liveins: $x0, $q0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:_(p0) = COPY $x0
+    ; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT %ptr(p0)
+    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
+    ; CHECK-NEXT: %int:_(s128) = G_MERGE_VALUES [[PTRTOINT]](s64), [[C]](s64)
+    ; CHECK-NEXT: $q0 = COPY %int(s128)
+    ; CHECK-NEXT: RET_ReallyLR implicit $q0
+    %ptr:_(p0) = COPY $x0
+    %int:_(s128) = G_PTRTOINT %ptr
+    $q0 = COPY %int
+    RET_ReallyLR implicit $q0
+...
+---
+name: p0_s88
+body: |
+  bb.0:
+    liveins: $x0
+    ; CHECK-LABEL: name: p0_s88
+    ; CHECK: liveins: $x0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:_(p0) = COPY $x0
+    ; CHECK-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT %ptr(p0)
+    ; CHECK-NEXT: %trunc:_(s32) = G_TRUNC [[PTRTOINT]](s64)
+    ; CHECK-NEXT: $w0 = COPY %trunc(s32)
+    ; CHECK-NEXT: RET_ReallyLR implicit $w0
+    %ptr:_(p0) = COPY $x0
+    %int:_(s88) = G_PTRTOINT %ptr
+    %trunc:_(s32) = G_TRUNC %int
+    $w0 = COPY %trunc
+    RET_ReallyLR implicit $w0
+
 ...
 ---
 name:            v2s64_v2p0_legal
@@ -11,10 +142,11 @@ body:             |
 
     ; CHECK-LABEL: name: v2s64_v2p0_legal
     ; CHECK: liveins: $q0
-    ; CHECK: %ptr:_(<2 x p0>) = COPY $q0
-    ; CHECK: %int:_(<2 x s64>) = G_PTRTOINT %ptr(<2 x p0>)
-    ; CHECK: $q0 = COPY %int(<2 x s64>)
-    ; CHECK: RET_ReallyLR implicit $q0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:_(<2 x p0>) = COPY $q0
+    ; CHECK-NEXT: %int:_(<2 x s64>) = G_PTRTOINT %ptr(<2 x p0>)
+    ; CHECK-NEXT: $q0 = COPY %int(<2 x s64>)
+    ; CHECK-NEXT: RET_ReallyLR implicit $q0
     %ptr:_(<2 x p0>) = COPY $q0
     %int:_(<2 x s64>) = G_PTRTOINT %ptr(<2 x p0>)
     $q0 = COPY %int(<2 x s64>)

diff  --git a/llvm/test/CodeGen/AArch64/GlobalISel/select-int-ptr-casts.mir b/llvm/test/CodeGen/AArch64/GlobalISel/select-int-ptr-casts.mir
index d0230e4adeca..c8db8445d0e2 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/select-int-ptr-casts.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/select-int-ptr-casts.mir
@@ -9,6 +9,7 @@
   define void @ptrtoint_s32_p0() { ret void }
   define void @ptrtoint_s16_p0() { ret void }
   define void @ptrtoint_s8_p0() { ret void }
+  define void @ptrtoint_s1_p0() { ret void }
   define void @inttoptr_v2p0_v2s64() { ret void }
   define void @ptrtoint_v2s64_v2p0() { ret void }
 ...
@@ -25,7 +26,9 @@ body:             |
   bb.0:
     liveins: $x0
     ; CHECK-LABEL: name: inttoptr_p0_s64
-    ; CHECK: [[COPY:%[0-9]+]]:gpr64all = COPY $x0
+    ; CHECK: liveins: $x0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64all = COPY $x0
     ; CHECK-NEXT: $x0 = COPY [[COPY]]
     %0(s64) = COPY $x0
     %1(p0) = G_INTTOPTR %0
@@ -44,7 +47,9 @@ body:             |
   bb.0:
     liveins: $x0
     ; CHECK-LABEL: name: ptrtoint_s64_p0
-    ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
+    ; CHECK: liveins: $x0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
     ; CHECK-NEXT: $x0 = COPY [[COPY]]
     %0(p0) = COPY $x0
     %1(s64) = G_PTRTOINT %0
@@ -63,12 +68,18 @@ body:             |
   bb.0:
     liveins: $x0
     ; CHECK-LABEL: name: ptrtoint_s32_p0
-    ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
-    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]].sub_32
-    ; CHECK-NEXT: $w0 = COPY [[COPY1]]
-    %0(p0) = COPY $x0
-    %1(s32) = G_PTRTOINT %0
-    $w0 = COPY %1(s32)
+    ; CHECK: liveins: $x0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:gpr64 = COPY $x0
+    ; CHECK-NEXT: %ptr2int:gpr64common = COPY %ptr
+    ; CHECK-NEXT: %int:gpr32sp = COPY %ptr2int.sub_32
+    ; CHECK-NEXT: $w0 = COPY %int
+    ; CHECK-NEXT: RET_ReallyLR implicit $w0
+    %ptr:gpr(p0) = COPY $x0
+    %ptr2int:gpr(s64) = G_PTRTOINT %ptr(p0)
+    %int:gpr(s32) = G_TRUNC %ptr2int(s64)
+    $w0 = COPY %int(s32)
+    RET_ReallyLR implicit $w0
 ...
 
 ---
@@ -83,14 +94,19 @@ body:             |
   bb.0:
     liveins: $x0
     ; CHECK-LABEL: name: ptrtoint_s16_p0
-    ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
-    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]].sub_32
-    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32all = COPY [[COPY1]]
-    ; CHECK-NEXT: $w0 = COPY [[COPY2]]
-    %0(p0) = COPY $x0
-    %1(s16) = G_PTRTOINT %0
-    %2:gpr(s32) = G_ANYEXT %1
-    $w0 = COPY %2(s32)
+    ; CHECK: liveins: $x0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:gpr64 = COPY $x0
+    ; CHECK-NEXT: %int:gpr32 = COPY %ptr.sub_32
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr32 = COPY %int
+    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr16 = COPY [[COPY]].hsub
+    ; CHECK-NEXT: $h0 = COPY [[COPY1]]
+    ; CHECK-NEXT: RET_ReallyLR implicit $h0
+    %ptr:gpr(p0) = COPY $x0
+    %ptr2int:gpr(s64) = G_PTRTOINT %ptr(p0)
+    %int:gpr(s16) = G_TRUNC %ptr2int(s64)
+    $h0 = COPY %int(s16)
+    RET_ReallyLR implicit $h0
 ...
 
 ---
@@ -105,16 +121,49 @@ body:             |
   bb.0:
     liveins: $x0
     ; CHECK-LABEL: name: ptrtoint_s8_p0
-    ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
-    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]].sub_32
-    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32all = COPY [[COPY1]]
-    ; CHECK-NEXT: $w0 = COPY [[COPY2]]
-    %0(p0) = COPY $x0
-    %1(s8) = G_PTRTOINT %0
-    %2:gpr(s32) = G_ANYEXT %1
-    $w0 = COPY %2(s32)
+    ; CHECK: liveins: $x0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:gpr64 = COPY $x0
+    ; CHECK-NEXT: %int:gpr32 = COPY %ptr.sub_32
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr32 = COPY %int
+    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr8 = COPY [[COPY]].bsub
+    ; CHECK-NEXT: $b0 = COPY [[COPY1]]
+    ; CHECK-NEXT: RET_ReallyLR implicit $b0
+    %ptr:gpr(p0) = COPY $x0
+    %ptr2int:gpr(s64) = G_PTRTOINT %ptr(p0)
+    %int:gpr(s8) = G_TRUNC %ptr2int(s64)
+    $b0 = COPY %int(s8)
+    RET_ReallyLR implicit $b0
+
 ...
+---
+name:            ptrtoint_s1_p0
+legalized:       true
+regBankSelected: true
 
+registers:
+  - { id: 0, class: gpr }
+  - { id: 1, class: gpr }
+body:             |
+  bb.0:
+    liveins: $x0
+    ; CHECK-LABEL: name: ptrtoint_s1_p0
+    ; CHECK: liveins: $x0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %ptr:gpr64 = COPY $x0
+    ; CHECK-NEXT: %ptr2int:gpr64common = COPY %ptr
+    ; CHECK-NEXT: %trunc:gpr32common = COPY %ptr2int.sub_32
+    ; CHECK-NEXT: %ext:gpr32sp = ANDWri %trunc, 0
+    ; CHECK-NEXT: $w0 = COPY %ext
+    ; CHECK-NEXT: RET_ReallyLR implicit $w0
+    %ptr:gpr(p0) = COPY $x0
+    %ptr2int:gpr(s64) = G_PTRTOINT %ptr(p0)
+    %one:gpr(s32) = G_CONSTANT i32 1
+    %trunc:gpr(s32) = G_TRUNC %ptr2int(s64)
+    %ext:gpr(s32) = G_AND %trunc, %one
+    $w0 = COPY %ext(s32)
+    RET_ReallyLR implicit $w0
+...
 ---
 name:            inttoptr_v2p0_v2s64
 legalized:       true


        


More information about the llvm-commits mailing list