Alexander Richardson 3a4b351ba1
[IR] Introduce the ptrtoaddr instruction
This introduces a new `ptrtoaddr` instruction which is similar to
`ptrtoint` but has two differences:

1) Unlike `ptrtoint`, `ptrtoaddr` does not capture provenance
2) `ptrtoaddr` only extracts (and then extends/truncates) the low
   index-width bits of the pointer

For most architectures, difference 2) does not matter since index (address)
width and pointer representation width are the same, but this does make a
difference for architectures that have pointers that aren't just plain
integer addresses such as AMDGPU fat pointers or CHERI capabilities.

This commit introduces textual and bitcode IR support as well as basic code
generation, but optimization passes do not handle the new instruction yet
so it may result in worse code than using ptrtoint. Follow-up changes will
update capture tracking, etc. for the new instruction.

RFC: https://discourse.llvm.org/t/clarifiying-the-semantics-of-ptrtoint/83987/54

Reviewed By: nikic

Pull Request: https://github.com/llvm/llvm-project/pull/139357
2025-08-08 10:12:39 -07:00

97 lines
2.4 KiB
LLVM

; RUN: llvm-ir2vec entities | FileCheck %s
CHECK: 93
CHECK-NEXT: Ret 0
CHECK-NEXT: Br 1
CHECK-NEXT: Switch 2
CHECK-NEXT: IndirectBr 3
CHECK-NEXT: Invoke 4
CHECK-NEXT: Resume 5
CHECK-NEXT: Unreachable 6
CHECK-NEXT: CleanupRet 7
CHECK-NEXT: CatchRet 8
CHECK-NEXT: CatchSwitch 9
CHECK-NEXT: CallBr 10
CHECK-NEXT: FNeg 11
CHECK-NEXT: Add 12
CHECK-NEXT: FAdd 13
CHECK-NEXT: Sub 14
CHECK-NEXT: FSub 15
CHECK-NEXT: Mul 16
CHECK-NEXT: FMul 17
CHECK-NEXT: UDiv 18
CHECK-NEXT: SDiv 19
CHECK-NEXT: FDiv 20
CHECK-NEXT: URem 21
CHECK-NEXT: SRem 22
CHECK-NEXT: FRem 23
CHECK-NEXT: Shl 24
CHECK-NEXT: LShr 25
CHECK-NEXT: AShr 26
CHECK-NEXT: And 27
CHECK-NEXT: Or 28
CHECK-NEXT: Xor 29
CHECK-NEXT: Alloca 30
CHECK-NEXT: Load 31
CHECK-NEXT: Store 32
CHECK-NEXT: GetElementPtr 33
CHECK-NEXT: Fence 34
CHECK-NEXT: AtomicCmpXchg 35
CHECK-NEXT: AtomicRMW 36
CHECK-NEXT: Trunc 37
CHECK-NEXT: ZExt 38
CHECK-NEXT: SExt 39
CHECK-NEXT: FPToUI 40
CHECK-NEXT: FPToSI 41
CHECK-NEXT: UIToFP 42
CHECK-NEXT: SIToFP 43
CHECK-NEXT: FPTrunc 44
CHECK-NEXT: FPExt 45
CHECK-NEXT: PtrToInt 46
CHECK-NEXT: PtrToAddr 47
CHECK-NEXT: IntToPtr 48
CHECK-NEXT: BitCast 49
CHECK-NEXT: AddrSpaceCast 50
CHECK-NEXT: CleanupPad 51
CHECK-NEXT: CatchPad 52
CHECK-NEXT: ICmp 53
CHECK-NEXT: FCmp 54
CHECK-NEXT: PHI 55
CHECK-NEXT: Call 56
CHECK-NEXT: Select 57
CHECK-NEXT: UserOp1 58
CHECK-NEXT: UserOp2 59
CHECK-NEXT: VAArg 60
CHECK-NEXT: ExtractElement 61
CHECK-NEXT: InsertElement 62
CHECK-NEXT: ShuffleVector 63
CHECK-NEXT: ExtractValue 64
CHECK-NEXT: InsertValue 65
CHECK-NEXT: LandingPad 66
CHECK-NEXT: Freeze 67
CHECK-NEXT: FloatTy 68
CHECK-NEXT: FloatTy 69
CHECK-NEXT: FloatTy 70
CHECK-NEXT: FloatTy 71
CHECK-NEXT: FloatTy 72
CHECK-NEXT: FloatTy 73
CHECK-NEXT: FloatTy 74
CHECK-NEXT: VoidTy 75
CHECK-NEXT: LabelTy 76
CHECK-NEXT: MetadataTy 77
CHECK-NEXT: UnknownTy 78
CHECK-NEXT: TokenTy 79
CHECK-NEXT: IntegerTy 80
CHECK-NEXT: FunctionTy 81
CHECK-NEXT: PointerTy 82
CHECK-NEXT: StructTy 83
CHECK-NEXT: ArrayTy 84
CHECK-NEXT: VectorTy 85
CHECK-NEXT: VectorTy 86
CHECK-NEXT: PointerTy 87
CHECK-NEXT: UnknownTy 88
CHECK-NEXT: Function 89
CHECK-NEXT: Pointer 90
CHECK-NEXT: Constant 91
CHECK-NEXT: Variable 92