Skip to content

[SelectionDAG] Improve CLMUL lowering for Promote types wider than register width#209265

Merged
topperc merged 3 commits into
llvm:mainfrom
xarkenz:clmul-lowering
Jul 14, 2026
Merged

[SelectionDAG] Improve CLMUL lowering for Promote types wider than register width#209265
topperc merged 3 commits into
llvm:mainfrom
xarkenz:clmul-lowering

Conversation

@xarkenz

@xarkenz xarkenz commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

For ISD::CLMUL, add a check to PromoteIntRes_CLMUL to take advantage of the cross-product expansion in ExpandIntRes_CLMUL when possible for Promote types which are wider than the register width (e.g. i96 for 64-bit registers).

@llvmorg-github-actions

llvmorg-github-actions Bot commented Jul 13, 2026

Copy link
Copy Markdown

@llvm/pr-subscribers-backend-risc-v
@llvm/pr-subscribers-llvm-selectiondag

@llvm/pr-subscribers-backend-aarch64

Author: Sean Clarke (xarkenz)

Changes

For ISD::CLMUL, add a check to PromoteIntRes_CLMUL to take advantage of the cross-product expansion in ExpandIntRes_CLMUL when possible for types which are wider than the register width (e.g. i96 for 64-bit registers).


Patch is 1.11 MiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/209265.diff

