2018-10-25 07:52:22 +08:00
|
|
|
; When EXPENSIVE_CHECKS are enabled, the machine verifier appears between each
|
|
|
|
; pass. Ignore it with 'grep -v'.
|
2020-06-25 01:56:20 +08:00
|
|
|
; RUN: llc -mtriple=x86_64-- -O1 -debug-pass=Structure < %s -o /dev/null 2>&1 \
|
|
|
|
; RUN: | grep -v 'Verify generated machine code' | FileCheck %s
|
|
|
|
; RUN: llc -mtriple=x86_64-- -O2 -debug-pass=Structure < %s -o /dev/null 2>&1 \
|
|
|
|
; RUN: | grep -v 'Verify generated machine code' | FileCheck %s
|
2018-10-25 07:52:22 +08:00
|
|
|
; RUN: llc -mtriple=x86_64-- -O3 -debug-pass=Structure < %s -o /dev/null 2>&1 \
|
|
|
|
; RUN: | grep -v 'Verify generated machine code' | FileCheck %s
|
2018-03-23 07:02:48 +08:00
|
|
|
|
|
|
|
; REQUIRES: asserts
|
|
|
|
|
|
|
|
; CHECK-LABEL: Pass Arguments:
|
|
|
|
; CHECK-NEXT: Target Library Information
|
|
|
|
; CHECK-NEXT: Target Pass Configuration
|
|
|
|
; CHECK-NEXT: Machine Module Information
|
|
|
|
; CHECK-NEXT: Target Transform Information
|
|
|
|
; CHECK-NEXT: Type-Based Alias Analysis
|
|
|
|
; CHECK-NEXT: Scoped NoAlias Alias Analysis
|
|
|
|
; CHECK-NEXT: Assumption Cache Tracker
|
2019-12-07 04:17:32 +08:00
|
|
|
; CHECK-NEXT: Profile summary info
|
2019-12-06 01:39:37 +08:00
|
|
|
; CHECK-NEXT: Create Garbage Collector Module Metadata
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Machine Branch Probability Analysis
|
|
|
|
; CHECK-NEXT: ModulePass Manager
|
|
|
|
; CHECK-NEXT: Pre-ISel Intrinsic Lowering
|
|
|
|
; CHECK-NEXT: FunctionPass Manager
|
|
|
|
; CHECK-NEXT: Expand Atomic instructions
|
2021-03-16 09:44:42 +08:00
|
|
|
; CHECK-NEXT: Lower AMX intrinsics
|
2020-09-06 10:17:22 +08:00
|
|
|
; CHECK-NEXT: Lower AMX type for load/store
|
2020-05-20 04:37:37 +08:00
|
|
|
; CHECK-NEXT: Module Verifier
|
2021-03-17 19:17:18 +08:00
|
|
|
; CHECK-NEXT: Dominator Tree Construction
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
2021-03-17 19:17:18 +08:00
|
|
|
; CHECK-NEXT: Natural Loop Information
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Canonicalize natural loops
|
|
|
|
; CHECK-NEXT: Scalar Evolution Analysis
|
|
|
|
; CHECK-NEXT: Loop Pass Manager
|
[TargetPassConfig] Add CanonicalizeFreezeInLoops before LSR
Summary:
This patch adds CanonicalizeFreezeInLoops before LSR.
Relevant patch: https://reviews.llvm.org/D77523
Reviewers: spatel, efriedma, jdoerfert, fhahn, nikic, reames, xbolva00
Reviewed By: nikic
Subscribers: xbolva00, nikic, lebedev.ri, hiraditya, llvm-commits, sanwou01, nlopes
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D77524
2020-05-28 00:48:37 +08:00
|
|
|
; CHECK-NEXT: Canonicalize Freeze Instructions in Loops
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Induction Variable Users
|
|
|
|
; CHECK-NEXT: Loop Strength Reduction
|
2019-09-10 18:39:09 +08:00
|
|
|
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
|
|
|
; CHECK-NEXT: Function Alias Analysis Results
|
|
|
|
; CHECK-NEXT: Merge contiguous icmps into a memcmp
|
2019-12-06 01:39:37 +08:00
|
|
|
; CHECK-NEXT: Natural Loop Information
|
|
|
|
; CHECK-NEXT: Lazy Branch Probability Analysis
|
|
|
|
; CHECK-NEXT: Lazy Block Frequency Analysis
|
2019-09-10 18:39:09 +08:00
|
|
|
; CHECK-NEXT: Expand memcmp() to load/stores
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Lower Garbage Collection Instructions
|
|
|
|
; CHECK-NEXT: Shadow Stack GC Lowering
|
2019-10-15 00:15:14 +08:00
|
|
|
; CHECK-NEXT: Lower constant intrinsics
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Remove unreachable blocks from the CFG
|
|
|
|
; CHECK-NEXT: Natural Loop Information
|
2020-04-28 17:31:20 +08:00
|
|
|
; CHECK-NEXT: Post-Dominator Tree Construction
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Branch Probability Analysis
|
|
|
|
; CHECK-NEXT: Block Frequency Analysis
|
|
|
|
; CHECK-NEXT: Constant Hoisting
|
2021-02-13 01:22:28 +08:00
|
|
|
; CHECK-NEXT: Replace intrinsics with calls to vector library
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Partially inline calls to library functions
|
|
|
|
; CHECK-NEXT: Scalarize Masked Memory Intrinsics
|
|
|
|
; CHECK-NEXT: Expand reduction intrinsics
|
|
|
|
; CHECK-NEXT: Interleaved Access Pass
|
2020-03-27 02:09:08 +08:00
|
|
|
; CHECK-NEXT: X86 Partial Reduction
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Expand indirectbr instructions
|
|
|
|
; CHECK-NEXT: Natural Loop Information
|
|
|
|
; CHECK-NEXT: CodeGen Prepare
|
2021-04-11 14:28:16 +08:00
|
|
|
; CHECK-NEXT: Rewrite Symbols
|
|
|
|
; CHECK-NEXT: FunctionPass Manager
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Dominator Tree Construction
|
|
|
|
; CHECK-NEXT: Exception handling preparation
|
|
|
|
; CHECK-NEXT: Safe Stack instrumentation pass
|
|
|
|
; CHECK-NEXT: Insert stack protectors
|
|
|
|
; CHECK-NEXT: Module Verifier
|
|
|
|
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
|
|
|
|
; CHECK-NEXT: Function Alias Analysis Results
|
|
|
|
; CHECK-NEXT: Natural Loop Information
|
2020-04-28 17:31:20 +08:00
|
|
|
; CHECK-NEXT: Post-Dominator Tree Construction
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Branch Probability Analysis
|
2019-12-06 01:39:37 +08:00
|
|
|
; CHECK-NEXT: Lazy Branch Probability Analysis
|
|
|
|
; CHECK-NEXT: Lazy Block Frequency Analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: X86 DAG->DAG Instruction Selection
|
|
|
|
; CHECK-NEXT: MachineDominator Tree Construction
|
|
|
|
; CHECK-NEXT: Local Dynamic TLS Access Clean-up
|
|
|
|
; CHECK-NEXT: X86 PIC Global Base Reg Initialization
|
2019-06-19 08:25:39 +08:00
|
|
|
; CHECK-NEXT: Finalize ISel and expand pseudo-instructions
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: X86 Domain Reassignment Pass
|
2019-12-06 01:39:37 +08:00
|
|
|
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Early Tail Duplication
|
|
|
|
; CHECK-NEXT: Optimize machine instruction PHIs
|
|
|
|
; CHECK-NEXT: Slot index numbering
|
|
|
|
; CHECK-NEXT: Merge disjoint stack slots
|
|
|
|
; CHECK-NEXT: Local Stack Slot Allocation
|
|
|
|
; CHECK-NEXT: Remove dead machine instructions
|
|
|
|
; CHECK-NEXT: MachineDominator Tree Construction
|
|
|
|
; CHECK-NEXT: Machine Natural Loop Construction
|
|
|
|
; CHECK-NEXT: Machine Trace Metrics
|
|
|
|
; CHECK-NEXT: Early If-Conversion
|
2019-12-06 01:39:37 +08:00
|
|
|
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Machine InstCombiner
|
|
|
|
; CHECK-NEXT: X86 cmov Conversion
|
|
|
|
; CHECK-NEXT: MachineDominator Tree Construction
|
|
|
|
; CHECK-NEXT: Machine Natural Loop Construction
|
2020-09-18 03:13:29 +08:00
|
|
|
; CHECK-NEXT: Machine Block Frequency Analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Early Machine Loop Invariant Code Motion
|
2019-10-02 02:27:44 +08:00
|
|
|
; CHECK-NEXT: MachineDominator Tree Construction
|
2019-07-19 20:58:16 +08:00
|
|
|
; CHECK-NEXT: Machine Block Frequency Analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Machine Common Subexpression Elimination
|
|
|
|
; CHECK-NEXT: MachinePostDominator Tree Construction
|
|
|
|
; CHECK-NEXT: Machine code sinking
|
|
|
|
; CHECK-NEXT: Peephole Optimizations
|
|
|
|
; CHECK-NEXT: Remove dead machine instructions
|
|
|
|
; CHECK-NEXT: Live Range Shrink
|
|
|
|
; CHECK-NEXT: X86 Fixup SetCC
|
2019-12-06 01:39:37 +08:00
|
|
|
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: X86 LEA Optimize
|
|
|
|
; CHECK-NEXT: X86 Optimize Call Frame
|
2018-04-02 21:48:28 +08:00
|
|
|
; CHECK-NEXT: X86 Avoid Store Forwarding Block
|
2018-09-04 20:38:00 +08:00
|
|
|
; CHECK-NEXT: X86 speculative load hardening
|
2018-04-18 23:13:16 +08:00
|
|
|
; CHECK-NEXT: MachineDominator Tree Construction
|
[x86] Introduce a pass to begin more systematically fixing PR36028 and similar issues.
The key idea is to lower COPY nodes populating EFLAGS by scanning the
uses of EFLAGS and introducing dedicated code to preserve the necessary
state in a GPR. In the vast majority of cases, these uses are cmovCC and
jCC instructions. For such cases, we can very easily save and restore
the necessary information by simply inserting a setCC into a GPR where
the original flags are live, and then testing that GPR directly to feed
the cmov or conditional branch.
However, things are a bit more tricky if arithmetic is using the flags.
This patch handles the vast majority of cases that seem to come up in
practice: adc, adcx, adox, rcl, and rcr; all without taking advantage of
partially preserved EFLAGS as LLVM doesn't currently model that at all.
There are a large number of operations that techinaclly observe EFLAGS
currently but shouldn't in this case -- they typically are using DF.
Currently, they will not be handled by this approach. However, I have
never seen this issue come up in practice. It is already pretty rare to
have these patterns come up in practical code with LLVM. I had to resort
to writing MIR tests to cover most of the logic in this pass already.
I suspect even with its current amount of coverage of arithmetic users
of EFLAGS it will be a significant improvement over the current use of
pushf/popf. It will also produce substantially faster code in most of
the common patterns.
This patch also removes all of the old lowering for EFLAGS copies, and
the hack that forced us to use a frame pointer when EFLAGS copies were
found anywhere in a function so that the dynamic stack adjustment wasn't
a problem. None of this is needed as we now lower all of these copies
directly in MI and without require stack adjustments.
Lots of thanks to Reid who came up with several aspects of this
approach, and Craig who helped me work out a couple of things tripping
me up while working on this.
Differential Revision: https://reviews.llvm.org/D45146
llvm-svn: 329657
2018-04-10 09:41:17 +08:00
|
|
|
; CHECK-NEXT: X86 EFLAGS copy lowering
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: X86 WinAlloca Expander
|
2020-09-06 10:17:22 +08:00
|
|
|
; CHECK-NEXT: MachineDominator Tree Construction
|
2021-04-12 22:08:27 +08:00
|
|
|
; CHECK-NEXT: Machine Natural Loop Construction
|
2020-09-06 10:17:22 +08:00
|
|
|
; CHECK-NEXT: Tile Register Pre-configure
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Detect Dead Lanes
|
|
|
|
; CHECK-NEXT: Process Implicit Definitions
|
|
|
|
; CHECK-NEXT: Remove unreachable machine basic blocks
|
|
|
|
; CHECK-NEXT: Live Variable Analysis
|
|
|
|
; CHECK-NEXT: Eliminate PHI nodes for register allocation
|
|
|
|
; CHECK-NEXT: Two-Address instruction pass
|
|
|
|
; CHECK-NEXT: Slot index numbering
|
|
|
|
; CHECK-NEXT: Live Interval Analysis
|
|
|
|
; CHECK-NEXT: Simple Register Coalescing
|
|
|
|
; CHECK-NEXT: Rename Disconnected Subregister Components
|
|
|
|
; CHECK-NEXT: Machine Instruction Scheduler
|
|
|
|
; CHECK-NEXT: Machine Block Frequency Analysis
|
|
|
|
; CHECK-NEXT: Debug Variable Analysis
|
|
|
|
; CHECK-NEXT: Live Stack Slot Analysis
|
|
|
|
; CHECK-NEXT: Virtual Register Map
|
|
|
|
; CHECK-NEXT: Live Register Matrix
|
|
|
|
; CHECK-NEXT: Bundle Machine CFG Edges
|
|
|
|
; CHECK-NEXT: Spill Code Placement Analysis
|
|
|
|
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
|
|
|
|
; CHECK-NEXT: Machine Optimization Remark Emitter
|
|
|
|
; CHECK-NEXT: Greedy Register Allocator
|
2020-09-06 10:17:22 +08:00
|
|
|
; CHECK-NEXT: Tile Register Configure
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Virtual Register Rewriter
|
|
|
|
; CHECK-NEXT: Stack Slot Coloring
|
|
|
|
; CHECK-NEXT: Machine Copy Propagation Pass
|
|
|
|
; CHECK-NEXT: Machine Loop Invariant Code Motion
|
2021-02-20 15:05:07 +08:00
|
|
|
; CHECK-NEXT: X86 Lower Tile Copy
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Bundle Machine CFG Edges
|
|
|
|
; CHECK-NEXT: X86 FP Stackifier
|
2020-05-12 01:25:35 +08:00
|
|
|
; CHECK-NEXT: MachineDominator Tree Construction
|
|
|
|
; CHECK-NEXT: Machine Dominance Frontier Construction
|
|
|
|
; CHECK-NEXT: X86 Load Value Injection (LVI) Load Hardening
|
2020-04-09 19:40:53 +08:00
|
|
|
; CHECK-NEXT: Fixup Statepoint Caller Saved
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: PostRA Machine Sink
|
2020-04-09 19:40:53 +08:00
|
|
|
; CHECK-NEXT: Machine Block Frequency Analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: MachinePostDominator Tree Construction
|
|
|
|
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
|
|
|
|
; CHECK-NEXT: Machine Optimization Remark Emitter
|
2018-06-05 08:27:24 +08:00
|
|
|
; CHECK-NEXT: Shrink Wrapping analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Prologue/Epilogue Insertion & Frame Finalization
|
|
|
|
; CHECK-NEXT: Control Flow Optimizer
|
2019-12-06 01:39:37 +08:00
|
|
|
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Tail Duplication
|
|
|
|
; CHECK-NEXT: Machine Copy Propagation Pass
|
|
|
|
; CHECK-NEXT: Post-RA pseudo instruction expansion pass
|
|
|
|
; CHECK-NEXT: X86 pseudo instruction expansion pass
|
|
|
|
; CHECK-NEXT: MachineDominator Tree Construction
|
|
|
|
; CHECK-NEXT: Machine Natural Loop Construction
|
|
|
|
; CHECK-NEXT: Post RA top-down list latency scheduler
|
|
|
|
; CHECK-NEXT: Analyze Machine Code For Garbage Collection
|
|
|
|
; CHECK-NEXT: Machine Block Frequency Analysis
|
|
|
|
; CHECK-NEXT: MachinePostDominator Tree Construction
|
|
|
|
; CHECK-NEXT: Branch Probability Basic Block Placement
|
2020-01-19 13:44:06 +08:00
|
|
|
; CHECK-NEXT: Insert fentry calls
|
|
|
|
; CHECK-NEXT: Insert XRay ops
|
|
|
|
; CHECK-NEXT: Implement the 'patchable-function' attribute
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: ReachingDefAnalysis
|
|
|
|
; CHECK-NEXT: X86 Execution Dependency Fix
|
|
|
|
; CHECK-NEXT: BreakFalseDeps
|
|
|
|
; CHECK-NEXT: X86 Indirect Branch Tracking
|
|
|
|
; CHECK-NEXT: X86 vzeroupper inserter
|
|
|
|
; CHECK-NEXT: MachineDominator Tree Construction
|
|
|
|
; CHECK-NEXT: Machine Natural Loop Construction
|
2019-12-06 01:39:37 +08:00
|
|
|
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: X86 Byte/Word Instruction Fixup
|
2019-12-06 01:39:37 +08:00
|
|
|
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: X86 Atom pad short functions
|
|
|
|
; CHECK-NEXT: X86 LEA Fixup
|
|
|
|
; CHECK-NEXT: Compressing EVEX instrs to VEX encoding when possible
|
2018-11-30 09:01:52 +08:00
|
|
|
; CHECK-NEXT: X86 Discriminate Memory Operands
|
|
|
|
; CHECK-NEXT: X86 Insert Cache Prefetches
|
2020-01-16 10:49:59 +08:00
|
|
|
; CHECK-NEXT: X86 insert wait instruction
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Contiguously Lay Out Funclets
|
|
|
|
; CHECK-NEXT: StackMap Liveness Analysis
|
|
|
|
; CHECK-NEXT: Live DEBUG_VALUE analysis
|
2020-05-12 00:33:55 +08:00
|
|
|
; CHECK-NEXT: X86 Speculative Execution Side Effect Suppression
|
2020-04-03 12:00:44 +08:00
|
|
|
; CHECK-NEXT: X86 Indirect Thunks
|
2018-04-24 18:32:08 +08:00
|
|
|
; CHECK-NEXT: Check CFA info and insert CFI instructions if needed
|
2020-04-04 01:58:38 +08:00
|
|
|
; CHECK-NEXT: X86 Load Value Injection (LVI) Ret-Hardening
|
2018-03-23 07:02:48 +08:00
|
|
|
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
|
|
|
|
; CHECK-NEXT: Machine Optimization Remark Emitter
|
|
|
|
; CHECK-NEXT: X86 Assembly Printer
|
|
|
|
; CHECK-NEXT: Free MachineFunction
|
|
|
|
|
|
|
|
define void @f() {
|
|
|
|
ret void
|
|
|
|
}
|