Skip to content

Commit 0aecc8f

Browse files
committed
Update PR based on feedback: add BuildGEP and ConstGEP variants that take an explicit set of GEPNoWrapFlags. Also, actually clone the no-wrap flags for constant GEP expressions, and add a test to verify this
1 parent 0171a6b commit 0aecc8f

File tree

5 files changed

+68
-31
lines changed

5 files changed

+68
-31
lines changed

llvm/docs/ReleaseNotes.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,9 +293,11 @@ They are described in detail in the `debug info migration guide <https://llvm.or
293293
* ``LLVMGetTargetExtTypeNumTypeParams``/``LLVMGetTargetExtTypeTypeParam``
294294
* ``LLVMGetTargetExtTypeNumIntParams``/``LLVMGetTargetExtTypeIntParam``
295295

296-
* Added the following functions for accessing/changing the no-wrap flags for a
296+
* Added the following functions for accessing/setting the no-wrap flags for a
297297
GetElementPtr instruction
298298

299+
* ``LLVMBuildGEPWithWrapFlags``
300+
* ``LLVMConstGEPWithWrapFlags``
299301
* ``LLVMGEPGetNoWrapFlags``
300302
* ``LLVMGEPSetNoWrapFlags``
301303

llvm/include/llvm-c/Core.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2409,6 +2409,10 @@ LLVMValueRef LLVMConstGEP2(LLVMTypeRef Ty, LLVMValueRef ConstantVal,
24092409
LLVMValueRef LLVMConstInBoundsGEP2(LLVMTypeRef Ty, LLVMValueRef ConstantVal,
24102410
LLVMValueRef *ConstantIndices,
24112411
unsigned NumIndices);
2412+
LLVMValueRef LLVMConstGEPWithWrapFlags(LLVMTypeRef Ty, LLVMValueRef ConstantVal,
2413+
LLVMValueRef *ConstantIndices,
2414+
unsigned NumIndices,
2415+
LLVMGEPNoWrapFlags WrapFlags);
24122416
LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
24132417
LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
24142418
LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
@@ -4391,6 +4395,11 @@ LLVMValueRef LLVMBuildGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
43914395
LLVMValueRef LLVMBuildInBoundsGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
43924396
LLVMValueRef Pointer, LLVMValueRef *Indices,
43934397
unsigned NumIndices, const char *Name);
4398+
LLVMValueRef LLVMBuildGEPWithWrapFlags(LLVMBuilderRef B, LLVMTypeRef Ty,
4399+
LLVMValueRef Pointer,
4400+
LLVMValueRef *Indices,
4401+
unsigned NumIndices, const char *Name,
4402+
LLVMGEPNoWrapFlags WrapFlags);
43944403
LLVMValueRef LLVMBuildStructGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
43954404
LLVMValueRef Pointer, unsigned Idx,
43964405
const char *Name);

llvm/lib/IR/Core.cpp

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,6 +1685,32 @@ static int map_from_llvmopcode(LLVMOpcode code)
16851685
llvm_unreachable("Unhandled Opcode.");
16861686
}
16871687

1688+
/*-- GEP wrap flag conversions*/
1689+
1690+
static GEPNoWrapFlags mapFromLLVMGEPNoWrapFlags(LLVMGEPNoWrapFlags GEPFlags) {
1691+
GEPNoWrapFlags NewGEPFlags;
1692+
if ((GEPFlags & LLVMGEPFlagInBounds) != 0)
1693+
NewGEPFlags |= GEPNoWrapFlags::inBounds();
1694+
if ((GEPFlags & LLVMGEPFlagNUSW) != 0)
1695+
NewGEPFlags |= GEPNoWrapFlags::noUnsignedSignedWrap();
1696+
if ((GEPFlags & LLVMGEPFlagNUW) != 0)
1697+
NewGEPFlags |= GEPNoWrapFlags::noUnsignedWrap();
1698+
1699+
return NewGEPFlags;
1700+
}
1701+
1702+
static LLVMGEPNoWrapFlags mapToLLVMGEPNoWrapFlags(GEPNoWrapFlags GEPFlags) {
1703+
LLVMGEPNoWrapFlags NewGEPFlags = 0;
1704+
if (GEPFlags.isInBounds())
1705+
NewGEPFlags |= LLVMGEPFlagInBounds;
1706+
if (GEPFlags.hasNoUnsignedSignedWrap())
1707+
NewGEPFlags |= LLVMGEPFlagNUSW;
1708+
if (GEPFlags.hasNoUnsignedWrap())
1709+
NewGEPFlags |= LLVMGEPFlagNUW;
1710+
1711+
return NewGEPFlags;
1712+
}
1713+
16881714
/*--.. Constant expressions ................................................--*/
16891715

16901716
LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal) {
@@ -1789,6 +1815,17 @@ LLVMValueRef LLVMConstInBoundsGEP2(LLVMTypeRef Ty, LLVMValueRef ConstantVal,
17891815
return wrap(ConstantExpr::getInBoundsGetElementPtr(unwrap(Ty), Val, IdxList));
17901816
}
17911817

1818+
LLVMValueRef LLVMConstGEPWithWrapFlags(LLVMTypeRef Ty, LLVMValueRef ConstantVal,
1819+
LLVMValueRef *ConstantIndices,
1820+
unsigned NumIndices,
1821+
LLVMGEPNoWrapFlags WrapFlags) {
1822+
ArrayRef<Constant *> IdxList(unwrap<Constant>(ConstantIndices, NumIndices),
1823+
NumIndices);
1824+
Constant *Val = unwrap<Constant>(ConstantVal);
1825+
return wrap(ConstantExpr::getGetElementPtr(
1826+
unwrap(Ty), Val, IdxList, mapFromLLVMGEPNoWrapFlags(WrapFlags)));
1827+
}
1828+
17921829
LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
17931830
return wrap(ConstantExpr::getTrunc(unwrap<Constant>(ConstantVal),
17941831
unwrap(ToType)));
@@ -3090,30 +3127,6 @@ LLVMTypeRef LLVMGetAllocatedType(LLVMValueRef Alloca) {
30903127

30913128
/*--.. Operations on gep instructions (only) ...............................--*/
30923129

3093-
static GEPNoWrapFlags mapFromLLVMGEPNoWrapFlags(LLVMGEPNoWrapFlags GEPFlags) {
3094-
GEPNoWrapFlags NewGEPFlags;
3095-
if ((GEPFlags & LLVMGEPFlagInBounds) != 0)
3096-
NewGEPFlags |= GEPNoWrapFlags::inBounds();
3097-
if ((GEPFlags & LLVMGEPFlagNUSW) != 0)
3098-
NewGEPFlags |= GEPNoWrapFlags::noUnsignedSignedWrap();
3099-
if ((GEPFlags & LLVMGEPFlagNUW) != 0)
3100-
NewGEPFlags |= GEPNoWrapFlags::noUnsignedWrap();
3101-
3102-
return NewGEPFlags;
3103-
}
3104-
3105-
static LLVMGEPNoWrapFlags mapToLLVMGEPNoWrapFlags(GEPNoWrapFlags GEPFlags) {
3106-
LLVMGEPNoWrapFlags NewGEPFlags = 0;
3107-
if (GEPFlags.isInBounds())
3108-
NewGEPFlags |= LLVMGEPFlagInBounds;
3109-
if (GEPFlags.hasNoUnsignedSignedWrap())
3110-
NewGEPFlags |= LLVMGEPFlagNUSW;
3111-
if (GEPFlags.hasNoUnsignedWrap())
3112-
NewGEPFlags |= LLVMGEPFlagNUW;
3113-
3114-
return NewGEPFlags;
3115-
}
3116-
31173130
LLVMBool LLVMIsInBounds(LLVMValueRef GEP) {
31183131
return unwrap<GEPOperator>(GEP)->isInBounds();
31193132
}
@@ -3936,6 +3949,16 @@ LLVMValueRef LLVMBuildInBoundsGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
39363949
unwrap(B)->CreateInBoundsGEP(unwrap(Ty), unwrap(Pointer), IdxList, Name));
39373950
}
39383951

3952+
LLVMValueRef LLVMBuildGEPWithWrapFlags(LLVMBuilderRef B, LLVMTypeRef Ty,
3953+
LLVMValueRef Pointer,
3954+
LLVMValueRef *Indices,
3955+
unsigned NumIndices, const char *Name,
3956+
LLVMGEPNoWrapFlags WrapFlags) {
3957+
ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
3958+
return wrap(unwrap(B)->CreateGEP(unwrap(Ty), unwrap(Pointer), IdxList, Name,
3959+
mapFromLLVMGEPNoWrapFlags(WrapFlags)));
3960+
}
3961+
39393962
LLVMValueRef LLVMBuildStructGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
39403963
LLVMValueRef Pointer, unsigned Idx,
39413964
const char *Name) {

llvm/test/Bindings/llvm-c/echo.ll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ module asm "classical GAS"
2525

2626
@const_gep = global ptr getelementptr (i32, ptr @var, i64 2)
2727
@const_inbounds_gep = global ptr getelementptr inbounds (i32, ptr @var, i64 1)
28+
@const_gep_nuw = global ptr getelementptr nuw (i32, ptr @var, i64 1)
29+
@const_gep_nusw = global ptr getelementptr nusw (i32, ptr @var, i64 1)
30+
@const_gep_nuw_inbounds = global ptr getelementptr nuw inbounds (i32, ptr @var, i64 1)
2831

2932
@aliased1 = alias i32, ptr @var
3033
@aliased2 = internal alias i32, ptr @var

llvm/tools/llvm-c-test/echo.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -412,10 +412,9 @@ static LLVMValueRef clone_constant_impl(LLVMValueRef Cst, LLVMModuleRef M) {
412412
SmallVector<LLVMValueRef, 8> Idx;
413413
for (int i = 1; i <= NumIdx; i++)
414414
Idx.push_back(clone_constant(LLVMGetOperand(Cst, i), M));
415-
if (LLVMIsInBounds(Cst))
416-
return LLVMConstInBoundsGEP2(ElemTy, Ptr, Idx.data(), NumIdx);
417-
else
418-
return LLVMConstGEP2(ElemTy, Ptr, Idx.data(), NumIdx);
415+
416+
return LLVMConstGEPWithWrapFlags(ElemTy, Ptr, Idx.data(), NumIdx,
417+
LLVMGEPGetNoWrapFlags(Cst));
419418
}
420419
default:
421420
fprintf(stderr, "%d is not a supported opcode for constant expressions\n",
@@ -768,8 +767,9 @@ struct FunCloner {
768767
for (int i = 1; i <= NumIdx; i++)
769768
Idx.push_back(CloneValue(LLVMGetOperand(Src, i)));
770769

771-
Dst = LLVMBuildGEP2(Builder, ElemTy, Ptr, Idx.data(), NumIdx, Name);
772-
LLVMGEPSetNoWrapFlags(Dst, LLVMGEPGetNoWrapFlags(Src));
770+
Dst =
771+
LLVMBuildGEPWithWrapFlags(Builder, ElemTy, Ptr, Idx.data(), NumIdx,
772+
Name, LLVMGEPGetNoWrapFlags(Src));
773773
break;
774774
}
775775
case LLVMAtomicRMW: {

0 commit comments

Comments
 (0)