4 Files Affected:

  • (modified) llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp (+4-1)
  • (modified) llvm/test/CodeGen/AArch64/clmul.ll (+699)
  • (modified) llvm/test/CodeGen/RISCV/clmul.ll (+25765-1873)
  • (modified) llvm/test/CodeGen/X86/clmul.ll (+1726)
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
index 2488fb948262e..b1c92803363c7 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -1752,7 +1752,10 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CLMUL(SDNode *N) {
   EVT VT = TLI.getTypeToTransformTo(*DAG.getContext(), OldVT);
 
   if (Opcode == ISD::CLMUL) {
-    if (!TLI.isOperationLegalOrCustomOrPromote(ISD::CLMUL, VT)) {
+    if (!TLI.isOperationLegalOrCustomOrPromote(ISD::CLMUL, VT) &&
+        !(getTypeAction(VT) == TargetLowering::TypeExpandInteger &&
+          TLI.isOperationLegalOrCustom(
+              ISD::CLMUL, TLI.getRegisterType(*DAG.getContext(), VT)))) {
       if (SDValue Res = TLI.expandCLMUL(N, DAG))
         return DAG.getNode(ISD::ANY_EXTEND, DL, VT, Res);
     }
diff --git a/llvm/test/CodeGen/AArch64/clmul.ll b/llvm/test/CodeGen/AArch64/clmul.ll
index bfa4b73b4e677..48cfae3eaef0d 100644
--- a/llvm/test/CodeGen/AArch64/clmul.ll
+++ b/llvm/test/CodeGen/AArch64/clmul.ll
@@ -195,6 +195,705 @@ define i64 @clmul_i64(i64 %x, i64 %y) {
   ret i64 %a
 }
 
+define i96 @clmul_i96(i96 %x, i96 %y) {
+; CHECK-NEON-LABEL: clmul_i96:
+; CHECK-NEON:       // %bb.0:
+; CHECK-NEON-NEXT:    stp x29, x30, [sp, #-96]! // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    stp x28, x27, [sp, #16] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    stp x26, x25, [sp, #32] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    stp x24, x23, [sp, #48] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    stp x22, x21, [sp, #64] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    stp x20, x19, [sp, #80] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    sub sp, sp, #592
+; CHECK-NEON-NEXT:    .cfi_def_cfa_offset 688
+; CHECK-NEON-NEXT:    .cfi_offset w19, -8
+; CHECK-NEON-NEXT:    .cfi_offset w20, -16
+; CHECK-NEON-NEXT:    .cfi_offset w21, -24
+; CHECK-NEON-NEXT:    .cfi_offset w22, -32
+; CHECK-NEON-NEXT:    .cfi_offset w23, -40
+; CHECK-NEON-NEXT:    .cfi_offset w24, -48
+; CHECK-NEON-NEXT:    .cfi_offset w25, -56
+; CHECK-NEON-NEXT:    .cfi_offset w26, -64
+; CHECK-NEON-NEXT:    .cfi_offset w27, -72
+; CHECK-NEON-NEXT:    .cfi_offset w28, -80
+; CHECK-NEON-NEXT:    .cfi_offset w30, -88
+; CHECK-NEON-NEXT:    .cfi_offset w29, -96
+; CHECK-NEON-NEXT:    sbfx x9, x2, #1, #1
+; CHECK-NEON-NEXT:    lsl x8, x0, #1
+; CHECK-NEON-NEXT:    sbfx x16, x2, #0, #1
+; CHECK-NEON-NEXT:    lsl x10, x0, #2
+; CHECK-NEON-NEXT:    sbfx x13, x2, #2, #1
+; CHECK-NEON-NEXT:    lsl x11, x0, #3
+; CHECK-NEON-NEXT:    sbfx x14, x2, #3, #1
+; CHECK-NEON-NEXT:    lsl x12, x0, #4
+; CHECK-NEON-NEXT:    sbfx x15, x2, #4, #1
+; CHECK-NEON-NEXT:    str x9, [sp, #200] // 8-byte Spill
+; CHECK-NEON-NEXT:    sbfx x17, x2, #8, #1
+; CHECK-NEON-NEXT:    sbfx x18, x2, #12, #1
+; CHECK-NEON-NEXT:    str x8, [sp, #512] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x8, x9, x8
+; CHECK-NEON-NEXT:    and x9, x16, x0
+; CHECK-NEON-NEXT:    str x10, [sp, #568] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x10, x13, x10
+; CHECK-NEON-NEXT:    eor x8, x9, x8
+; CHECK-NEON-NEXT:    str x11, [sp, #552] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x11, x14, x11
+; CHECK-NEON-NEXT:    sbfx x4, x2, #10, #1
+; CHECK-NEON-NEXT:    stp x14, x13, [sp, #272] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    eor x9, x10, x11
+; CHECK-NEON-NEXT:    and x10, x15, x12
+; CHECK-NEON-NEXT:    str x12, [sp, #536] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x11, x0, #5
+; CHECK-NEON-NEXT:    sbfx x14, x2, #5, #1
+; CHECK-NEON-NEXT:    lsl x12, x0, #6
+; CHECK-NEON-NEXT:    str x16, [sp, #152] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x13, x0, #7
+; CHECK-NEON-NEXT:    str x15, [sp, #288] // 8-byte Spill
+; CHECK-NEON-NEXT:    sbfx x15, x2, #6, #1
+; CHECK-NEON-NEXT:    sbfx x16, x2, #7, #1
+; CHECK-NEON-NEXT:    str x14, [sp, #192] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x8, x8, x9
+; CHECK-NEON-NEXT:    sbfx x20, x2, #20, #1
+; CHECK-NEON-NEXT:    stp x11, x12, [sp, #480] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    and x11, x14, x11
+; CHECK-NEON-NEXT:    lsl x14, x0, #8
+; CHECK-NEON-NEXT:    str x13, [sp, #520] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    and x11, x15, x12
+; CHECK-NEON-NEXT:    stp x16, x15, [sp, #240] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    and x12, x16, x13
+; CHECK-NEON-NEXT:    and x13, x17, x14
+; CHECK-NEON-NEXT:    str x14, [sp, #544] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x14, x0, #9
+; CHECK-NEON-NEXT:    sbfx x15, x2, #9, #1
+; CHECK-NEON-NEXT:    str x17, [sp, #232] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x9, x10, x11
+; CHECK-NEON-NEXT:    eor x10, x12, x13
+; CHECK-NEON-NEXT:    str x14, [sp, #528] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x11, x15, x14
+; CHECK-NEON-NEXT:    lsl x12, x0, #11
+; CHECK-NEON-NEXT:    sbfx x17, x2, #11, #1
+; CHECK-NEON-NEXT:    lsl x14, x0, #12
+; CHECK-NEON-NEXT:    str x15, [sp, #256] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x15, x0, #10
+; CHECK-NEON-NEXT:    lsl x13, x0, #13
+; CHECK-NEON-NEXT:    sbfx x16, x2, #13, #1
+; CHECK-NEON-NEXT:    str x12, [sp, #464] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    and x11, x17, x12
+; CHECK-NEON-NEXT:    and x12, x18, x14
+; CHECK-NEON-NEXT:    str x13, [sp, #576] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x13, x16, x13
+; CHECK-NEON-NEXT:    eor x11, x11, x12
+; CHECK-NEON-NEXT:    and x12, x4, x15
+; CHECK-NEON-NEXT:    str x14, [sp, #496] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x8, x8, x9
+; CHECK-NEON-NEXT:    eor x9, x10, x12
+; CHECK-NEON-NEXT:    eor x10, x11, x13
+; CHECK-NEON-NEXT:    lsl x11, x0, #14
+; CHECK-NEON-NEXT:    sbfx x14, x2, #14, #1
+; CHECK-NEON-NEXT:    lsl x12, x0, #16
+; CHECK-NEON-NEXT:    str x15, [sp, #416] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x13, x0, #15
+; CHECK-NEON-NEXT:    sbfx x15, x2, #16, #1
+; CHECK-NEON-NEXT:    stp x18, x17, [sp, #168] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    sbfx x17, x2, #15, #1
+; CHECK-NEON-NEXT:    eor x8, x8, x9
+; CHECK-NEON-NEXT:    str x16, [sp, #216] // 8-byte Spill
+; CHECK-NEON-NEXT:    sbfx x16, x2, #17, #1
+; CHECK-NEON-NEXT:    sbfx x24, x2, #26, #1
+; CHECK-NEON-NEXT:    str x14, [sp, #136] // 8-byte Spill
+; CHECK-NEON-NEXT:    sbfx x7, x2, #30, #1
+; CHECK-NEON-NEXT:    cmn w2, #1
+; CHECK-NEON-NEXT:    stp x12, x11, [sp, #448] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    and x11, x14, x11
+; CHECK-NEON-NEXT:    lsl x14, x0, #17
+; CHECK-NEON-NEXT:    str x13, [sp, #424] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    and x11, x17, x13
+; CHECK-NEON-NEXT:    str x15, [sp, #224] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x12, x15, x12
+; CHECK-NEON-NEXT:    and x13, x16, x14
+; CHECK-NEON-NEXT:    str x14, [sp, #504] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x14, x0, #18
+; CHECK-NEON-NEXT:    sbfx x15, x2, #18, #1
+; CHECK-NEON-NEXT:    eor x9, x10, x11
+; CHECK-NEON-NEXT:    eor x10, x12, x13
+; CHECK-NEON-NEXT:    lsl x12, x0, #19
+; CHECK-NEON-NEXT:    str x14, [sp, #472] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x11, x15, x14
+; CHECK-NEON-NEXT:    sbfx x14, x2, #19, #1
+; CHECK-NEON-NEXT:    str x17, [sp, #88] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    lsl x13, x0, #22
+; CHECK-NEON-NEXT:    str x16, [sp, #208] // 8-byte Spill
+; CHECK-NEON-NEXT:    sbfx x16, x2, #22, #1
+; CHECK-NEON-NEXT:    and x11, x14, x12
+; CHECK-NEON-NEXT:    str x14, [sp, #48] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x14, x0, #23
+; CHECK-NEON-NEXT:    sbfx x17, x2, #23, #1
+; CHECK-NEON-NEXT:    str x15, [sp, #184] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x15, x0, #20
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    str x12, [sp, #392] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x12, x16, x13
+; CHECK-NEON-NEXT:    eor x8, x8, x9
+; CHECK-NEON-NEXT:    stp x13, x14, [sp, #432] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    and x13, x17, x14
+; CHECK-NEON-NEXT:    lsl x14, x0, #24
+; CHECK-NEON-NEXT:    stp x17, x16, [sp, #120] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    sbfx x16, x2, #24, #1
+; CHECK-NEON-NEXT:    eor x11, x12, x13
+; CHECK-NEON-NEXT:    str x15, [sp, #352] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x12, x20, x15
+; CHECK-NEON-NEXT:    sbfx x15, x2, #25, #1
+; CHECK-NEON-NEXT:    str x14, [sp, #584] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x13, x16, x14
+; CHECK-NEON-NEXT:    lsl x14, x0, #25
+; CHECK-NEON-NEXT:    str x16, [sp, #144] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x9, x10, x12
+; CHECK-NEON-NEXT:    eor x10, x11, x13
+; CHECK-NEON-NEXT:    lsl x13, x0, #21
+; CHECK-NEON-NEXT:    sbfx x16, x2, #21, #1
+; CHECK-NEON-NEXT:    and x11, x15, x14
+; CHECK-NEON-NEXT:    lsl x12, x0, #26
+; CHECK-NEON-NEXT:    str x14, [sp, #560] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    str x16, [sp, #40] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x11, x16, x13
+; CHECK-NEON-NEXT:    lsl x14, x0, #27
+; CHECK-NEON-NEXT:    sbfx x16, x2, #27, #1
+; CHECK-NEON-NEXT:    str x15, [sp, #104] // 8-byte Spill
+; CHECK-NEON-NEXT:    sbfx x15, x2, #28, #1
+; CHECK-NEON-NEXT:    str x13, [sp, #344] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x13, x0, #28
+; CHECK-NEON-NEXT:    eor x9, x9, x11
+; CHECK-NEON-NEXT:    str x12, [sp, #408] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x12, x24, x12
+; CHECK-NEON-NEXT:    and x11, x16, x14
+; CHECK-NEON-NEXT:    eor x10, x10, x12
+; CHECK-NEON-NEXT:    str x14, [sp, #384] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x14, x0, #30
+; CHECK-NEON-NEXT:    str x13, [sp, #400] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    and x11, x15, x13
+; CHECK-NEON-NEXT:    str x15, [sp, #264] // 8-byte Spill
+; CHECK-NEON-NEXT:    lsl x13, x0, #29
+; CHECK-NEON-NEXT:    sbfx x15, x2, #29, #1
+; CHECK-NEON-NEXT:    eor x8, x8, x9
+; CHECK-NEON-NEXT:    eor x9, x10, x11
+; CHECK-NEON-NEXT:    lsl x12, x0, #31
+; CHECK-NEON-NEXT:    stp x13, x14, [sp, #368] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    and x10, x15, x13
+; CHECK-NEON-NEXT:    sbfx x13, x2, #32, #1
+; CHECK-NEON-NEXT:    and x11, x7, x14
+; CHECK-NEON-NEXT:    sbfx x21, x2, #33, #1
+; CHECK-NEON-NEXT:    str x12, [sp, #360] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    csel x11, xzr, x12, gt
+; CHECK-NEON-NEXT:    and x12, x13, x0, lsl #32
+; CHECK-NEON-NEXT:    sbfx x14, x2, #34, #1
+; CHECK-NEON-NEXT:    str x13, [sp, #32] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    and x11, x21, x0, lsl #33
+; CHECK-NEON-NEXT:    sbfx x13, x2, #35, #1
+; CHECK-NEON-NEXT:    eor x8, x8, x9
+; CHECK-NEON-NEXT:    eor x9, x10, x12
+; CHECK-NEON-NEXT:    and x10, x14, x0, lsl #34
+; CHECK-NEON-NEXT:    sbfx x12, x2, #36, #1
+; CHECK-NEON-NEXT:    eor x9, x9, x11
+; CHECK-NEON-NEXT:    and x11, x13, x0, lsl #35
+; CHECK-NEON-NEXT:    sbfx x25, x2, #37, #1
+; CHECK-NEON-NEXT:    sbfx x22, x2, #38, #1
+; CHECK-NEON-NEXT:    eor x9, x9, x10
+; CHECK-NEON-NEXT:    and x10, x12, x0, lsl #36
+; CHECK-NEON-NEXT:    sbfx x19, x2, #39, #1
+; CHECK-NEON-NEXT:    str x12, [sp, #312] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x9, x9, x11
+; CHECK-NEON-NEXT:    and x11, x25, x0, lsl #37
+; CHECK-NEON-NEXT:    and x12, x22, x0, lsl #38
+; CHECK-NEON-NEXT:    sbfx x5, x2, #40, #1
+; CHECK-NEON-NEXT:    eor x9, x9, x10
+; CHECK-NEON-NEXT:    and x10, x19, x0, lsl #39
+; CHECK-NEON-NEXT:    sbfx x26, x2, #41, #1
+; CHECK-NEON-NEXT:    str x13, [sp, #296] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x11, x11, x12
+; CHECK-NEON-NEXT:    and x12, x5, x0, lsl #40
+; CHECK-NEON-NEXT:    sbfx x13, x2, #42, #1
+; CHECK-NEON-NEXT:    eor x10, x11, x10
+; CHECK-NEON-NEXT:    and x11, x26, x0, lsl #41
+; CHECK-NEON-NEXT:    sbfx x27, x2, #43, #1
+; CHECK-NEON-NEXT:    eor x8, x8, x9
+; CHECK-NEON-NEXT:    eor x9, x10, x12
+; CHECK-NEON-NEXT:    str x13, [sp, #24] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x10, x13, x0, lsl #42
+; CHECK-NEON-NEXT:    sbfx x13, x2, #44, #1
+; CHECK-NEON-NEXT:    stp x14, x15, [sp, #8] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    eor x9, x9, x11
+; CHECK-NEON-NEXT:    and x11, x27, x0, lsl #43
+; CHECK-NEON-NEXT:    sbfx x12, x2, #45, #1
+; CHECK-NEON-NEXT:    sbfx x14, x2, #46, #1
+; CHECK-NEON-NEXT:    eor x9, x9, x10
+; CHECK-NEON-NEXT:    and x10, x13, x0, lsl #44
+; CHECK-NEON-NEXT:    sbfx x28, x2, #47, #1
+; CHECK-NEON-NEXT:    eor x9, x9, x11
+; CHECK-NEON-NEXT:    str x12, [sp, #304] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x11, x12, x0, lsl #45
+; CHECK-NEON-NEXT:    and x12, x14, x0, lsl #46
+; CHECK-NEON-NEXT:    sbfx x6, x2, #48, #1
+; CHECK-NEON-NEXT:    eor x9, x9, x10
+; CHECK-NEON-NEXT:    and x10, x28, x0, lsl #47
+; CHECK-NEON-NEXT:    sbfx x29, x2, #49, #1
+; CHECK-NEON-NEXT:    eor x11, x11, x12
+; CHECK-NEON-NEXT:    str x13, [sp, #96] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x12, x6, x0, lsl #48
+; CHECK-NEON-NEXT:    eor x13, x8, x9
+; CHECK-NEON-NEXT:    eor x9, x11, x10
+; CHECK-NEON-NEXT:    and x10, x29, x0, lsl #49
+; CHECK-NEON-NEXT:    str x14, [sp, #72] // 8-byte Spill
+; CHECK-NEON-NEXT:    sbfx x14, x2, #50, #1
+; CHECK-NEON-NEXT:    eor x9, x9, x12
+; CHECK-NEON-NEXT:    sbfx x8, x2, #55, #1
+; CHECK-NEON-NEXT:    sbfx x30, x2, #51, #1
+; CHECK-NEON-NEXT:    eor x9, x9, x10
+; CHECK-NEON-NEXT:    sbfx x10, x2, #54, #1
+; CHECK-NEON-NEXT:    and x11, x14, x0, lsl #50
+; CHECK-NEON-NEXT:    str x16, [sp, #160] // 8-byte Spill
+; CHECK-NEON-NEXT:    sbfx x16, x2, #52, #1
+; CHECK-NEON-NEXT:    and x18, x8, x0, lsl #55
+; CHECK-NEON-NEXT:    stp x10, x8, [sp, #320] // 16-byte Folded Spill
+; CHECK-NEON-NEXT:    sbfx x8, x2, #56, #1
+; CHECK-NEON-NEXT:    eor x9, x9, x11
+; CHECK-NEON-NEXT:    and x11, x30, x0, lsl #51
+; CHECK-NEON-NEXT:    and x12, x10, x0, lsl #54
+; CHECK-NEON-NEXT:    sbfx x17, x2, #53, #1
+; CHECK-NEON-NEXT:    sbfx x10, x2, #57, #1
+; CHECK-NEON-NEXT:    str x4, [sp, #112] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x4, x16, x0, lsl #52
+; CHECK-NEON-NEXT:    str x8, [sp, #80] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x8, x8, x0, lsl #56
+; CHECK-NEON-NEXT:    eor x11, x9, x11
+; CHECK-NEON-NEXT:    str x10, [sp, #56] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x12, x12, x18
+; CHECK-NEON-NEXT:    and x9, x17, x0, lsl #53
+; CHECK-NEON-NEXT:    and x10, x10, x0, lsl #57
+; CHECK-NEON-NEXT:    sbfx x23, x2, #58, #1
+; CHECK-NEON-NEXT:    eor x11, x11, x4
+; CHECK-NEON-NEXT:    eor x8, x12, x8
+; CHECK-NEON-NEXT:    eor x9, x11, x9
+; CHECK-NEON-NEXT:    sbfx x4, x2, #59, #1
+; CHECK-NEON-NEXT:    eor x12, x8, x10
+; CHECK-NEON-NEXT:    and x10, x23, x0, lsl #58
+; CHECK-NEON-NEXT:    eor x9, x13, x9
+; CHECK-NEON-NEXT:    sbfx x18, x2, #60, #1
+; CHECK-NEON-NEXT:    extr x8, x1, x0, #63
+; CHECK-NEON-NEXT:    str x9, [sp, #336] // 8-byte Spill
+; CHECK-NEON-NEXT:    eor x9, x12, x10
+; CHECK-NEON-NEXT:    ldr x10, [sp, #200] // 8-byte Reload
+; CHECK-NEON-NEXT:    and x11, x4, x0, lsl #59
+; CHECK-NEON-NEXT:    extr x12, x1, x0, #62
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #61
+; CHECK-NEON-NEXT:    str x14, [sp, #64] // 8-byte Spill
+; CHECK-NEON-NEXT:    and x10, x10, x8
+; CHECK-NEON-NEXT:    and x8, x18, x0, lsl #60
+; CHECK-NEON-NEXT:    eor x9, x9, x11
+; CHECK-NEON-NEXT:    ldr x11, [sp, #152] // 8-byte Reload
+; CHECK-NEON-NEXT:    cmn w3, #1
+; CHECK-NEON-NEXT:    eor x15, x9, x8
+; CHECK-NEON-NEXT:    ldp x8, x9, [sp, #272] // 16-byte Folded Reload
+; CHECK-NEON-NEXT:    and x11, x11, x1
+; CHECK-NEON-NEXT:    eor x14, x11, x10
+; CHECK-NEON-NEXT:    extr x10, x1, x0, #60
+; CHECK-NEON-NEXT:    and x11, x9, x12
+; CHECK-NEON-NEXT:    and x12, x8, x13
+; CHECK-NEON-NEXT:    ldr x8, [sp, #288] // 8-byte Reload
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #59
+; CHECK-NEON-NEXT:    eor x11, x11, x12
+; CHECK-NEON-NEXT:    extr x9, x1, x0, #57
+; CHECK-NEON-NEXT:    and x10, x8, x10
+; CHECK-NEON-NEXT:    ldr x8, [sp, #192] // 8-byte Reload
+; CHECK-NEON-NEXT:    eor x11, x14, x11
+; CHECK-NEON-NEXT:    extr x12, x1, x0, #58
+; CHECK-NEON-NEXT:    and x13, x8, x13
+; CHECK-NEON-NEXT:    extr x8, x1, x0, #56
+; CHECK-NEON-NEXT:    eor x10, x10, x13
+; CHECK-NEON-NEXT:    ldp x13, x14, [sp, #240] // 16-byte Folded Reload
+; CHECK-NEON-NEXT:    and x9, x13, x9
+; CHECK-NEON-NEXT:    ldr x13, [sp, #232] // 8-byte Reload
+; CHECK-NEON-NEXT:    and x12, x14, x12
+; CHECK-NEON-NEXT:    eor x10, x10, x12
+; CHECK-NEON-NEXT:    ldr x12, [sp, #256] // 8-byte Reload
+; CHECK-NEON-NEXT:    extr x14, x1, x0, #52
+; CHECK-NEON-NEXT:    and x8, x13, x8
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #55
+; CHECK-NEON-NEXT:    eor x10, x11, x10
+; CHECK-NEON-NEXT:    eor x8, x9, x8
+; CHECK-NEON-NEXT:    extr x9, x1, x0, #54
+; CHECK-NEON-NEXT:    ldr x11, [sp, #112] // 8-byte Reload
+; CHECK-NEON-NEXT:    and x12, x12, x13
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #53
+; CHECK-NEON-NEXT:    eor x8, x8, x12
+; CHECK-NEON-NEXT:    and x9, x11, x9
+; CHECK-NEON-NEXT:    ldp x12, x11, [sp, #168] // 16-byte Folded Reload
+; CHECK-NEON-NEXT:    eor x8, x8, x9
+; CHECK-NEON-NEXT:    ldr x9, [sp, #216] // 8-byte Reload
+; CHECK-NEON-NEXT:    eor x8, x10, x8
+; CHECK-NEON-NEXT:    and x11, x11, x13
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #51
+; CHECK-NEON-NEXT:    and x12, x12, x14
+; CHECK-NEON-NEXT:    eor x11, x11, x12
+; CHECK-NEON-NEXT:    extr x12, x1, x0, #50
+; CHECK-NEON-NEXT:    extr x14, x1, x0, #49
+; CHECK-NEON-NEXT:    and x13, x9, x13
+; CHECK-NEON-NEXT:    sbfx x9, x2, #61, #1
+; CHECK-NEON-NEXT:    eor x10, x11, x13
+; CHECK-NEON-NEXT:    ldr x11, [sp, #136] // 8-byte Reload
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #47
+; CHECK-NEON-NEXT:    and x11, x11, x12
+; CHECK-NEON-NEXT:    and x12, x9, x0, lsl #61
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    ldr x11, [sp, #88] // 8-byte Reload
+; CHECK-NEON-NEXT:    eor x12, x15, x12
+; CHECK-NEON-NEXT:    extr x15, x1, x0, #39
+; CHECK-NEON-NEXT:    and x11, x11, x14
+; CHECK-NEON-NEXT:    str x12, [sp, #288] // 8-byte Spill
+; CHECK-NEON-NEXT:    ldr x12, [sp, #224] // 8-byte Reload
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    extr x11, x1, x0, #48
+; CHECK-NEON-NEXT:    eor x8, x8, x10
+; CHECK-NEON-NEXT:    extr x10, x1, x0, #46
+; CHECK-NEON-NEXT:    and x11, x12, x11
+; CHECK-NEON-NEXT:    ldr x12, [sp, #208] // 8-byte Reload
+; CHECK-NEON-NEXT:    and x12, x12, x13
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #45
+; CHECK-NEON-NEXT:    eor x11, x11, x12
+; CHECK-NEON-NEXT:    ldr x12, [sp, #184] // 8-byte Reload
+; CHECK-NEON-NEXT:    and x10, x12, x10
+; CHECK-NEON-NEXT:    extr x12, x1, x0, #44
+; CHECK-NEON-NEXT:    eor x10, x11, x10
+; CHECK-NEON-NEXT:    ldr x11, [sp, #48] // 8-byte Reload
+; CHECK-NEON-NEXT:    and x11, x11, x13
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #42
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    and x11, x20, x12
+; CHECK-NEON-NEXT:    extr x12, x1, x0, #41
+; CHECK-NEON-NEXT:    eor x10, x10, x11
+; CHECK-NEON-NEXT:    ldp x14, x11, [sp, #120] // 16-byte Folded Reload
+; CHECK-NEON-NEXT:    ldr x20, [sp, #40] // 8-byte Reload
+; CHECK-NEON-NEXT:    and x11, x11, x13
+; CHECK-NEON-NEXT:    and x12, x14, x12
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #40
+; CHECK-NEON-NEXT:    eor x11, x11, x12
+; CHECK-NEON-NEXT:    ldr x12, [sp, #144] // 8-byte Reload
+; CHECK-NEON-NEXT:    extr x14, x1, x0, #43
+; CHECK-NEON-NEXT:    and x12, x12, x13
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #38
+; CHECK-NEON-NEXT:    and x14, x20, x14
+; CHECK-NEON-NEXT:    eor x11, x11, x12
+; CHECK-NEON-NEXT:    ldr x12, [sp, #104] // 8-byte Reload
+; CHECK-NEON-NEXT:    eor x10, x10, x14
+; CHECK-NEON-NEXT:    extr x14, x1, x0, #35
+; CHECK-NEON-NEXT:    lsl x20, x2, #32
+; CHECK-NEON-NEXT:    eor x8, x8, x10
+; CHECK-NEON-NEXT:    and x12, x12, x15
+; CHECK-NEON-NEXT:    extr x15, x1, x0, #34
+; CHECK-NEON-NEXT:    eor x11, x11, x12
+; CHECK-NEON-NEXT:    and x12, x24, x13
+; CHECK-NEON-NEXT:    extr x13, x1, x0, #37
+; CHECK-NEON-NEXT:    ldr x24, [sp, #160] // 8-byte Reload
+; CHECK-NEON-NEXT:    eor x11, x11, x12
+; CHECK-NEON-NEXT:    extr x12, x1, x0, #33
+; CHECK-NEON-NEXT:    and x15, x7, x15
+; CHECK-NEON-NEXT:    extr x7, x1, x0, #36
+; CHECK-NEON-NEXT:    and x13, x24, x13
+; CHECK-NEON-NEXT:    ldr x24, [sp, #16] // 8-byte Reload
+; CHECK-NEON-NEXT:    and x12, x...
[truncated]

Comment thread llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp

@topperc topperc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@xarkenz

xarkenz commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

@topperc Would you mind merging for me, unless we want to bring other reviewers on board? I don't have commit access as of yet.

@topperc topperc merged commit 4d5bc90 into llvm:main Jul 14, 2026
11 checks passed
@llvm-ci

llvm-ci commented Jul 14, 2026

Copy link
Copy Markdown

LLVM Buildbot has detected a new failure on builder sanitizer-aarch64-linux-bootstrap-hwasan running on sanitizer-buildbot12 while building llvm at step 2 "annotate".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/55/builds/30368

Here is the relevant piece of the build log for the reference
Step 2 (annotate) failure: 'python ../sanitizer_buildbot/sanitizers/zorg/buildbot/builders/sanitizers/buildbot_selector.py' (failure)
...
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using ld.lld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/ld.lld
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using lld-link: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/lld-link
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using ld64.lld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/ld64.lld
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using wasm-ld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/wasm-ld
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using ld.lld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/ld.lld
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using lld-link: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/lld-link
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using ld64.lld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/ld64.lld
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using wasm-ld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/wasm-ld
-- Testing: 100431 tests, 72 workers --
Testing:  0.. 10.. 20.. 30.. 40.. 50.. 
FAIL: LLVM :: ExecutionEngine/JITLink/x86-64/COFF_directive_include.s (61001 of 100431)
******************** TEST 'LLVM :: ExecutionEngine/JITLink/x86-64/COFF_directive_include.s' FAILED ********************
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 1
/home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/llvm-mc -filetype=obj -triple=x86_64-windows-msvc /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_directive_include.s -o /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/test/ExecutionEngine/JITLink/x86-64/Output/COFF_directive_include.s.tmp
# executed command: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/llvm-mc -filetype=obj -triple=x86_64-windows-msvc /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_directive_include.s -o /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/test/ExecutionEngine/JITLink/x86-64/Output/COFF_directive_include.s.tmp
# note: command had no output on stdout or stderr
# RUN: at line 2
not /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/llvm-jitlink -noexec /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/test/ExecutionEngine/JITLink/x86-64/Output/COFF_directive_include.s.tmp 2>&1 | /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/FileCheck /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_directive_include.s
# executed command: not /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/llvm-jitlink -noexec /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/test/ExecutionEngine/JITLink/x86-64/Output/COFF_directive_include.s.tmp
# note: command had no output on stdout or stderr
# error: command failed with exit status: 1
# executed command: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/FileCheck /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_directive_include.s
# note: command had no output on stdout or stderr

--

********************
Testing:  0.. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90.. 
Slowest Tests:
--------------------------------------------------------------------------
44.03s: LLVM :: tools/llvm-exegesis/AArch64/all-opcodes.test
36.98s: LLVM :: CodeGen/AMDGPU/sched-group-barrier-pipeline-solver.mir
29.32s: LLVM :: CodeGen/AMDGPU/amdgcn.bitcast.1024bit.ll
27.13s: Clang :: CodeGen/X86/avx-builtins.c
26.70s: Clang :: CodeGen/X86/sse2-builtins.c
26.24s: Clang :: Preprocessor/riscv-target-features.c
26.08s: Clang :: ClangScanDeps/build-session-validation-outdated-module.c
24.27s: Clang :: Driver/arm-cortex-cpus-1.c
23.97s: Clang :: Driver/arm-cortex-cpus-2.c
23.49s: LLVM :: tools/llvm-reduce/parallel-workitem-kill.ll
22.93s: LLVM :: CodeGen/AMDGPU/memintrinsic-unroll.ll
21.82s: Clang :: OpenMP/target_update_codegen.cpp
21.80s: Clang :: CodeGen/AArch64/sve-intrinsics/acle_sve_reinterpret.c
21.69s: Clang :: CodeGen/X86/avx2-builtins.c
21.60s: Clang :: CodeGen/X86/rot-intrinsics.c
Step 11 (stage2/hwasan check) failure: stage2/hwasan check (failure)
...
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using ld.lld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/ld.lld
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using lld-link: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/lld-link
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using ld64.lld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/ld64.lld
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using wasm-ld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/wasm-ld
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using ld.lld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/ld.lld
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using lld-link: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/lld-link
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using ld64.lld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/ld64.lld
llvm-lit: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/utils/lit/lit/llvm/config.py:569: note: using wasm-ld: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/wasm-ld
-- Testing: 100431 tests, 72 workers --
Testing:  0.. 10.. 20.. 30.. 40.. 50.. 
FAIL: LLVM :: ExecutionEngine/JITLink/x86-64/COFF_directive_include.s (61001 of 100431)
******************** TEST 'LLVM :: ExecutionEngine/JITLink/x86-64/COFF_directive_include.s' FAILED ********************
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 1
/home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/llvm-mc -filetype=obj -triple=x86_64-windows-msvc /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_directive_include.s -o /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/test/ExecutionEngine/JITLink/x86-64/Output/COFF_directive_include.s.tmp
# executed command: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/llvm-mc -filetype=obj -triple=x86_64-windows-msvc /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_directive_include.s -o /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/test/ExecutionEngine/JITLink/x86-64/Output/COFF_directive_include.s.tmp
# note: command had no output on stdout or stderr
# RUN: at line 2
not /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/llvm-jitlink -noexec /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/test/ExecutionEngine/JITLink/x86-64/Output/COFF_directive_include.s.tmp 2>&1 | /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/FileCheck /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_directive_include.s
# executed command: not /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/llvm-jitlink -noexec /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/test/ExecutionEngine/JITLink/x86-64/Output/COFF_directive_include.s.tmp
# note: command had no output on stdout or stderr
# error: command failed with exit status: 1
# executed command: /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm_build_hwasan/bin/FileCheck /home/b/sanitizer-aarch64-linux-bootstrap-hwasan/build/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_directive_include.s
# note: command had no output on stdout or stderr

--

********************
Testing:  0.. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90.. 
Slowest Tests:
--------------------------------------------------------------------------
44.03s: LLVM :: tools/llvm-exegesis/AArch64/all-opcodes.test
36.98s: LLVM :: CodeGen/AMDGPU/sched-group-barrier-pipeline-solver.mir
29.32s: LLVM :: CodeGen/AMDGPU/amdgcn.bitcast.1024bit.ll
27.13s: Clang :: CodeGen/X86/avx-builtins.c
26.70s: Clang :: CodeGen/X86/sse2-builtins.c
26.24s: Clang :: Preprocessor/riscv-target-features.c
26.08s: Clang :: ClangScanDeps/build-session-validation-outdated-module.c
24.27s: Clang :: Driver/arm-cortex-cpus-1.c
23.97s: Clang :: Driver/arm-cortex-cpus-2.c
23.49s: LLVM :: tools/llvm-reduce/parallel-workitem-kill.ll
22.93s: LLVM :: CodeGen/AMDGPU/memintrinsic-unroll.ll
21.82s: Clang :: OpenMP/target_update_codegen.cpp
21.80s: Clang :: CodeGen/AArch64/sve-intrinsics/acle_sve_reinterpret.c
21.69s: Clang :: CodeGen/X86/avx2-builtins.c
21.60s: Clang :: CodeGen/X86/rot-intrinsics.c

pedroMVicente pushed a commit to pedroMVicente/llvm-project that referenced this pull request Jul 15, 2026
…n register width (llvm#209265)

For `ISD::CLMUL`, add a check to `PromoteIntRes_CLMUL` to take advantage
of the cross-product expansion in `ExpandIntRes_CLMUL` when possible for
`Promote` types which are wider than the register width (e.g. `i96` for
64-bit registers).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants