Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
414d1fe1 by Cheng Shao at 2026-01-06T19:39:20-05:00
compiler: fix LLVM backend pdep/pext handling for i386 target
This patch fixes LLVM backend's pdep/pext handling for i386 target,
and also removes non-existent 128/256/512 bit hs_pdep/hs_pext callees.
See amended note for more explanation. Fixes #26450.
Co-authored-by: Codex
- - - - -
c7f6fba3 by Cheng Shao at 2026-01-06T19:39:20-05:00
ci: remove allow_failure flag for i386 alpine job
The LLVM codegen issue for i386 has been fixed, and the i386 alpine
job should pass now. This commit removes the allow_failure flag so
that other i386 regressions in the future are signaled more timely.
- - - - -
3 changed files:
- .gitlab/generate-ci/gen_ci.hs
- .gitlab/jobs.yaml
- compiler/GHC/CmmToLlvm/CodeGen.hs
Changes:
=====================================
.gitlab/generate-ci/gen_ci.hs
=====================================
@@ -1250,7 +1250,7 @@ alpine_x86 =
, fullyStaticBrokenTests (disableValidate (allowFailureGroup (standardBuildsWithConfig Amd64 (Linux Alpine312) staticNativeInt)))
-- Dynamically linked build, suitable for building your own static executables on alpine
, disableValidate (standardBuildsWithConfig Amd64 (Linux Alpine323) (splitSectionsBroken vanilla))
- , allowFailureGroup (standardBuildsWithConfig I386 (Linux Alpine323) (splitSectionsBroken vanilla))
+ , standardBuildsWithConfig I386 (Linux Alpine323) (splitSectionsBroken vanilla)
]
where
-- ghcilink002 broken due to #17869
=====================================
.gitlab/jobs.yaml
=====================================
@@ -484,7 +484,7 @@
".gitlab/ci.sh clean",
"cat ci_timings.txt"
],
- "allow_failure": true,
+ "allow_failure": false,
"artifacts": {
"expire_in": "2 weeks",
"paths": [
@@ -1155,7 +1155,7 @@
".gitlab/ci.sh clean",
"cat ci_timings.txt"
],
- "allow_failure": true,
+ "allow_failure": false,
"artifacts": {
"expire_in": "8 weeks",
"paths": [
@@ -4034,7 +4034,7 @@
".gitlab/ci.sh clean",
"cat ci_timings.txt"
],
- "allow_failure": true,
+ "allow_failure": false,
"artifacts": {
"expire_in": "1 year",
"paths": [
=====================================
compiler/GHC/CmmToLlvm/CodeGen.hs
=====================================
@@ -248,6 +248,14 @@ Since x86 PDep/PExt instructions only exist for 32/64 bit widths
we use the 32bit variant to compute the 8/16bit primops.
To do so we extend/truncate the argument/result around the
call.
+
+Note that the 64-bit intrinsics (`llvm.x86.bmi.pdep.64` and
+`llvm.x86.bmi.pext.64`) are only legal on 64-bit x86 targets, not on
+i386. Therefore on i386 we must fall back to the runtime helper
+(`hs_pdep64`/`hs_pext64`) for the 64-bit primops.
+
+See https://github.com/llvm/llvm-project/issues/172857 for upstream
+discussion about portable pdep/pext intrinsics.
-}
genCall (PrimTarget op@(MO_Pdep w)) [dst] args = do
cfg <- getConfig
@@ -970,36 +978,34 @@ cmmPrimOpFunctions mop = do
W8 -> fsLit "llvm.x86.bmi.pdep.32"
W16 -> fsLit "llvm.x86.bmi.pdep.32"
W32 -> fsLit "llvm.x86.bmi.pdep.32"
- W64 -> fsLit "llvm.x86.bmi.pdep.64"
- W128 -> fsLit "llvm.x86.bmi.pdep.128"
- W256 -> fsLit "llvm.x86.bmi.pdep.256"
- W512 -> fsLit "llvm.x86.bmi.pdep.512"
+ W64
+ | is32bit -> fsLit "hs_pdep64"
+ | otherwise -> fsLit "llvm.x86.bmi.pdep.64"
+ -- LLVM only provides x86 PDep/PExt intrinsics for 32/64 bits
+ _ -> unsupported
| otherwise -> case w of
W8 -> fsLit "hs_pdep8"
W16 -> fsLit "hs_pdep16"
W32 -> fsLit "hs_pdep32"
W64 -> fsLit "hs_pdep64"
- W128 -> fsLit "hs_pdep128"
- W256 -> fsLit "hs_pdep256"
- W512 -> fsLit "hs_pdep512"
+ _ -> unsupported
MO_Pext w
| isBmi2Enabled -> case w of
-- See Note [LLVM PDep/PExt intrinsics]
W8 -> fsLit "llvm.x86.bmi.pext.32"
W16 -> fsLit "llvm.x86.bmi.pext.32"
W32 -> fsLit "llvm.x86.bmi.pext.32"
- W64 -> fsLit "llvm.x86.bmi.pext.64"
- W128 -> fsLit "llvm.x86.bmi.pext.128"
- W256 -> fsLit "llvm.x86.bmi.pext.256"
- W512 -> fsLit "llvm.x86.bmi.pext.512"
+ W64
+ | is32bit -> fsLit "hs_pext64"
+ | otherwise -> fsLit "llvm.x86.bmi.pext.64"
+ -- LLVM only provides x86 PDep/PExt intrinsics for 32/64 bits
+ _ -> unsupported
| otherwise -> case w of
W8 -> fsLit "hs_pext8"
W16 -> fsLit "hs_pext16"
W32 -> fsLit "hs_pext32"
W64 -> fsLit "hs_pext64"
- W128 -> fsLit "hs_pext128"
- W256 -> fsLit "hs_pext256"
- W512 -> fsLit "hs_pext512"
+ _ -> unsupported
MO_AddIntC w -> case w of
W8 -> fsLit "llvm.sadd.with.overflow.i8"
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/4079dcd6418763f0a7b255d834c0353...
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/4079dcd6418763f0a7b255d834c0353...
You're receiving this email because of your account on gitlab.haskell.org.