# NOTE: Assertions have been autogenerated by utils/update_givaluetracking_test_checks.py UTC_ARGS: --version 5 # RUN: llc -mtriple=amdgcn -passes="print" %s -filetype=null 2>&1 | FileCheck %s ## Check that we don't incorrectly assume known zeroes for and extend of a truncated ptrtoint ## Test case for https://github.com/llvm/llvm-project/issues/139598 --- ## We should see 128 unknown bits. name: PtrToInt body: | bb.0: ; CHECK-LABEL: name: @PtrToInt ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1 ; CHECK-NEXT: %5:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1 %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = COPY $vgpr3 %4:_(p8) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32), %3(s32) %5:_(s128) = G_PTRTOINT %4(p8) ... --- ## We should see 128 high zeroes followed by 128 unknown bits for extending ptrtoint. name: PtrToIntExt body: | bb.0: ; CHECK-LABEL: name: @PtrToIntExt ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1 ; CHECK-NEXT: %5:_ KnownBits:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:128 %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = COPY $vgpr3 %4:_(p8) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32), %3(s32) %5:_(s256) = G_PTRTOINT %4(p8) ... --- ## We should see 48 unknown bits for truncating ptrtoint. name: PtrToIntTrunc body: | bb.0: ; CHECK-LABEL: name: @PtrToIntTrunc ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1 ; CHECK-NEXT: %5:_ KnownBits:???????????????????????????????????????????????? SignBits:1 %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = COPY $vgpr3 %4:_(p8) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32), %3(s32) %5:_(s48) = G_PTRTOINT %4(p8) ... --- ## This is the test for issue 139598: Truncating and then extending the ## G_PTRTOINT result was filling all bits above the index bitwidth with known ## zeroes even though the incoming value is completely unknown and G_PTRTOINT. ## is lowered to a bitwise copy. ## We should see all zero high bits with 48 unknown bits. name: PtrToIntTruncExplicitExt body: | bb.0: ; CHECK-LABEL: name: @PtrToIntTruncExplicitExt ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1 ; CHECK-NEXT: %5:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1 ; CHECK-NEXT: %6:_ KnownBits:???????????????????????????????????????????????? SignBits:1 ; CHECK-NEXT: %7:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000???????????????????????????????????????????????? SignBits:208 %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = COPY $vgpr3 %4:_(p8) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32), %3(s32) %5:_(s128) = G_PTRTOINT %4(p8) %6:_(s48) = G_TRUNC %5(s128) %7:_(s256) = G_ZEXT %6(s48) ... --- ## Same test again but this time have the G_PTRTOINT do the truncation. ## We should see all zero high bits with 48 unknown bits. name: PtrToIntTruncImplicitExt body: | bb.0: ; CHECK-LABEL: name: @PtrToIntTruncImplicitExt ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %2:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1 ; CHECK-NEXT: %4:_ KnownBits:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? SignBits:1 ; CHECK-NEXT: %5:_ KnownBits:???????????????????????????????????????????????? SignBits:1 ; CHECK-NEXT: %6:_ KnownBits:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000???????????????????????????????????????????????? SignBits:208 %0:_(s32) = COPY $vgpr0 %1:_(s32) = COPY $vgpr1 %2:_(s32) = COPY $vgpr2 %3:_(s32) = COPY $vgpr3 %4:_(p8) = G_MERGE_VALUES %0(s32), %1(s32), %2(s32), %3(s32) %5:_(s48) = G_PTRTOINT %4(p8) %6:_(s256) = G_ZEXT %5(s48) ...