Skip to content

[ARM][Thumb2] Mark BTI-clearing instructions as scheduling region boundaries #79173

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 4, 2024

Conversation

vhscampos
Copy link
Member

@vhscampos vhscampos commented Jan 23, 2024

Following #68313 this patch extends the idea to M-profile PACBTI.

The Machine Scheduler can reorder instructions within a scheduling region depending on the scheduling policy set. If a BTI-clearing instruction happens to partake in one such region, it might be moved around, therefore ending up where it shouldn't.

The solution is to mark all BTI-clearing instructions as scheduling region boundaries. This essentially means that they must not be part of any scheduling region, and as consequence never get moved:

  • PAC
  • PACBTI
  • BTI
  • SG

Note that PAC isn't BTI-clearing, but it's replaced by PACBTI late in the compilation pipeline.

As far as I know, currently it isn't possible to organically obtain code that's susceptible to the bug:

  • Instructions that write to SP are region boundaries. PAC seems to always be followed by the pushing of r12 to the stack, so essentially PAC is always by itself in a scheduling region.
  • CALL_BTI is expanded into a machine instruction bundle. Bundles are unpacked only after the last machine scheduler run. Thus setjmp and BTI can be separated only if someone deliberately run the scheduler once more.
  • The BTI insertion pass is run late in the pipeline, only after the last machine scheduling has run. So once again it can be reordered only if someone deliberately runs the scheduler again.

Nevertheless, one can reasonably argue that we should prevent the bug in spite of the compiler not being able to produce the required conditions for it. If things change, the compiler will be robust against this issue.

The tests written for this are contrived: bogus MIR instructions have been added adjacent to the BTI-clearing instructions in order to have them inside non-trivial scheduling regions.

@vhscampos vhscampos marked this pull request as ready for review January 23, 2024 17:23
@llvmbot
Copy link
Member

llvmbot commented Jan 23, 2024

@llvm/pr-subscribers-backend-arm

Author: Victor Campos (vhscampos)

Changes

Following #68313 this patch extends the idea to M-profile PACBTI.

The Machine Scheduler can reorder instructions within a scheduling region depending on the scheduling policy set. If a BTI-clearing instruction happens to partake in one such region, it might be moved around, therefore ending up where it shouldn't.

The solution is to mark all BTI-clearing instructions as scheduling region boundaries. This essentially means that they must not be part of any scheduling region, and as consequence never get moved:

  • PAC
  • PACBTI
  • BTI
  • SG
  • CALL_BTI (pseudo-instruction for setjmp + bti)

Note that PAC isn't BTI-clearing, but it's replaced by PACBTI late in the compilation pipeline.

As far as I know, currently it isn't possible to organically obtain code that's susceptible to the bug:

  • Instructions that write to SP are region boundaries. PAC seems to always be followed by the pushing of r12 to the stack, so essentially PAC is always by itself in a scheduling region.
  • CALL_BTI is expanded into a machine instruction bundle. Bundles are unpacked only after the last machine scheduler run. Thus setjmp and BTI can be separated only if someone deliberately run the scheduler once more.
  • The BTI insertion pass is run late in the pipeline, only after the last machine scheduling has run. So once again it can be reordered only if someone deliberately runs the scheduler again.

Nevertheless, one can reasonably argue that we should prevent the bug in spite of the compiler not being able to produce the required conditions for it. If things change, the compiler will be robust against this issue.

The tests written for this are contrived: bogus MIR instructions have been added adjacent to the BTI-clearing instructions in order to have them inside non-trivial scheduling regions.


Full diff: https://github.com/llvm/llvm-project/pull/79173.diff

4 Files Affected:

  • (modified) llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp (+1-1)
  • (modified) llvm/lib/Target/ARM/Thumb2InstrInfo.cpp (+20)
  • (modified) llvm/lib/Target/ARM/Thumb2InstrInfo.h (+4)
  • (added) llvm/test/CodeGen/ARM/misched-branch-targets.mir (+181)
diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
index 4bf65be6f10262e..5ae81698583df59 100644
--- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
+++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
@@ -2088,7 +2088,7 @@ bool ARMBaseInstrInfo::isSchedulingBoundary(const MachineInstr &MI,
   if (!MI.isCall() && MI.definesRegister(ARM::SP))
     return true;
 
-  return false;
+  return TargetInstrInfo::isSchedulingBoundary(MI, MBB, MF);
 }
 
 bool ARMBaseInstrInfo::
diff --git a/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp b/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp
index 083f25f49dec459..8d898cf5fc18f3a 100644
--- a/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp
+++ b/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp
@@ -286,6 +286,26 @@ MachineInstr *Thumb2InstrInfo::commuteInstructionImpl(MachineInstr &MI,
   return ARMBaseInstrInfo::commuteInstructionImpl(MI, NewMI, OpIdx1, OpIdx2);
 }
 
+bool Thumb2InstrInfo::isSchedulingBoundary(const MachineInstr &MI,
+                                           const MachineBasicBlock *MBB,
+                                           const MachineFunction &MF) const {
+  // BTI clearing instructions shall not take part in scheduling regions as
+  // they must stay in their intended place. Although PAC isn't BTI clearing,
+  // it can be transformed into PACBTI after the pre-RA Machine Scheduling
+  // has taken place, so its movement must also be restricted.
+  switch (MI.getOpcode()) {
+  case ARM::t2BTI:
+  case ARM::t2PAC:
+  case ARM::t2PACBTI:
+  case ARM::t2CALL_BTI:
+  case ARM::t2SG:
+    return true;
+  default:
+    break;
+  }
+  return ARMBaseInstrInfo::isSchedulingBoundary(MI, MBB, MF);
+}
+
 void llvm::emitT2RegPlusImmediate(MachineBasicBlock &MBB,
                                   MachineBasicBlock::iterator &MBBI,
                                   const DebugLoc &dl, Register DestReg,
diff --git a/llvm/lib/Target/ARM/Thumb2InstrInfo.h b/llvm/lib/Target/ARM/Thumb2InstrInfo.h
index 4bb412f09dcbeb3..8915da8c5bf3c8f 100644
--- a/llvm/lib/Target/ARM/Thumb2InstrInfo.h
+++ b/llvm/lib/Target/ARM/Thumb2InstrInfo.h
@@ -68,6 +68,10 @@ class Thumb2InstrInfo : public ARMBaseInstrInfo {
                                        unsigned OpIdx1,
                                        unsigned OpIdx2) const override;
 
+  bool isSchedulingBoundary(const MachineInstr &MI,
+                            const MachineBasicBlock *MBB,
+                            const MachineFunction &MF) const override;
+
 private:
   void expandLoadStackGuard(MachineBasicBlock::iterator MI) const override;
 };
