diff --git a/ghc/lib/std/Ix.lhs b/ghc/lib/std/Ix.lhs
index db17b458e352ef37fb3ee3e069bfb62d8dbc012a..545c266f43bf72db729fa79fed1f0ba49a8627ae 100644
--- a/ghc/lib/std/Ix.lhs
+++ b/ghc/lib/std/Ix.lhs
@@ -56,17 +56,21 @@ class  ({-Show a,-} Ord a) => Ix a  where
 
 \begin{code}
 instance  Ix Char  where
-    range (c,c')	=  [c..c']
+    range (c,c')
+      | c <= c'  	=  [c..c']
+      | otherwise       =  []
     index b@(c,_) ci
 	| inRange b ci	=  fromEnum ci - fromEnum c
 	| otherwise	=  indexError ci b "Char"
     inRange (m,n) i	=  m <= i && i <= n
 
 instance  Ix Int  where
-    range (m,n)		=  [m..n]
+    range (m,n)		
+      | m <= n	        =  [m..n]
+      | otherwise       =  []
     index b@(m,_) i
-	| inRange b i	=  i - m
-	| otherwise	=  indexError i b "Int"
+      | inRange b i	=  i - m
+      | otherwise	=  indexError i b "Int"
     inRange (m,n) i	=  m <= i && i <= n
 
 -- abstract these errors from the relevant index functions so that
@@ -84,13 +88,17 @@ indexError i rng tp
 
 ----------------------------------------------------------------------
 instance Ix Bool where -- as derived
-    range   (l,u)   = map toEnum [fromEnum l .. fromEnum u]
+    range   (l,u) 
+      | l <= u    = map toEnum [fromEnum l .. fromEnum u]
+      | otherwise = []
     index   (l,_) i = fromEnum i - fromEnum l
     inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
 
 ----------------------------------------------------------------------
 instance Ix Ordering where -- as derived
-    range   (l,u)   = map toEnum [fromEnum l .. fromEnum u]
+    range   (l,u)
+      | l <= u    = map toEnum [fromEnum l .. fromEnum u]
+      | otherwise = []
     index   (l,_) i = fromEnum i - fromEnum l
     inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
 
@@ -183,7 +191,10 @@ in the range for an @Ix@ pair:
 {-# SPECIALISE rangeSize :: (Int,Int) -> Int #-}
 rangeSize :: (Ix a) => (a,a) -> Int
 rangeSize b@(l,h)
- | l > h     = 0
- | otherwise = index b h + 1
+ | l > h  || isnull (range b) = 0
+ | otherwise		      = index b h + 1
+ where
+  isnull [] = True
+  isnull _  = False
 
 \end{code}
diff --git a/ghc/lib/std/PrelNum.lhs b/ghc/lib/std/PrelNum.lhs
index 5a835ad11991384db32ce9fdec305b89f18690de..08081353f35de6af763c98c4b3e2c8280058f10e 100644
--- a/ghc/lib/std/PrelNum.lhs
+++ b/ghc/lib/std/PrelNum.lhs
@@ -288,7 +288,10 @@ instance  Show Integer  where
 
 
 instance  Ix Integer  where
-    range (m,n)		=  [m..n]
+    range (m,n)		
+      | m <= n          =  [m..n]
+      | otherwise       =  []
+
     index b@(m,_) i
 	| inRange b i	=  fromInteger (i - m)
 	| otherwise	=  indexIntegerError i b