|
|
@@ -0,0 +1,158 @@ |
|
|
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2 |
|
|
# REQUIRES: asserts |
|
|
# RUN: llc %s -o - -mtriple=riscv32 -mattr=+zcmp -target-abi ilp32 -run-pass=prologepilog \ |
|
|
# RUN: -simplify-mir -verify-machineinstrs | FileCheck %s |
|
|
|
|
|
--- | |
|
|
define hidden void @f(fp128 %a) local_unnamed_addr #0 { |
|
|
entry: |
|
|
%0 = bitcast fp128 %a to i128 |
|
|
%and.i = lshr i128 %0, 112 |
|
|
%1 = trunc i128 %and.i to i32 |
|
|
%2 = and i32 %1, 32767 |
|
|
%or.i = or i128 poison, 5192296858534827628530496329220096 |
|
|
br label %if.end.i |
|
|
|
|
|
if.end.i: ; preds = %entry |
|
|
br i1 poison, label %exit, label %if.then12.i |
|
|
|
|
|
if.then12.i: ; preds = %if.end.i |
|
|
%sub13.i = sub nuw nsw i32 16495, %2 |
|
|
%sh_prom.i = zext i32 %sub13.i to i128 |
|
|
%shr14.i = lshr i128 %or.i, %sh_prom.i |
|
|
%conv15.i = trunc i128 %shr14.i to i32 |
|
|
br label %exit |
|
|
|
|
|
exit: ; preds = %if.then12.i, %if.end.i |
|
|
%retval.0.i = phi i32 [ %conv15.i, %if.then12.i ], [ -1, %if.end.i ] |
|
|
ret void |
|
|
} |
|
|
... |
|
|
--- |
|
|
name: f |
|
|
alignment: 2 |
|
|
tracksRegLiveness: true |
|
|
tracksDebugUserValues: true |
|
|
liveins: |
|
|
- { reg: '$x10' } |
|
|
frameInfo: |
|
|
maxAlignment: 1 |
|
|
localFrameSize: 32 |
|
|
savePoint: '%bb.2' |
|
|
restorePoint: '%bb.2' |
|
|
stack: |
|
|
- { id: 0, size: 32, alignment: 1, local-offset: -32 } |
|
|
machineFunctionInfo: |
|
|
varArgsFrameIndex: 0 |
|
|
varArgsSaveSize: 0 |
|
|
body: | |
|
|
; CHECK-LABEL: name: f |
|
|
; CHECK: bb.0.entry: |
|
|
; CHECK-NEXT: liveins: $x10 |
|
|
; CHECK-NEXT: {{ $}} |
|
|
; CHECK-NEXT: renamable $x10 = ADDI $x0, -1 |
|
|
; CHECK-NEXT: {{ $}} |
|
|
; CHECK-NEXT: bb.1.if.end.i: |
|
|
; CHECK-NEXT: liveins: $x10 |
|
|
; CHECK-NEXT: {{ $}} |
|
|
; CHECK-NEXT: BNE $x0, $x0, %bb.3 |
|
|
; CHECK-NEXT: PseudoBR %bb.2 |
|
|
; CHECK-NEXT: {{ $}} |
|
|
; CHECK-NEXT: bb.2.if.then12.i: |
|
|
; CHECK-NEXT: liveins: $x10 |
|
|
; CHECK-NEXT: {{ $}} |
|
|
; CHECK-NEXT: $x2 = frame-setup ADDI $x2, -32 |
|
|
; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32 |
|
|
; CHECK-NEXT: SB $x0, $x2, 31 :: (store (s8) into %stack.0 + 31) |
|
|
; CHECK-NEXT: SB $x0, $x2, 30 :: (store (s8) into %stack.0 + 30) |
|
|
; CHECK-NEXT: SB $x0, $x2, 29 :: (store (s8) into %stack.0 + 29) |
|
|
; CHECK-NEXT: SB $x0, $x2, 28 :: (store (s8) into %stack.0 + 28) |
|
|
; CHECK-NEXT: SB $x0, $x2, 27 :: (store (s8) into %stack.0 + 27) |
|
|
; CHECK-NEXT: SB $x0, $x2, 26 :: (store (s8) into %stack.0 + 26) |
|
|
; CHECK-NEXT: SB $x0, $x2, 25 :: (store (s8) into %stack.0 + 25) |
|
|
; CHECK-NEXT: SB $x0, $x2, 24 :: (store (s8) into %stack.0 + 24) |
|
|
; CHECK-NEXT: SB $x0, $x2, 23 :: (store (s8) into %stack.0 + 23) |
|
|
; CHECK-NEXT: SB $x0, $x2, 22 :: (store (s8) into %stack.0 + 22) |
|
|
; CHECK-NEXT: SB $x0, $x2, 21 :: (store (s8) into %stack.0 + 21) |
|
|
; CHECK-NEXT: SB $x0, $x2, 20 :: (store (s8) into %stack.0 + 20) |
|
|
; CHECK-NEXT: SB $x0, $x2, 19 :: (store (s8) into %stack.0 + 19) |
|
|
; CHECK-NEXT: SB $x0, $x2, 18 :: (store (s8) into %stack.0 + 18) |
|
|
; CHECK-NEXT: SB $x0, $x2, 17 :: (store (s8) into %stack.0 + 17) |
|
|
; CHECK-NEXT: SB $x0, $x2, 16 :: (store (s8) into %stack.0 + 16) |
|
|
; CHECK-NEXT: SB renamable $x10, $x2, 0 :: (store (s8) into %stack.0) |
|
|
; CHECK-NEXT: SB renamable $x10, $x2, 4 :: (store (s8) into %stack.0 + 4) |
|
|
; CHECK-NEXT: renamable $x11 = SRLI renamable $x10, 24 |
|
|
; CHECK-NEXT: SB renamable $x11, $x2, 3 :: (store (s8) into %stack.0 + 3) |
|
|
; CHECK-NEXT: renamable $x12 = SRLI renamable $x10, 16 |
|
|
; CHECK-NEXT: SB renamable $x12, $x2, 2 :: (store (s8) into %stack.0 + 2) |
|
|
; CHECK-NEXT: renamable $x13 = SRLI renamable $x10, 8 |
|
|
; CHECK-NEXT: SB renamable $x13, $x2, 1 :: (store (s8) into %stack.0 + 1) |
|
|
; CHECK-NEXT: SB renamable $x10, $x2, 8 :: (store (s8) into %stack.0 + 8) |
|
|
; CHECK-NEXT: SB renamable $x11, $x2, 7 :: (store (s8) into %stack.0 + 7) |
|
|
; CHECK-NEXT: SB renamable $x12, $x2, 6 :: (store (s8) into %stack.0 + 6) |
|
|
; CHECK-NEXT: SB renamable $x13, $x2, 5 :: (store (s8) into %stack.0 + 5) |
|
|
; CHECK-NEXT: SB killed renamable $x10, $x2, 12 :: (store (s8) into %stack.0 + 12) |
|
|
; CHECK-NEXT: SB renamable $x11, $x2, 11 :: (store (s8) into %stack.0 + 11) |
|
|
; CHECK-NEXT: SB renamable $x12, $x2, 10 :: (store (s8) into %stack.0 + 10) |
|
|
; CHECK-NEXT: SB renamable $x13, $x2, 9 :: (store (s8) into %stack.0 + 9) |
|
|
; CHECK-NEXT: SB killed renamable $x11, $x2, 15 :: (store (s8) into %stack.0 + 15) |
|
|
; CHECK-NEXT: SB killed renamable $x12, $x2, 14 :: (store (s8) into %stack.0 + 14) |
|
|
; CHECK-NEXT: SB killed renamable $x13, $x2, 13 :: (store (s8) into %stack.0 + 13) |
|
|
; CHECK-NEXT: $x2 = frame-destroy ADDI $x2, 32 |
|
|
; CHECK-NEXT: {{ $}} |
|
|
; CHECK-NEXT: bb.3.exit: |
|
|
; CHECK-NEXT: PseudoRET |
|
|
bb.0.entry: |
|
|
liveins: $x10 |
|
|
|
|
|
renamable $x10 = ADDI $x0, -1 |
|
|
|
|
|
bb.1.if.end.i: |
|
|
liveins: $x10 |
|
|
|
|
|
BNE $x0, $x0, %bb.3 |
|
|
PseudoBR %bb.2 |
|
|
|
|
|
bb.2.if.then12.i: |
|
|
liveins: $x10 |
|
|
|
|
|
SB $x0, %stack.0, 31 :: (store (s8) into %stack.0 + 31) |
|
|
SB $x0, %stack.0, 30 :: (store (s8) into %stack.0 + 30) |
|
|
SB $x0, %stack.0, 29 :: (store (s8) into %stack.0 + 29) |
|
|
SB $x0, %stack.0, 28 :: (store (s8) into %stack.0 + 28) |
|
|
SB $x0, %stack.0, 27 :: (store (s8) into %stack.0 + 27) |
|
|
SB $x0, %stack.0, 26 :: (store (s8) into %stack.0 + 26) |
|
|
SB $x0, %stack.0, 25 :: (store (s8) into %stack.0 + 25) |
|
|
SB $x0, %stack.0, 24 :: (store (s8) into %stack.0 + 24) |
|
|
SB $x0, %stack.0, 23 :: (store (s8) into %stack.0 + 23) |
|
|
SB $x0, %stack.0, 22 :: (store (s8) into %stack.0 + 22) |
|
|
SB $x0, %stack.0, 21 :: (store (s8) into %stack.0 + 21) |
|
|
SB $x0, %stack.0, 20 :: (store (s8) into %stack.0 + 20) |
|
|
SB $x0, %stack.0, 19 :: (store (s8) into %stack.0 + 19) |
|
|
SB $x0, %stack.0, 18 :: (store (s8) into %stack.0 + 18) |
|
|
SB $x0, %stack.0, 17 :: (store (s8) into %stack.0 + 17) |
|
|
SB $x0, %stack.0, 16 :: (store (s8) into %stack.0 + 16) |
|
|
SB renamable $x10, %stack.0, 0 :: (store (s8) into %stack.0) |
|
|
SB renamable $x10, %stack.0, 4 :: (store (s8) into %stack.0 + 4) |
|
|
renamable $x11 = SRLI renamable $x10, 24 |
|
|
SB renamable $x11, %stack.0, 3 :: (store (s8) into %stack.0 + 3) |
|
|
renamable $x12 = SRLI renamable $x10, 16 |
|
|
SB renamable $x12, %stack.0, 2 :: (store (s8) into %stack.0 + 2) |
|
|
renamable $x13 = SRLI renamable $x10, 8 |
|
|
SB renamable $x13, %stack.0, 1 :: (store (s8) into %stack.0 + 1) |
|
|
SB renamable $x10, %stack.0, 8 :: (store (s8) into %stack.0 + 8) |
|
|
SB renamable $x11, %stack.0, 7 :: (store (s8) into %stack.0 + 7) |
|
|
SB renamable $x12, %stack.0, 6 :: (store (s8) into %stack.0 + 6) |
|
|
SB renamable $x13, %stack.0, 5 :: (store (s8) into %stack.0 + 5) |
|
|
SB killed renamable $x10, %stack.0, 12 :: (store (s8) into %stack.0 + 12) |
|
|
SB renamable $x11, %stack.0, 11 :: (store (s8) into %stack.0 + 11) |
|
|
SB renamable $x12, %stack.0, 10 :: (store (s8) into %stack.0 + 10) |
|
|
SB renamable $x13, %stack.0, 9 :: (store (s8) into %stack.0 + 9) |
|
|
SB killed renamable $x11, %stack.0, 15 :: (store (s8) into %stack.0 + 15) |
|
|
SB killed renamable $x12, %stack.0, 14 :: (store (s8) into %stack.0 + 14) |
|
|
SB killed renamable $x13, %stack.0, 13 :: (store (s8) into %stack.0 + 13) |
|
|
|
|
|
bb.3.exit: |
|
|
PseudoRET |
|
|
|
|
|
... |