diff --git a/Data/Text.hs b/Data/Text.hs
index fa4050340684cebd55e4d9687b06ecfb7062b61e..dd1b821ce754610285ff30d6958d229cef85c368 100644
--- a/Data/Text.hs
+++ b/Data/Text.hs
@@ -1107,15 +1107,15 @@ replicate n t@(Text a o l)
     | isSingleton t          = replicateChar n (unsafeHead t)
     | otherwise              = Text (A.run x) 0 len
   where
-    len = l `mul` n
+    len = l `mul` n -- TODO: detect overflows
     x :: ST s (A.MArray s)
     x = do
       arr <- A.new len
       A.copyI arr 0 a o l
-      let loop !l =
-            let l2 = l `shiftL` 1 in
-            if l2 > len then A.copyM arr l arr 0 (len - l) >> return arr
-            else A.copyM arr l arr 0 l >> loop l2
+      let loop !l1 =
+            let rest = len - l1 in
+            if rest <= l1 then A.copyM arr l1 arr 0 rest >> return arr
+            else A.copyM arr l1 arr 0 l1 >> loop (l1 `shiftL` 1)
       loop l
 {-# INLINE [1] replicate #-}