diff --git a/llvm/test/CodeGen/ARM/misched-branch-targets.mir b/llvm/test/CodeGen/ARM/misched-branch-targets.mir
new file mode 100644
index 000000000000000..6f09644b227cec3
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/misched-branch-targets.mir
@@ -0,0 +1,181 @@
+# RUN: llc -o - -run-pass=machine-scheduler -misched=shuffle %s | FileCheck %s
+# RUN: llc -o - -run-pass=postmisched %s | FileCheck %s
+
+--- |
+  target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
+  target triple = "thumbv8.1m.main-arm-none-eabi"
+
+  define dso_local i32 @foo_bti(i32 noundef %a) local_unnamed_addr #7 {
+  entry:
+    %add = add nsw i32 %a, 1
+    ret i32 %add
+  }
+
+    define dso_local i32 @foo_pacbti(i32 noundef %a) local_unnamed_addr #7 {
+  entry:
+    %add = add nsw i32 %a, 1
+    ret i32 %add
+  }
+
+    define dso_local noundef i32 @foo_setjmp() local_unnamed_addr #0 {
+  entry:
+    %buf = alloca [20 x i64], align 8
+    call void @llvm.lifetime.start.p0(i64 160, ptr nonnull %buf) #4
+    %call = call i32 @setjmp(ptr noundef nonnull %buf) #5
+    %tobool.not = icmp eq i32 %call, 0
+    br i1 %tobool.not, label %if.else, label %if.then
+  
+  if.then:                                          ; preds = %entry
+    call void @longjmp(ptr noundef nonnull %buf, i32 noundef 1) #6
+    unreachable
+  
+  if.else:                                          ; preds = %entry
+    call void @llvm.lifetime.end.p0(i64 160, ptr nonnull %buf) #4
+    ret i32 0
+  }
+  
+  declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1
+  declare dso_local i32 @setjmp(ptr noundef) local_unnamed_addr #2
+  declare dso_local void @longjmp(ptr noundef, i32 noundef) local_unnamed_addr #3
+  declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1
+  
+  attributes #0 = { nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cortex-m55" "target-features"="+armv8.1-m.main,+dsp,+fp-armv8d16,+fp-armv8d16sp,+fp16,+fp64,+fullfp16,+hwdiv,+lob,+mve,+mve.fp,+ras,+strict-align,+thumb-mode,+vfp2,+vfp2sp,+vfp3d16,+vfp3d16sp,+vfp4d16,+vfp4d16sp,-aes,-bf16,-cdecp0,-cdecp1,-cdecp2,-cdecp3,-cdecp4,-cdecp5,-cdecp6,-cdecp7,-crc,-crypto,-d32,-dotprod,-fp-armv8,-fp-armv8sp,-fp16fml,-hwdiv-arm,-i8mm,-neon,-pacbti,-sb,-sha2,-vfp3,-vfp3sp,-vfp4,-vfp4sp" }
+  attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
+  attributes #2 = { nounwind returns_twice "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cortex-m55" "target-features"="+armv8.1-m.main,+dsp,+fp-armv8d16,+fp-armv8d16sp,+fp16,+fp64,+fullfp16,+hwdiv,+lob,+mve,+mve.fp,+ras,+strict-align,+thumb-mode,+vfp2,+vfp2sp,+vfp3d16,+vfp3d16sp,+vfp4d16,+vfp4d16sp,-aes,-bf16,-cdecp0,-cdecp1,-cdecp2,-cdecp3,-cdecp4,-cdecp5,-cdecp6,-cdecp7,-crc,-crypto,-d32,-dotprod,-fp-armv8,-fp-armv8sp,-fp16fml,-hwdiv-arm,-i8mm,-neon,-pacbti,-sb,-sha2,-vfp3,-vfp3sp,-vfp4,-vfp4sp" }
+  attributes #3 = { noreturn nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cortex-m55" "target-features"="+armv8.1-m.main,+dsp,+fp-armv8d16,+fp-armv8d16sp,+fp16,+fp64,+fullfp16,+hwdiv,+lob,+mve,+mve.fp,+ras,+strict-align,+thumb-mode,+vfp2,+vfp2sp,+vfp3d16,+vfp3d16sp,+vfp4d16,+vfp4d16sp,-aes,-bf16,-cdecp0,-cdecp1,-cdecp2,-cdecp3,-cdecp4,-cdecp5,-cdecp6,-cdecp7,-crc,-crypto,-d32,-dotprod,-fp-armv8,-fp-armv8sp,-fp16fml,-hwdiv-arm,-i8mm,-neon,-pacbti,-sb,-sha2,-vfp3,-vfp3sp,-vfp4,-vfp4sp" }
+  attributes #4 = { nounwind }
+  attributes #5 = { nounwind returns_twice }
+  attributes #6 = { noreturn nounwind }
+  attributes #7 = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cortex-m55" "target-features"="+armv8.1-m.main,+dsp,+fp-armv8d16,+fp-armv8d16sp,+fp16,+fp64,+fullfp16,+hwdiv,+lob,+mve,+mve.fp,+ras,+strict-align,+thumb-mode,+vfp2,+vfp2sp,+vfp3d16,+vfp3d16sp,+vfp4d16,+vfp4d16sp,-aes,-bf16,-cdecp0,-cdecp1,-cdecp2,-cdecp3,-cdecp4,-cdecp5,-cdecp6,-cdecp7,-crc,-crypto,-d32,-dotprod,-fp-armv8,-fp-armv8sp,-fp16fml,-hwdiv-arm,-i8mm,-neon,-pacbti,-sb,-sha2,-vfp3,-vfp3sp,-vfp4,-vfp4sp" }
+
+...
+---
+name:            foo_bti
+alignment:       4
+tracksRegLiveness: true
+tracksDebugUserValues: true
+liveins:
+  - { reg: '$r0' }
+frameInfo:
+  maxAlignment:    1
+  maxCallFrameSize: 0
+machineFunctionInfo:
+  isLRSpilled:     false
+body:             |
+  bb.0.entry:
+    liveins: $r0
+
+    t2BTI
+    renamable $r0, dead $cpsr = nsw tADDi8 killed renamable $r0, 1, 14 /* CC::al */, $noreg
+    tBX_RET 14 /* CC::al */, $noreg, implicit killed $r0
+
+...
+
+# CHECK-LABEL: name:            foo_bti
+# CHECK:       body:
+# CHECK-NEXT:   bb.0.entry:
+# CHECK-NEXT:     liveins: $r0
+# CHECK-NEXT:     {{^ +$}}
+# CHECK-NEXT:     t2BTI
+
+---
+name:            foo_pacbti
+alignment:       4
+tracksRegLiveness: true
+tracksDebugUserValues: true
+liveins:
+  - { reg: '$r0' }
+frameInfo:
+  stackSize:       12
+  offsetAdjustment: -4
+  maxAlignment:    4
+  maxCallFrameSize: 0
+stack:
+  - { id: 0, type: spill-slot, offset: -4, size: 4, alignment: 4, callee-saved-register: '$lr' }
+  - { id: 1, type: spill-slot, offset: -8, size: 4, alignment: 4, callee-saved-register: '$r7' }
+  - { id: 2, type: spill-slot, offset: -12, size: 4, alignment: 4, callee-saved-register: '$r12' }
+machineFunctionInfo:
+  isLRSpilled:     true
+body:             |
+  bb.0.entry:
+    liveins: $r0, $lr, $r12
+
+    frame-setup t2PAC implicit-def $r12, implicit $lr, implicit $sp
+    renamable $r2 = nsw t2ADDri $r0, 3, 14 /* CC::al */, $noreg, $noreg
+    $sp = frame-setup t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r7, killed $lr
+    frame-setup CFI_INSTRUCTION def_cfa_offset 8
+    frame-setup CFI_INSTRUCTION offset $lr, -4
+    frame-setup CFI_INSTRUCTION offset $r7, -8
+    $r7 = frame-setup tMOVr killed $sp, 14 /* CC::al */, $noreg
+    frame-setup CFI_INSTRUCTION def_cfa_register $r7
+    early-clobber $sp = frame-setup t2STR_PRE killed $r12, $sp, -4, 14 /* CC::al */, $noreg
+    frame-setup CFI_INSTRUCTION offset $ra_auth_code, -12
+    renamable $r0 = nsw t2ADDri killed renamable $r0, 1, 14 /* CC::al */, $noreg, $noreg
+    $r12, $sp = frame-destroy t2LDR_POST $sp, 4, 14 /* CC::al */, $noreg
+    $sp = frame-destroy t2LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r7, def $lr
+    t2AUT implicit $r12, implicit $lr, implicit $sp
+    tBX_RET 14 /* CC::al */, $noreg, implicit $r0
+
+...
+
+# CHECK-LABEL: name:            foo_pacbti
+# CHECK:       body:
+# CHECK-NEXT:    bb.0.entry:
+# CHECK-NEXT:      liveins: $r0, $lr, $r12
+# CHECK-NEXT:      {{^ +$}}
+# CHECK-NEXT:      frame-setup t2PAC implicit-def $r12, implicit $lr, implicit $sp
+
+---
+name:            foo_setjmp
+alignment:       4
+exposesReturnsTwice: true
+tracksRegLiveness: true
+tracksDebugUserValues: true
+frameInfo:
+  stackSize:       168
+  offsetAdjustment: -160
+  maxAlignment:    8
+  adjustsStack:    true
+  hasCalls:        true
+  maxCallFrameSize: 0
+  localFrameSize:  160
+stack:
+  - { id: 0, name: buf, offset: -168, size: 160, alignment: 8, local-offset: -160 }
+  - { id: 1, type: spill-slot, offset: -4, size: 4, alignment: 4, callee-saved-register: '$lr', 
+      callee-saved-restored: false }
+  - { id: 2, type: spill-slot, offset: -8, size: 4, alignment: 4, callee-saved-register: '$r7' }
+machineFunctionInfo:
+  isLRSpilled:     true
+body:             |
+  bb.0.entry:
+    successors: %bb.1
+    liveins: $lr
+  
+    frame-setup tPUSH 14 /* CC::al */, $noreg, $r7, killed $lr, implicit-def $sp, implicit $sp
+    frame-setup CFI_INSTRUCTION def_cfa_offset 8
+    frame-setup CFI_INSTRUCTION offset $lr, -4
+    frame-setup CFI_INSTRUCTION offset $r7, -8
+    $r7 = frame-setup tMOVr $sp, 14 /* CC::al */, $noreg
+    frame-setup CFI_INSTRUCTION def_cfa_register $r7
+    $sp = frame-setup tSUBspi $sp, 40, 14 /* CC::al */, $noreg
+    renamable $r0 = tMOVr $sp, 14 /* CC::al */, $noreg
+    tBL 14 /* CC::al */, $noreg, @setjmp, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $r0, implicit-def $sp, implicit-def $r0
+    t2BTI
+    renamable $r2 = nsw t2ADDri $r0, 3, 14 /* CC::al */, $noreg, $noreg
+    tCMPi8 killed renamable $r0, 0, 14 /* CC::al */, $noreg, implicit-def $cpsr
+    t2IT 0, 2, implicit-def $itstate
+    renamable $r0 = tMOVi8 $noreg, 0, 0 /* CC::eq */, $cpsr, implicit $itstate
+    $sp = frame-destroy tADDspi $sp, 40, 0 /* CC::eq */, $cpsr, implicit $itstate
+    frame-destroy tPOP_RET 0 /* CC::eq */, killed $cpsr, def $r7, def $pc, implicit killed $r0, implicit $sp, implicit killed $itstate
+  
+  bb.1.if.then:
+    renamable $r0 = tMOVr $sp, 14 /* CC::al */, $noreg
+    renamable $r1, dead $cpsr = tMOVi8 1, 14 /* CC::al */, $noreg
+    tBL 14 /* CC::al */, $noreg, @longjmp, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $r0, implicit killed $r1, implicit-def $sp
+
+...
+
+# CHECK-LABEL: name:            foo_setjmp
+# CHECK:       body:
+# CHECK:         tBL 14 /* CC::al */, $noreg, @setjmp, csr_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $r0, implicit-def $sp, implicit-def $r0
+# CHECK-NEXT:    t2BTI

