CmmParse: Don't force alignment in memcpy-ish operations
authorBen Gamari <ben@smart-cactus.org>
Mon, 3 Aug 2015 13:31:03 +0000 (15:31 +0200)
committerBen Gamari <ben@smart-cactus.org>
Mon, 3 Aug 2015 15:21:52 +0000 (17:21 +0200)
This was initially made in 681973c31c614185229bdae4f6b7ab4f6e64753d.
Here I wanted to enforce that the alignment passed to %memcpy was a
constant expression, as this is required by LLVM. However, this breaks
the knot-tying done in `loopDecls`, causing T8131 to hang.

Here I remove the `seq` and mark T8131 as `expect_broken` in the case
of the NCG, which doesn't force the alignment in this case.

Fixes #10664.

compiler/cmm/CmmParse.y
testsuite/tests/codeGen/should_fail/all.T

index 9638c14..ea0f4a5 100644 (file)
@@ -988,8 +988,7 @@ callishMachOps = listToUFM $
     memcpyLikeTweakArgs :: (Int -> CallishMachOp) -> [CmmExpr] -> (CallishMachOp, [CmmExpr])
     memcpyLikeTweakArgs op [] = pgmError "memcpy-like function requires at least one argument"
     memcpyLikeTweakArgs op args@(_:_) =
-        -- Force alignment with result to ensure pprPgmError fires
-        align `seq` (op align, args')
+        (op align, args')
       where
         args' = init args
         align = case last args of
index 39faebb..7e25b5f 100644 (file)
@@ -1,3 +1,5 @@
 # Tests for code generator and CMM parser
 
-test('T8131', cmm_src, compile_fail, [''])
+# Only the LLVM code generator consistently forces the alignment of
+# memcpy operations
+test('T8131', [cmm_src, only_ways(llvm_ways)], compile_fail, [''])