- The bundle operands for an unknown operand bundle escape in unknown
ways before control is transferred to the callee or invokee.
- Calls and invokes with operand bundles have unknown read / write
- effect on the heap on entry and exit (even if the call target is
- ``readnone`` or ``readonly``), unless they're overridden with
+ effect on the heap on entry and exit (even if the call target specifies
+ a ``memory`` attribute), unless they're overridden with
callsite specific attributes.
- An operand bundle at a call site cannot change the implementation
of the called function. Inter-procedural optimizations work as
return &s[1].Z.B[5][13];
}
-The LLVM code generated by Clang is:
+The LLVM code generated by Clang is approximately:
.. code-block:: llvm
%struct.RT = type { i8, [10 x [20 x i32]], i8 }
%struct.ST = type { i32, double, %struct.RT }
- define ptr @foo(ptr %s) nounwind uwtable readnone optsize ssp {
+ define ptr @foo(ptr %s) {
entry:
%arrayidx = getelementptr inbounds %struct.ST, ptr %s, i64 1, i32 2, i32 1, i64 5, i64 13
ret ptr %arrayidx
declare <pointer type>
@llvm.experimental.gc.get.pointer.base(
<pointer type> readnone nocapture %derived_ptr)
- nounwind readnone willreturn
+ nounwind willreturn memory(none)
Overview:
"""""""""
declare i64
@llvm.experimental.gc.get.pointer.offset(
<pointer type> readnone nocapture %derived_ptr)
- nounwind readnone willreturn
+ nounwind willreturn memory(none)
Overview:
"""""""""
::
- declare type @llvm.ssa.copy(type %operand) returned(1) readnone
+ declare type @llvm.ssa.copy(type returned %operand) memory(none)
Arguments:
""""""""""
::
- declare i1 @llvm.type.test(ptr %ptr, metadata %type) nounwind readnone
+ declare i1 @llvm.type.test(ptr %ptr, metadata %type) nounwind memory(none)
Arguments:
::
- declare {ptr, i1} @llvm.type.checked.load(ptr %ptr, i32 %offset, metadata %type) argmemonly nounwind readonly
+ declare {ptr, i1} @llvm.type.checked.load(ptr %ptr, i32 %offset, metadata %type) nounwind memory(argmem: read)
Arguments:
::
- declare void @llvm.donothing() nounwind readnone
+ declare void @llvm.donothing() nounwind memory(none)
Overview:
"""""""""
::
- declare ptr @llvm.load.relative.iN(ptr %ptr, iN %offset) argmemonly nounwind readonly
+ declare ptr @llvm.load.relative.iN(ptr %ptr, iN %offset) nounwind memory(argmem: read)
Overview:
"""""""""
::
- declare i1 @llvm.is.constant.i32(i32 %operand) nounwind readnone
- declare i1 @llvm.is.constant.f32(float %operand) nounwind readnone
- declare i1 @llvm.is.constant.TYPENAME(TYPE %operand) nounwind readnone
+ declare i1 @llvm.is.constant.i32(i32 %operand) nounwind memory(none)
+ declare i1 @llvm.is.constant.f32(float %operand) nounwind memory(none)
+ declare i1 @llvm.is.constant.TYPENAME(TYPE %operand) nounwind memory(none)
Overview:
"""""""""
::
- declare ptrty llvm.ptrmask(ptrty %ptr, intty %mask) readnone speculatable
+ declare ptrty llvm.ptrmask(ptrty %ptr, intty %mask) speculatable memory(none)
Arguments:
""""""""""
::
- declare ptr @llvm.threadlocal.address(ptr) nounwind readnone willreturn
+ declare ptr @llvm.threadlocal.address(ptr) nounwind willreturn memory(none)
Arguments:
""""""""""