Skip to content

Commit 9f113d0

Browse files
committed
IRGen: ensure ordering of instructions (NFC)
Split out the subconstructors to ensure guaranteed IR ordering irrespective of order of evaluation of parameters which is not specified. This is needed for identical IRGen on Windows. NFC.
1 parent 47f9dd1 commit 9f113d0

File tree

1 file changed

+6
-7
lines changed

1 file changed

+6
-7
lines changed

lib/IRGen/GenExistential.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2108,10 +2108,9 @@ static llvm::Constant *getDeallocateBoxedOpaqueExistentialBufferFunction(
21082108
// Size = ((sizeof(HeapObject) + align) & ~align) + size
21092109
auto *heapHeaderSize = llvm::ConstantInt::get(
21102110
IGF.IGM.SizeTy, IGM.RefCountedStructSize.getValue());
2111-
size = Builder.CreateAdd(
2112-
Builder.CreateAnd(Builder.CreateAdd(heapHeaderSize, alignmentMask),
2113-
Builder.CreateNot(alignmentMask)),
2114-
size);
2111+
auto *Add = Builder.CreateAdd(heapHeaderSize, alignmentMask);
2112+
auto *Not = Builder.CreateNot(alignmentMask);
2113+
size = Builder.CreateAdd(Builder.CreateAnd(Add, Not), size);
21152114

21162115
// At least pointer aligned.
21172116
// AlignmentMask = alignmentMask | alignof(void*) - 1
@@ -2202,9 +2201,9 @@ getProjectBoxedOpaqueExistentialFunction(IRGenFunction &IGF,
22022201
// StartOffset = ((sizeof(HeapObject) + align) & ~align)
22032202
auto *heapHeaderSize = llvm::ConstantInt::get(
22042203
IGF.IGM.SizeTy, IGM.RefCountedStructSize.getValue());
2205-
auto *startOffset = Builder.CreateAnd(
2206-
Builder.CreateAdd(heapHeaderSize, alignmentMask),
2207-
Builder.CreateNot(alignmentMask));
2204+
auto *Add = Builder.CreateAdd(heapHeaderSize, alignmentMask);
2205+
auto *Not = Builder.CreateNot(alignmentMask);
2206+
auto *startOffset = Builder.CreateAnd(Add, Not);
22082207
auto *addressInBox =
22092208
IGF.emitByteOffsetGEP(boxReference, startOffset, IGM.OpaqueTy);
22102209
IGF.Builder.CreateRet(addressInBox);

0 commit comments

Comments
 (0)