Memory operands store a base alignment that does not factor in the effect of the offset on the alignment. Previously the printing code only printed the base alignment if it was different than the size. If there is an offset, the reader would need to figure out the effective alignment themselves. This has confused me before and someone else was recently confused on IRC. This patch prints the possibly offset adjusted alignment if it is different than the size. And prints the base alignment if it is different than the alignment. The MIR parser has been updated to read basealign in addition to align. Reviewed By: arsenm Differential Revision: https://reviews.llvm.org/D94344
46 lines
2.1 KiB
YAML
46 lines
2.1 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -mtriple=i386-unknown-linux-musl -verify-machineinstrs -run-pass=regallocfast -o - %s | FileCheck %s
|
|
|
|
# Make sure this case doesn't assert or try to assign $ecx to %1 on
|
|
# SHRD32rrCL
|
|
|
|
---
|
|
name: foo
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
; CHECK-LABEL: name: foo
|
|
; CHECK: renamable $eax = IMPLICIT_DEF
|
|
; CHECK: renamable $edx = MOVZX32rm8 renamable $eax, 1, $noreg, 0, $noreg :: (load 1 from `i168* undef` + 20, align 4, basealign 16)
|
|
; CHECK: dead renamable $ecx = MOV32rm renamable $eax, 1, $noreg, 0, $noreg :: (load 4 from `i168* undef` + 12, basealign 16)
|
|
; CHECK: renamable $al = MOV8rm killed renamable $eax, 1, $noreg, 0, $noreg :: (load 1 from `i32* undef`, align 4)
|
|
; CHECK: dead renamable $ecx = COPY renamable $edx
|
|
; CHECK: dead renamable $ecx = COPY renamable $edx
|
|
; CHECK: dead renamable $ecx = COPY renamable $edx
|
|
; CHECK: renamable $esi = IMPLICIT_DEF
|
|
; CHECK: renamable $ecx = IMPLICIT_DEF
|
|
; CHECK: renamable $ecx = CMOV32rr renamable $ecx, killed renamable $esi, 2, implicit undef $eflags
|
|
; CHECK: renamable $cl = MOV8ri -128
|
|
; CHECK: $cl = IMPLICIT_DEF
|
|
; CHECK: renamable $eax = COPY renamable $edx
|
|
; CHECK: dead renamable $eax = SHRD32rrCL renamable $eax, killed renamable $edx, implicit-def dead $eflags, implicit killed $cl
|
|
; CHECK: RETL
|
|
%0:gr32 = IMPLICIT_DEF
|
|
%1:gr32 = MOVZX32rm8 %0, 1, $noreg, 0, $noreg :: (load 1 from `i168* undef` + 20, align 4, basealign 16)
|
|
%2:gr32 = MOV32rm %0, 1, $noreg, 0, $noreg :: (load 4 from `i168* undef` + 12, basealign 16)
|
|
%3:gr8 = MOV8rm %0, 1, $noreg, 0, $noreg :: (load 1 from `i32* undef`, align 4)
|
|
%4:gr32 = COPY %1
|
|
%5:gr32 = COPY %1
|
|
%6:gr32 = COPY %1
|
|
%7:gr32 = IMPLICIT_DEF
|
|
%8:gr32 = IMPLICIT_DEF
|
|
%8:gr32 = CMOV32rr %8, killed %7, 2, implicit undef $eflags
|
|
%9:gr8 = MOV8ri -128
|
|
%9:gr8 = COPY %3
|
|
$cl = IMPLICIT_DEF
|
|
%8:gr32 = COPY %1
|
|
%8:gr32 = SHRD32rrCL %8, %1, implicit-def dead $eflags, implicit $cl
|
|
RETL
|
|
|
|
...
|