[llvm] 5790cc0 - [IR] Use constant 64-bit indices for Extract/InsertElement (#208996)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 12 10:01:25 PDT 2026
Author: Andreas Jonson
Date: 2026-07-12T19:01:20+02:00
New Revision: 5790cc0f6c7f1570f8cca222c19801a6c7c2f076
URL: https://github.com/llvm/llvm-project/commit/5790cc0f6c7f1570f8cca222c19801a6c7c2f076
DIFF: https://github.com/llvm/llvm-project/commit/5790cc0f6c7f1570f8cca222c19801a6c7c2f076.diff
LOG: [IR] Use constant 64-bit indices for Extract/InsertElement (#208996)
The canonical form preferred by instCombine is to use 64-bit values for
constant index in ExtractElement and InsertElement
Added:
Modified:
llvm/docs/LangRef.md
llvm/lib/IR/Instructions.cpp
Removed:
################################################################################
diff --git a/llvm/docs/LangRef.md b/llvm/docs/LangRef.md
index aff4297492445..aecc425538d65 100644
--- a/llvm/docs/LangRef.md
+++ b/llvm/docs/LangRef.md
@@ -11429,7 +11429,7 @@ of `idx` exceeds the runtime length of the vector, the result is a
##### Example:
```text
-<result> = extractelement <4 x i32> %vec, i32 0 ; yields i32
+<result> = extractelement <4 x i32> %vec, i64 0 ; yields i32
```
(i_insertelement)=
@@ -11469,7 +11469,7 @@ is a {ref}`poison value <poisonvalues>`.
##### Example:
```text
-<result> = insertelement <4 x i32> %vec, i32 1, i32 0 ; yields <4 x i32>
+<result> = insertelement <4 x i32> %vec, i32 1, i64 0 ; yields <4 x i32>
```
(i_shufflevector)=
@@ -13458,12 +13458,12 @@ without storing it into memory and loading it with a
diff erent type.
; example with vectors
%v = <2 x i32> <i32 undef, i32 poison>
-%a = extractelement <2 x i32> %v, i32 0 ; undef
-%b = extractelement <2 x i32> %v, i32 1 ; poison
+%a = extractelement <2 x i32> %v, i64 0 ; undef
+%b = extractelement <2 x i32> %v, i64 1 ; poison
%add = add i32 %a, %a ; undef
%v.fr = freeze <2 x i32> %v ; element-wise freeze
-%d = extractelement <2 x i32> %v.fr, i32 0 ; not undef
+%d = extractelement <2 x i32> %v.fr, i64 0 ; not undef
%add.f = add i32 %d, %d ; even number
%l = load b32, ptr %p ; may be uninitialized
@@ -21715,7 +21715,7 @@ is taken from the third argument.
;;; Expansion.
;; Lanes at and above %pivot are taken from %on_false
-%atfirst = insertelement <4 x i32> poison, i32 %pivot, i32 0
+%atfirst = insertelement <4 x i32> poison, i32 %pivot, i64 0
%splat = shufflevector <4 x i32> %atfirst, <4 x i32> poison, <4 x i32> zeroinitializer
%pivotmask = icmp ult <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32> %splat
%mergemask = and <4 x i1> %cond, <4 x i1> %pivotmask
@@ -26006,20 +26006,20 @@ The semantics of this operation are equivalent to a sequence of conditional scal
%res = call <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr> align 8 %ptrs, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x double> poison)
;; The gather with all-true mask is equivalent to the following instruction sequence
-%ptr0 = extractelement <4 x ptr> %ptrs, i32 0
-%ptr1 = extractelement <4 x ptr> %ptrs, i32 1
-%ptr2 = extractelement <4 x ptr> %ptrs, i32 2
-%ptr3 = extractelement <4 x ptr> %ptrs, i32 3
+%ptr0 = extractelement <4 x ptr> %ptrs, i64 0
+%ptr1 = extractelement <4 x ptr> %ptrs, i64 1
+%ptr2 = extractelement <4 x ptr> %ptrs, i64 2
+%ptr3 = extractelement <4 x ptr> %ptrs, i64 3
%val0 = load double, ptr %ptr0, align 8
%val1 = load double, ptr %ptr1, align 8
%val2 = load double, ptr %ptr2, align 8
%val3 = load double, ptr %ptr3, align 8
-%vec0 = insertelement <4 x double> poison, %val0, 0
-%vec01 = insertelement <4 x double> %vec0, %val1, 1
-%vec012 = insertelement <4 x double> %vec01, %val2, 2
-%vec0123 = insertelement <4 x double> %vec012, %val3, 3
+%vec0 = insertelement <4 x double> poison, %val0, i64 0
+%vec01 = insertelement <4 x double> %vec0, %val1, i64 1
+%vec012 = insertelement <4 x double> %vec01, %val2, i64 2
+%vec0123 = insertelement <4 x double> %vec012, %val3, i64 3
```
(int_mscatter)=
@@ -26054,14 +26054,14 @@ The '`llvm.masked.scatter`' intrinsics is designed for writing selected vector e
call @llvm.masked.scatter.v8i32.v8p0(<8 x i32> %value, <8 x ptr> align 4 %ptrs, <8 x i1> <true, true, .. true>)
;; It is equivalent to a list of scalar stores
-%val0 = extractelement <8 x i32> %value, i32 0
-%val1 = extractelement <8 x i32> %value, i32 1
+%val0 = extractelement <8 x i32> %value, i64 0
+%val1 = extractelement <8 x i32> %value, i64 1
..
-%val7 = extractelement <8 x i32> %value, i32 7
-%ptr0 = extractelement <8 x ptr> %ptrs, i32 0
-%ptr1 = extractelement <8 x ptr> %ptrs, i32 1
+%val7 = extractelement <8 x i32> %value, i64 7
+%ptr0 = extractelement <8 x ptr> %ptrs, i64 0
+%ptr1 = extractelement <8 x ptr> %ptrs, i64 1
..
-%ptr7 = extractelement <8 x ptr> %ptrs, i32 7
+%ptr7 = extractelement <8 x ptr> %ptrs, i64 7
;; Note: the order of the following stores is important when they overlap:
store i32 %val0, ptr %ptr0, align 4
store i32 %val1, ptr %ptr1, align 4
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index ae04fb845112e..77d6981007b37 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -1754,7 +1754,7 @@ bool InsertElementInst::isValidOperands(const Value *Vec, const Value *Elt,
return false;// Second operand of insertelement must be vector element type.
if (!Index->getType()->isIntegerTy())
- return false; // Third operand of insertelement must be i32.
+ return false; // Third operand of insertelement must be an integer.
return true;
}
More information about the llvm-commits
mailing list