Following llvm#68313 this patch
extends the idea to M-profile PACBTI.

The Machine Scheduler can reorder instructions within a scheduling
region depending on the scheduling policy set. If a BTI-clearing
instruction happens to partake in one such region, it might be moved
around, therefore ending up where it shouldn't.

The solution is to mark all BTI-clearing instructions as scheduling
region boundaries. This essentially means that they must not be part of
any scheduling region, and as consequence never get moved:

 - PAC
 - PACBTI
 - BTI
 - SG
 - CALL_BTI (pseudo-instruction for setjmp + bti)

Note that PAC isn't BTI-clearing, but it's replaced by PACBTI late in
the compilation pipeline.

As far as I know, currently it isn't possible to organically obtain code
that's susceptible to the bug:

 - Instructions that write to SP are region boundaries. PAC seems to
   always be followed by the pushing of r12 to the stack, so essentially
   PAC is always by itself in a scheduling region.
 - CALL_BTI is expanded into a machine instruction bundle. Bundles are
   unpacked only after the last machine scheduler run. Thus setjmp and
   BTI can be separated only if someone deliberately runs the scheduler
   once more.
 - The BTI insertion pass is run late in the pipeline, only after the
   last machine scheduling has run. So once again it can be reordered
   only if someone deliberately runs the scheduler again.

