
addr matching was the only gatekeeper for starting selecting G_LOAD and G_STORE using SDAG patterns. * Introduce a complex renderer gi_addr for addr. In this patch only the existing functionality has been implemented. The renderer's name is the same as in SDAG: selectAddr. Apparently the type of GIComplexOperandMatcher doesn't matter as RISCV also uses s32 for both 64 and 32 bit pointers. * X86SelectAddress now is used for both: pattern matching and manual selection. As a result it accumulates all the code that previously was distributed among different selection functions. * Replace getLoadStoreOp with getPtrLoadStoreOp in Load/Store selector as GlobalISel matcher or emitter can't map the pointer type into i32/i64 types used in SDAG patterns for pointers. So the load and store selection of pointers is still manual. getLoadStoreOp is still present because it is used in G_FCONSTANT lowering that requires extra efforts to select it using SDAG patterns. * Since truncating stores are not supported, we custom legalize them by matching types of store and MMO. * Introduce a constant pool flag in X86AddressMode because otherwise we need to introduce a GlobalISel copy for X86ISelAddressMode. * Also please notice in the tests that GlobalISel prefers to fold memory operands immediately comparing to SDAG. The reason is that GlobalISel doesn't have target hooks in GIM_CheckIsSafeToFold. Or maybe another check on profitability is required along with safety check that is currently not present.
69 lines
3.1 KiB
YAML
69 lines
3.1 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
|
|
# RUN: llc -mtriple=i686-linux-gnu -run-pass=regbankselect,instruction-select %s -o - | FileCheck %s --check-prefixes GISEL-I686
|
|
|
|
---
|
|
name: test_sqrt_f32
|
|
alignment: 16
|
|
legalized: true
|
|
fixedStack:
|
|
- { id: 0, type: default, offset: 0, size: 4, alignment: 16, stack-id: default,
|
|
isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
|
|
body: |
|
|
bb.1:
|
|
; GISEL-I686-LABEL: name: test_sqrt_f32
|
|
; GISEL-I686: [[LD_Fp32m:%[0-9]+]]:rfp32 = nofpexcept LD_Fp32m %fixed-stack.0, 1, $noreg, 0, $noreg, implicit-def dead $fpsw, implicit $fpcw :: (invariant load (s32) from %fixed-stack.0, align 16)
|
|
; GISEL-I686-NEXT: [[SQRT_Fp32_:%[0-9]+]]:rfp32 = nofpexcept SQRT_Fp32 [[LD_Fp32m]], implicit-def dead $fpsw, implicit $fpcw
|
|
; GISEL-I686-NEXT: $fp0 = COPY [[SQRT_Fp32_]]
|
|
; GISEL-I686-NEXT: RET 0, implicit $fp0
|
|
%1:_(p0) = G_FRAME_INDEX %fixed-stack.0
|
|
%0:_(s32) = G_LOAD %1(p0) :: (invariant load (s32) from %fixed-stack.0, align 16)
|
|
%2:_(s32) = G_FSQRT %0
|
|
$fp0 = COPY %2(s32)
|
|
RET 0, implicit $fp0
|
|
|
|
...
|
|
---
|
|
name: test_sqrt_f64
|
|
alignment: 16
|
|
legalized: true
|
|
fixedStack:
|
|
- { id: 0, type: default, offset: 0, size: 8, alignment: 16, stack-id: default,
|
|
isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
|
|
body: |
|
|
bb.1:
|
|
; GISEL-I686-LABEL: name: test_sqrt_f64
|
|
; GISEL-I686: [[DEF:%[0-9]+]]:rfp64 = IMPLICIT_DEF
|
|
; GISEL-I686-NEXT: [[SQRT_Fp64_:%[0-9]+]]:rfp64 = nofpexcept SQRT_Fp64 [[DEF]], implicit-def dead $fpsw, implicit $fpcw
|
|
; GISEL-I686-NEXT: $fp0 = COPY [[SQRT_Fp64_]]
|
|
; GISEL-I686-NEXT: RET 0, implicit $fp0
|
|
%0:_(s64) = IMPLICIT_DEF
|
|
%2:_(s64) = G_FSQRT %0
|
|
$fp0 = COPY %2(s64)
|
|
RET 0, implicit $fp0
|
|
|
|
...
|
|
---
|
|
name: test_sqrt_f80
|
|
alignment: 16
|
|
legalized: true
|
|
fixedStack:
|
|
- { id: 0, type: default, offset: 0, size: 10, alignment: 16, stack-id: default,
|
|
isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
|
|
body: |
|
|
bb.1:
|
|
; GISEL-I686-LABEL: name: test_sqrt_f80
|
|
; GISEL-I686: [[LD_Fp80m:%[0-9]+]]:rfp80 = nofpexcept LD_Fp80m %fixed-stack.0, 1, $noreg, 0, $noreg, implicit-def dead $fpsw, implicit $fpcw :: (invariant load (s80) from %fixed-stack.0, align 16)
|
|
; GISEL-I686-NEXT: [[SQRT_Fp80_:%[0-9]+]]:rfp80 = nofpexcept SQRT_Fp80 [[LD_Fp80m]], implicit-def dead $fpsw, implicit $fpcw
|
|
; GISEL-I686-NEXT: $fp0 = COPY [[SQRT_Fp80_]]
|
|
; GISEL-I686-NEXT: RET 0, implicit $fp0
|
|
%1:_(p0) = G_FRAME_INDEX %fixed-stack.0
|
|
%0:_(s80) = G_LOAD %1(p0) :: (invariant load (s80) from %fixed-stack.0, align 16)
|
|
%2:_(s80) = G_FSQRT %0
|
|
$fp0 = COPY %2(s80)
|
|
RET 0, implicit $fp0
|
|
|
|
...
|