
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
97 lines
2.4 KiB
LLVM
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
|