Nevertheless, one can reasonably argue that we should prevent the bug in
spite of the compiler not being able to produce the required conditions
for it. If things change, the compiler will be robust against this
issue.

The tests written for this are contrived: bogus MIR instructions have
been added adjacent to the BTI-clearing instructions in order to have
them inside non-trivial scheduling regions.
Copy link
Contributor

@atrosinenko atrosinenko left a comment

Choose a reason for hiding this comment

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

A few thoughts/suggestions on the tests (just an opinion):

  • the test can probably be further simplified by dropping unrelated machine instructions or replacing them with obvious NOPs for readability
  • AFAIK in their inline LLVM IR modules, some mir-based tests use dummy function definitions as placeholders - not corresponding to the actual machine instructions (probably, some properties of the original functions have to be kept)
  • it may be worth adding simple test cases for the other BTI-clearing instructions

@vhscampos
Copy link
Member Author

  • the test can probably be further simplified by dropping unrelated machine instructions or replacing them with obvious NOPs for readability

I've removed one or two extra instructions. I reckon that what's left is important because it's intrinsic to the prolog/epilog codegen of PAC and BTI, although some of it is not necessary to trigger the bug.

  • AFAIK in their inline LLVM IR modules, some mir-based tests use dummy function definitions as placeholders - not corresponding to the actual machine instructions (probably, some properties of the original functions have to be kept)

