diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index b1ea722674e9bc58c7dbdcf509fc049b7dfb6211..46e3470ae384e6d514be676da39b27560f4b1694 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.84 2001/12/23 07:25:39 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.85 2001/12/28 18:16:41 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -617,10 +617,15 @@ begin:;
 	START_CRIT_SECTION();
 
 	/* update LogwrtResult before doing cache fill check */
-	SpinLockAcquire_NoHoldoff(&XLogCtl->info_lck);
-	LogwrtRqst = XLogCtl->LogwrtRqst;
-	LogwrtResult = XLogCtl->LogwrtResult;
-	SpinLockRelease_NoHoldoff(&XLogCtl->info_lck);
+	{
+		/* use volatile pointer to prevent code rearrangement */
+		volatile XLogCtlData *xlogctl = XLogCtl;
+
+		SpinLockAcquire_NoHoldoff(&xlogctl->info_lck);
+		LogwrtRqst = xlogctl->LogwrtRqst;
+		LogwrtResult = xlogctl->LogwrtResult;
+		SpinLockRelease_NoHoldoff(&xlogctl->info_lck);
+	}
 
 	/*
 	 * If cache is half filled then try to acquire write lock and do
@@ -838,16 +843,20 @@ begin:;
 
 	if (updrqst)
 	{
-		SpinLockAcquire_NoHoldoff(&XLogCtl->info_lck);
+		/* use volatile pointer to prevent code rearrangement */
+		volatile XLogCtlData *xlogctl = XLogCtl;
+
+		SpinLockAcquire_NoHoldoff(&xlogctl->info_lck);
 		/* advance global request to include new block(s) */
-		if (XLByteLT(XLogCtl->LogwrtRqst.Write, WriteRqst))
-			XLogCtl->LogwrtRqst.Write = WriteRqst;
+		if (XLByteLT(xlogctl->LogwrtRqst.Write, WriteRqst))
+			xlogctl->LogwrtRqst.Write = WriteRqst;
 		/* update local result copy while I have the chance */
-		LogwrtResult = XLogCtl->LogwrtResult;
-		SpinLockRelease_NoHoldoff(&XLogCtl->info_lck);
+		LogwrtResult = xlogctl->LogwrtResult;
+		SpinLockRelease_NoHoldoff(&xlogctl->info_lck);
 	}
 
 	END_CRIT_SECTION();
+
 	return (RecPtr);
 }
 
@@ -892,11 +901,16 @@ AdvanceXLInsertBuffer(void)
 		FinishedPageRqstPtr = XLogCtl->xlblocks[Insert->curridx];
 
 		/* Before waiting, get info_lck and update LogwrtResult */
-		SpinLockAcquire_NoHoldoff(&XLogCtl->info_lck);
-		if (XLByteLT(XLogCtl->LogwrtRqst.Write, FinishedPageRqstPtr))
-			XLogCtl->LogwrtRqst.Write = FinishedPageRqstPtr;
-		LogwrtResult = XLogCtl->LogwrtResult;
-		SpinLockRelease_NoHoldoff(&XLogCtl->info_lck);
+		{
+			/* use volatile pointer to prevent code rearrangement */
+			volatile XLogCtlData *xlogctl = XLogCtl;
+
+			SpinLockAcquire_NoHoldoff(&xlogctl->info_lck);
+			if (XLByteLT(xlogctl->LogwrtRqst.Write, FinishedPageRqstPtr))
+				xlogctl->LogwrtRqst.Write = FinishedPageRqstPtr;
+			LogwrtResult = xlogctl->LogwrtResult;
+			SpinLockRelease_NoHoldoff(&xlogctl->info_lck);
+		}
 
 		update_needed = false;	/* Did the shared-request update */
 
@@ -1149,13 +1163,18 @@ XLogWrite(XLogwrtRqst WriteRqst)
 	 * 'result' values.  This is not absolutely essential, but it saves
 	 * some code in a couple of places.
 	 */
-	SpinLockAcquire_NoHoldoff(&XLogCtl->info_lck);
-	XLogCtl->LogwrtResult = LogwrtResult;
-	if (XLByteLT(XLogCtl->LogwrtRqst.Write, LogwrtResult.Write))
-		XLogCtl->LogwrtRqst.Write = LogwrtResult.Write;
-	if (XLByteLT(XLogCtl->LogwrtRqst.Flush, LogwrtResult.Flush))
-		XLogCtl->LogwrtRqst.Flush = LogwrtResult.Flush;
-	SpinLockRelease_NoHoldoff(&XLogCtl->info_lck);
+	{
+		/* use volatile pointer to prevent code rearrangement */
+		volatile XLogCtlData *xlogctl = XLogCtl;
+
+		SpinLockAcquire_NoHoldoff(&xlogctl->info_lck);
+		xlogctl->LogwrtResult = LogwrtResult;
+		if (XLByteLT(xlogctl->LogwrtRqst.Write, LogwrtResult.Write))
+			xlogctl->LogwrtRqst.Write = LogwrtResult.Write;
+		if (XLByteLT(xlogctl->LogwrtRqst.Flush, LogwrtResult.Flush))
+			xlogctl->LogwrtRqst.Flush = LogwrtResult.Flush;
+		SpinLockRelease_NoHoldoff(&xlogctl->info_lck);
+	}
 
 	Write->LogwrtResult = LogwrtResult;
 }
@@ -1206,11 +1225,16 @@ XLogFlush(XLogRecPtr record)
 	WriteRqstPtr = record;
 
 	/* read LogwrtResult and update local state */
