diff --git a/rts/IOManager.c b/rts/IOManager.c
index 69fcdc2d9c74c964d88176f28668b467075fd000..5777df0871e1ee244b9d2d4fce5b71cc5bb3333a 100644
--- a/rts/IOManager.c
+++ b/rts/IOManager.c
@@ -45,6 +45,24 @@
 #include <string.h>
 
 
+/* We have lots of functions below with conditional implementations for
+ * different I/O managers. Some functions, for some I/O managers, naturally
+ * have implementations that do nothing or barf. When only one such I/O
+ * manager is enabled then the whole function implementation will have an
+ * implementation that does nothing or barfs. This then results in warnings
+ * from gcc that parameters are unused, or that the function should be marked
+ * with attribute noreturn (since barf does not return). The USED_IF_THREADS
+ * trick for fine-grained warning supression is fine for just two cases, but an
+ * equivalent here would need USED_IF_THE_ONLY_ENABLED_IOMGR_IS_X_OR_Y which
+ * would have combinitorial blowup. So we take a coarse grained approach and
+ * simply disable these two warnings for the whole file.
+ */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn"
+#pragma GCC diagnostic ignored "-Wmissing-noreturn"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+
+
 /* Global var to tell us which I/O manager impl we are using */
 IOManagerType iomgr_type;
 
@@ -305,7 +323,7 @@ initIOManager(void)
 /* Called from forkProcess in the child process on the surviving capability.
  */
 void
-initIOManagerAfterFork(Capability **pcap USED_IF_THREADS_AND_NOT_MINGW32)
+initIOManagerAfterFork(Capability **pcap)
 {
 
     switch (iomgr_type) {
@@ -370,7 +388,7 @@ stopIOManager(void)
 /* Called in the RTS shutdown after the scheduler exits
  */
 void
-exitIOManager(bool wait_threads USED_IF_NOT_THREADS_AND_MINGW32)
+exitIOManager(bool wait_threads)
 {
     switch (iomgr_type) {
 #if defined(IOMGR_ENABLED_WINIO)
@@ -424,9 +442,9 @@ void wakeupIOManager(void)
     }
 }
 
-void markCapabilityIOManager(evac_fn       evac  USED_IF_NOT_THREADS,
-                             void         *user  USED_IF_NOT_THREADS,
-                             CapIOManager *iomgr USED_IF_NOT_THREADS)
+void markCapabilityIOManager(evac_fn       evac,
+                             void         *user,
+                             CapIOManager *iomgr)
 {
 
     switch (iomgr_type) {
@@ -456,7 +474,7 @@ void markCapabilityIOManager(evac_fn       evac  USED_IF_NOT_THREADS,
  */
 #if !defined(mingw32_HOST_OS)
 void
-setIOManagerControlFd(uint32_t cap_no USED_IF_THREADS, int fd USED_IF_THREADS) {
+setIOManagerControlFd(uint32_t cap_no, int fd) {
 #if defined(THREADED_RTS)
     if (cap_no < getNumCapabilities()) {
         RELAXED_STORE(&getCapability(cap_no)->iomgr->control_fd, fd);
@@ -468,7 +486,7 @@ setIOManagerControlFd(uint32_t cap_no USED_IF_THREADS, int fd USED_IF_THREADS) {
 #endif
 
 
-bool anyPendingTimeoutsOrIO(CapIOManager *iomgr USED_IF_NOT_THREADS)
+bool anyPendingTimeoutsOrIO(CapIOManager *iomgr)
 {
     switch (iomgr_type) {
 #if defined(IOMGR_ENABLED_SELECT)
@@ -520,13 +538,11 @@ bool anyPendingTimeoutsOrIO(CapIOManager *iomgr USED_IF_NOT_THREADS)
     }
 }
 
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn"
 
-void syncIOWaitReady(Capability   *cap USED_IF_NOT_THREADS,
-                     StgTSO       *tso USED_IF_NOT_THREADS,
-                     IOReadOrWrite rw  USED_IF_NOT_THREADS,
-                     HsInt         fd  USED_IF_NOT_THREADS)
+void syncIOWaitReady(Capability   *cap,
+                     StgTSO       *tso,
+                     IOReadOrWrite rw,
+                     HsInt         fd)
 {
     ASSERT(tso->why_blocked == NotBlocked);
     switch (iomgr_type) {
@@ -600,7 +616,6 @@ void syncDelay(Capability *cap, StgTSO *tso, HsInt us_delay)
             barf("syncDelay not supported for I/O manager %d", iomgr_type);
     }
 }
-#pragma GCC diagnostic pop
 
 #if defined(IOMGR_ENABLED_SELECT) || defined(IOMGR_ENABLED_WIN32_LEGACY)
 void appendToIOBlockedQueue(Capability *cap, StgTSO *tso)
@@ -658,3 +673,7 @@ bool is_io_mng_native_p (void)
             return false;
     }
 }
+
+
+/* See comment above with the #pragma GCC diagnostic push */
+#pragma GCC diagnostic pop
diff --git a/rts/IOManager.h b/rts/IOManager.h
index 62be167d6eaf00db69c0e07a10941b0724342549..d1f2c3ea58ca7a3cf0cc36c72c9e78152f1e4063 100644
--- a/rts/IOManager.h
+++ b/rts/IOManager.h
@@ -317,19 +317,4 @@ bool anyPendingTimeoutsOrIO(CapIOManager *iomgr);
 void awaitEvent(Capability *cap, bool wait);
 #endif
 
-
-/* Pedantic warning cleanliness
- */
-#if !defined(THREADED_RTS) && defined(mingw32_HOST_OS)
-#define USED_IF_NOT_THREADS_AND_MINGW32
-#else
-#define USED_IF_NOT_THREADS_AND_MINGW32 STG_UNUSED
-#endif
-
-#if defined(THREADED_RTS) && !defined(mingw32_HOST_OS)
-#define USED_IF_THREADS_AND_NOT_MINGW32
-#else
-#define USED_IF_THREADS_AND_NOT_MINGW32 STG_UNUSED
-#endif
-
 #include "EndPrivate.h"