Good point. Now all the IR definitions are as dummy as possible.

  • it may be worth adding simple test cases for the other BTI-clearing instructions

Added one test for SG and another for PACBTI.

I removed t2CALL_BTI from the list of scheduling boundaries because it's a pseudo-instruction that is transformed into BL + BTI. The pseudo-inst itself can be moved around with no issues. After the expansion, the restrictions must then be enforced.

@vhscampos vhscampos requested a review from atrosinenko February 5, 2024 15:33
@vhscampos
Copy link
Member Author

@atrosinenko Can you please have a look at the latest patch? Thanks

Copy link
Contributor

@atrosinenko atrosinenko left a comment

Choose a reason for hiding this comment

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

Looks good to me, sorry for long delay. I unresolved a comment that was likely to be resolved unintentionally, though that was a minor issue anyway.

@vhscampos
Copy link
Member Author

Thanks @atrosinenko . I've resolved the attribute list duplication.

@vhscampos vhscampos merged commit 5ad320a into llvm:main Apr 4, 2024
4 checks passed
@vhscampos vhscampos deleted the misched branch April 4, 2024 11:44
@zeroomega
Copy link
Contributor

FYI, we are seeing test failures on CodeGen/ARM/misched-branch-targets.mir in LLVM builder https://lab.llvm.org/buildbot/#/builders/98 . Error message:

-- Testing: 53796 tests, 60 workers --
Testing:  0.. 10..
FAIL: LLVM :: CodeGen/ARM/misched-branch-targets.mir (10018 of 53796)
******************** TEST 'LLVM :: CodeGen/ARM/misched-branch-targets.mir' FAILED ********************
Exit Code: 2
Command Output (stderr):
--
RUN: at line 1: /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-gi6m1p2w/bin/llc -o - -run-pass=machine-scheduler -misched=shuffle /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/test/CodeGen/ARM/misched-branch-targets.mir | /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-gi6m1p2w/bin/FileCheck /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/test/CodeGen/ARM/misched-branch-targets.mir
+ /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-gi6m1p2w/bin/llc -o - -run-pass=machine-scheduler -misched=shuffle /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/test/CodeGen/ARM/misched-branch-targets.mir
+ /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-gi6m1p2w/bin/FileCheck /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/test/CodeGen/ARM/misched-branch-targets.mir
llc: for the --misched option: Cannot find option named 'shuffle'!
FileCheck error: '<stdin>' is empty.
FileCheck command line:  /var/lib/buildbot/fuchsia-x86_64-linux/build/llvm-build-gi6m1p2w/bin/FileCheck /var/lib/buildbot/fuchsia-x86_64-linux/llvm-project/llvm/test/CodeGen/ARM/misched-branch-targets.mir
--
********************
Testing:  0.. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90.. 
********************
Failed Tests (1):
  LLVM :: CodeGen/ARM/misched-branch-targets.mir
Testing Time: 72.11s

It complains shuffle option is not available. We are still looking into why this option is not available.

@zeroomega
Copy link
Contributor

We understand the issue now. The shuffle option is only available when building LLVM with DEBUG options. See:

"shuffle", "Shuffle machine instructions alternating directions",

The failing bot was building the LLVM in release mode, therefore, the flag doesn't exist.
Could you revert your change and fix it and reland it please?

vhscampos added a commit that referenced this pull request Apr 4, 2024
…gion boundaries" (#87699)

Reverts #79173

The testcase fails in non-asserts builds.
@vhscampos
Copy link
Member Author

Patch reverted while I fix the issue. Thanks for reporting @zeroomega

Copy link
Contributor

@artagnon artagnon left a comment

Choose a reason for hiding this comment

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

I've left a few comments to take into consideration when re-landing.

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.

6 participants