-	SpinLockAcquire_NoHoldoff(&XLogCtl->info_lck);
-	if (XLByteLT(WriteRqstPtr, XLogCtl->LogwrtRqst.Write))
-		WriteRqstPtr = XLogCtl->LogwrtRqst.Write;
-	LogwrtResult = XLogCtl->LogwrtResult;
-	SpinLockRelease_NoHoldoff(&XLogCtl->info_lck);
+	{
+		/* use volatile pointer to prevent code rearrangement */
+		volatile XLogCtlData *xlogctl = XLogCtl;
+
+		SpinLockAcquire_NoHoldoff(&xlogctl->info_lck);
+		if (XLByteLT(WriteRqstPtr, xlogctl->LogwrtRqst.Write))
+			WriteRqstPtr = xlogctl->LogwrtRqst.Write;
+		LogwrtResult = xlogctl->LogwrtResult;
+		SpinLockRelease_NoHoldoff(&xlogctl->info_lck);
+	}
 
 	/* done already? */
 	if (!XLByteLE(record, LogwrtResult.Flush))
diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c
index 3304ec67c595fe354d058c67e8378d8fbac445a1..2b0eee5e4f29fec4aa9e1cc7b7afd7a598a0c992 100644
--- a/src/backend/storage/ipc/shmem.c
+++ b/src/backend/storage/ipc/shmem.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.62 2001/10/25 05:49:42 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.63 2001/12/28 18:16:43 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -132,21 +132,23 @@ ShmemAlloc(Size size)
 {
 	uint32		newFree;
 	void	   *newSpace;
+	/* use volatile pointer to prevent code rearrangement */
+	volatile PGShmemHeader *shmemseghdr = ShmemSegHdr;
 
 	/*
 	 * ensure all space is adequately aligned.
 	 */
 	size = MAXALIGN(size);
 
-	Assert(ShmemSegHdr != NULL);
+	Assert(shmemseghdr != NULL);
 
 	SpinLockAcquire(ShmemLock);
 
-	newFree = ShmemSegHdr->freeoffset + size;
-	if (newFree <= ShmemSegHdr->totalsize)
+	newFree = shmemseghdr->freeoffset + size;
+	if (newFree <= shmemseghdr->totalsize)
 	{
-		newSpace = (void *) MAKE_PTR(ShmemSegHdr->freeoffset);
-		ShmemSegHdr->freeoffset = newFree;
+		newSpace = (void *) MAKE_PTR(shmemseghdr->freeoffset);
+		shmemseghdr->freeoffset = newFree;
 	}
 	else
 		newSpace = NULL;
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index 5fa8f133e5754d8a1c13376a3a79f60bb4c3e232..b1be68a881f57ffda6a7548d78e94684354379e2 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.116 2001/11/08 20:37:52 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.117 2001/12/28 18:16:43 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -203,12 +203,14 @@ void
 InitProcess(void)
 {
 	SHMEM_OFFSET myOffset;
+	/* use volatile pointer to prevent code rearrangement */
+	volatile PROC_HDR *procglobal = ProcGlobal;
 
 	/*
 	 * ProcGlobal should be set by a previous call to InitProcGlobal (if
 	 * we are a backend, we inherit this by fork() from the postmaster).
 	 */
-	if (ProcGlobal == NULL)
+	if (procglobal == NULL)
 		elog(STOP, "InitProcess: Proc Header uninitialized");
 
 	if (MyProc != NULL)
@@ -219,12 +221,12 @@ InitProcess(void)
 	 */
 	SpinLockAcquire(ProcStructLock);
 
-	myOffset = ProcGlobal->freeProcs;
+	myOffset = procglobal->freeProcs;
 
 	if (myOffset != INVALID_OFFSET)
 	{
 		MyProc = (PROC *) MAKE_PTR(myOffset);
-		ProcGlobal->freeProcs = MyProc->links.next;
+		procglobal->freeProcs = MyProc->links.next;
 		SpinLockRelease(ProcStructLock);
 	}
 	else
@@ -437,6 +439,9 @@ ProcReleaseLocks(bool isCommit)
 static void
 ProcKill(void)
 {
+	/* use volatile pointer to prevent code rearrangement */
+	volatile PROC_HDR *procglobal = ProcGlobal;
+
 	Assert(MyProc != NULL);
 
 	/* Release any LW locks I am holding */
@@ -463,8 +468,8 @@ ProcKill(void)
 		ProcFreeSem(MyProc->sem.semId, MyProc->sem.semNum);
 
 	/* Add PROC struct to freelist so space can be recycled in future */
-	MyProc->links.next = ProcGlobal->freeProcs;
-	ProcGlobal->freeProcs = MAKE_OFFSET(MyProc);
+	MyProc->links.next = procglobal->freeProcs;
+	procglobal->freeProcs = MAKE_OFFSET(MyProc);
 
 	/* PROC struct isn't mine anymore */
 	MyProc = NULL;
@@ -1044,10 +1049,12 @@ disable_sigalrm_interrupt(void)
 static void
 ProcGetNewSemIdAndNum(IpcSemaphoreId *semId, int *semNum)
 {
-	int			i;
-	int			semMapEntries = ProcGlobal->semMapEntries;
-	SEM_MAP_ENTRY *procSemMap = ProcGlobal->procSemMap;
+	/* use volatile pointer to prevent code rearrangement */
+	volatile PROC_HDR *procglobal = ProcGlobal;
+	int			semMapEntries = procglobal->semMapEntries;
+	volatile SEM_MAP_ENTRY *procSemMap = procglobal->procSemMap;
 	int32		fullmask = (1 << PROC_NSEMS_PER_SET) - 1;
+	int			i;
 
 	SpinLockAcquire(ProcStructLock);