365 lines
11 KiB
Text
365 lines
11 KiB
Text
|
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
||
|
# RUN: llc -mtriple aarch64 -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s
|
||
|
|
||
|
...
|
||
|
---
|
||
|
name: simplify_to_x
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1
|
||
|
; (x + y) - y -> x
|
||
|
; CHECK-LABEL: name: simplify_to_x
|
||
|
; CHECK: liveins: $w0, $w1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x:_(s32) = COPY $w0
|
||
|
; CHECK-NEXT: $w0 = COPY %x(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x:_(s32) = COPY $w0
|
||
|
%y:_(s32) = COPY $w1
|
||
|
%add:_(s32) = G_ADD %x, %y
|
||
|
%sub:_(s32) = G_SUB %add, %y
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: simplify_to_y
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1
|
||
|
; (x + y) - x -> y
|
||
|
; CHECK-LABEL: name: simplify_to_y
|
||
|
; CHECK: liveins: $w0, $w1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %y:_(s32) = COPY $w1
|
||
|
; CHECK-NEXT: $w0 = COPY %y(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x:_(s32) = COPY $w0
|
||
|
%y:_(s32) = COPY $w1
|
||
|
%add:_(s32) = G_ADD %x, %y
|
||
|
%sub:_(s32) = G_SUB %add, %x
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: simplify_to_constant_x
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1
|
||
|
; (x + 1) - 1 -> x
|
||
|
; CHECK-LABEL: name: simplify_to_constant_x
|
||
|
; CHECK: liveins: $w0, $w1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x:_(s32) = COPY $w0
|
||
|
; CHECK-NEXT: $w0 = COPY %x(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x:_(s32) = COPY $w0
|
||
|
%y1:_(s32) = G_CONSTANT i32 1
|
||
|
%y2:_(s32) = G_CONSTANT i32 1
|
||
|
%add:_(s32) = G_ADD %x, %y1
|
||
|
%sub:_(s32) = G_SUB %add, %y2
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: simplify_to_constant_y
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1
|
||
|
; (x + y) - x -> y
|
||
|
; CHECK-LABEL: name: simplify_to_constant_y
|
||
|
; CHECK: liveins: $w0, $w1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %y:_(s32) = COPY $w1
|
||
|
; CHECK-NEXT: $w0 = COPY %y(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x1:_(s32) = G_CONSTANT i32 1
|
||
|
%x2:_(s32) = G_CONSTANT i32 1
|
||
|
%y:_(s32) = COPY $w1
|
||
|
%add:_(s32) = G_ADD %x1, %y
|
||
|
%sub:_(s32) = G_SUB %add, %x2
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: vector_simplify_to_x
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $d0, $d1
|
||
|
; (x + y) - y -> x
|
||
|
; CHECK-LABEL: name: vector_simplify_to_x
|
||
|
; CHECK: liveins: $d0, $d1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x:_(<2 x s32>) = COPY $d0
|
||
|
; CHECK-NEXT: $d0 = COPY %x(<2 x s32>)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $d0
|
||
|
%x:_(<2 x s32>) = COPY $d0
|
||
|
%y:_(<2 x s32>) = COPY $d1
|
||
|
%add:_(<2 x s32>) = G_ADD %x, %y
|
||
|
%sub:_(<2 x s32>) = G_SUB %add, %y
|
||
|
$d0 = COPY %sub(<2 x s32>)
|
||
|
RET_ReallyLR implicit $d0
|
||
|
...
|
||
|
---
|
||
|
name: splat_simplify_to_x
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $d0, $d1
|
||
|
; (x + 1) - 1 -> x
|
||
|
; CHECK-LABEL: name: splat_simplify_to_x
|
||
|
; CHECK: liveins: $d0, $d1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x:_(<2 x s32>) = COPY $d0
|
||
|
; CHECK-NEXT: $d0 = COPY %x(<2 x s32>)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $d0
|
||
|
%x:_(<2 x s32>) = COPY $d0
|
||
|
%cst:_(s32) = G_CONSTANT i32 1
|
||
|
%y1:_(<2 x s32>) = G_BUILD_VECTOR %cst, %cst
|
||
|
%y2:_(<2 x s32>) = G_BUILD_VECTOR %cst, %cst
|
||
|
%add:_(<2 x s32>) = G_ADD %x, %y1
|
||
|
%sub:_(<2 x s32>) = G_SUB %add, %y2
|
||
|
$d0 = COPY %sub(<2 x s32>)
|
||
|
RET_ReallyLR implicit $d0
|
||
|
...
|
||
|
---
|
||
|
name: unique_registers_no_fold
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1, $w2
|
||
|
; CHECK-LABEL: name: unique_registers_no_fold
|
||
|
; CHECK: liveins: $w0, $w1, $w2
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x:_(s32) = COPY $w0
|
||
|
; CHECK-NEXT: %y:_(s32) = COPY $w1
|
||
|
; CHECK-NEXT: %z:_(s32) = COPY $w2
|
||
|
; CHECK-NEXT: %add:_(s32) = G_ADD %y, %x
|
||
|
; CHECK-NEXT: %sub:_(s32) = G_SUB %add, %z
|
||
|
; CHECK-NEXT: $w0 = COPY %sub(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x:_(s32) = COPY $w0
|
||
|
%y:_(s32) = COPY $w1
|
||
|
%z:_(s32) = COPY $w2
|
||
|
%add:_(s32) = G_ADD %y, %x
|
||
|
%sub:_(s32) = G_SUB %add, %z
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: unique_constants_no_fold
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1
|
||
|
; (x + y) - x -> y
|
||
|
; CHECK-LABEL: name: unique_constants_no_fold
|
||
|
; CHECK: liveins: $w0, $w1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x1:_(s32) = G_CONSTANT i32 1
|
||
|
; CHECK-NEXT: %x2:_(s32) = G_CONSTANT i32 2
|
||
|
; CHECK-NEXT: %y:_(s32) = COPY $w1
|
||
|
; CHECK-NEXT: %add:_(s32) = G_ADD %y, %x1
|
||
|
; CHECK-NEXT: %sub:_(s32) = G_SUB %add, %x2
|
||
|
; CHECK-NEXT: $w0 = COPY %sub(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x1:_(s32) = G_CONSTANT i32 1
|
||
|
%x2:_(s32) = G_CONSTANT i32 2
|
||
|
%y:_(s32) = COPY $w1
|
||
|
%add:_(s32) = G_ADD %x1, %y
|
||
|
%sub:_(s32) = G_SUB %add, %x2
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: simplify_to_neg_y
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1
|
||
|
; x - (y + x) -> 0 - y
|
||
|
; CHECK-LABEL: name: simplify_to_neg_y
|
||
|
; CHECK: liveins: $w0, $w1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %y:_(s32) = COPY $w1
|
||
|
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
|
||
|
; CHECK-NEXT: %sub:_(s32) = G_SUB [[C]], %y
|
||
|
; CHECK-NEXT: $w0 = COPY %sub(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x:_(s32) = COPY $w0
|
||
|
%y:_(s32) = COPY $w1
|
||
|
%add:_(s32) = G_ADD %x, %y
|
||
|
%sub:_(s32) = G_SUB %x, %add
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: simplify_to_neg_x
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1
|
||
|
; y - (y + x) -> 0 - x
|
||
|
; CHECK-LABEL: name: simplify_to_neg_x
|
||
|
; CHECK: liveins: $w0, $w1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x:_(s32) = COPY $w0
|
||
|
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
|
||
|
; CHECK-NEXT: %sub:_(s32) = G_SUB [[C]], %x
|
||
|
; CHECK-NEXT: $w0 = COPY %sub(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x:_(s32) = COPY $w0
|
||
|
%y:_(s32) = COPY $w1
|
||
|
%add:_(s32) = G_ADD %x, %y
|
||
|
%sub:_(s32) = G_SUB %y, %add
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: simplify_to_neg_y_constant
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1
|
||
|
; x - (y + x) -> 0 - y
|
||
|
; CHECK-LABEL: name: simplify_to_neg_y_constant
|
||
|
; CHECK: liveins: $w0, $w1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %y:_(s32) = COPY $w1
|
||
|
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
|
||
|
; CHECK-NEXT: %sub:_(s32) = G_SUB [[C]], %y
|
||
|
; CHECK-NEXT: $w0 = COPY %sub(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x1:_(s32) = G_CONSTANT i32 1
|
||
|
%x2:_(s32) = G_CONSTANT i32 1
|
||
|
%y:_(s32) = COPY $w1
|
||
|
%add:_(s32) = G_ADD %x1, %y
|
||
|
%sub:_(s32) = G_SUB %x2, %add
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: simplify_to_neg_x_constant
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1
|
||
|
; y - (y + x) -> 0 - x
|
||
|
; CHECK-LABEL: name: simplify_to_neg_x_constant
|
||
|
; CHECK: liveins: $w0, $w1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x:_(s32) = COPY $w0
|
||
|
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
|
||
|
; CHECK-NEXT: %sub:_(s32) = G_SUB [[C]], %x
|
||
|
; CHECK-NEXT: $w0 = COPY %sub(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x:_(s32) = COPY $w0
|
||
|
%y1:_(s32) = G_CONSTANT i32 1
|
||
|
%y2:_(s32) = G_CONSTANT i32 1
|
||
|
%add:_(s32) = G_ADD %x, %y1
|
||
|
%sub:_(s32) = G_SUB %y2, %add
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: vector_simplify_to_neg_x
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $d0, $d1
|
||
|
; y - (y + x) -> 0 - x
|
||
|
; CHECK-LABEL: name: vector_simplify_to_neg_x
|
||
|
; CHECK: liveins: $d0, $d1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x:_(<2 x s32>) = COPY $d0
|
||
|
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
|
||
|
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32)
|
||
|
; CHECK-NEXT: %sub:_(<2 x s32>) = G_SUB [[BUILD_VECTOR]], %x
|
||
|
; CHECK-NEXT: $d0 = COPY %sub(<2 x s32>)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $d0
|
||
|
%x:_(<2 x s32>) = COPY $d0
|
||
|
%y:_(<2 x s32>) = COPY $d1
|
||
|
%add:_(<2 x s32>) = G_ADD %x, %y
|
||
|
%sub:_(<2 x s32>) = G_SUB %y, %add
|
||
|
$d0 = COPY %sub(<2 x s32>)
|
||
|
RET_ReallyLR implicit $d0
|
||
|
...
|
||
|
---
|
||
|
name: vector_simplify_to_neg_y_constant
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $d0, $d1
|
||
|
; x - (y + x) -> 0 - y
|
||
|
; CHECK-LABEL: name: vector_simplify_to_neg_y_constant
|
||
|
; CHECK: liveins: $d0, $d1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %y:_(<2 x s32>) = COPY $d1
|
||
|
; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
|
||
|
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32)
|
||
|
; CHECK-NEXT: %sub:_(<2 x s32>) = G_SUB [[BUILD_VECTOR]], %y
|
||
|
; CHECK-NEXT: $d0 = COPY %sub(<2 x s32>)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $d0
|
||
|
%cst:_(s32) = G_CONSTANT i32 1
|
||
|
%x1:_(<2 x s32>) = G_BUILD_VECTOR %cst, %cst
|
||
|
%x2:_(<2 x s32>) = G_BUILD_VECTOR %cst, %cst
|
||
|
%y:_(<2 x s32>) = COPY $d1
|
||
|
%add:_(<2 x s32>) = G_ADD %x1, %y
|
||
|
%sub:_(<2 x s32>) = G_SUB %x2, %add
|
||
|
$d0 = COPY %sub(<2 x s32>)
|
||
|
RET_ReallyLR implicit $d0
|
||
|
...
|
||
|
---
|
||
|
name: unique_registers_neg_no_fold
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1, $w2
|
||
|
; y - (y + x) -> 0 - x
|
||
|
; CHECK-LABEL: name: unique_registers_neg_no_fold
|
||
|
; CHECK: liveins: $w0, $w1, $w2
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x:_(s32) = COPY $w0
|
||
|
; CHECK-NEXT: %y:_(s32) = COPY $w1
|
||
|
; CHECK-NEXT: %z:_(s32) = COPY $w2
|
||
|
; CHECK-NEXT: %add:_(s32) = G_ADD %x, %y
|
||
|
; CHECK-NEXT: %sub:_(s32) = G_SUB %z, %add
|
||
|
; CHECK-NEXT: $w0 = COPY %sub(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x:_(s32) = COPY $w0
|
||
|
%y:_(s32) = COPY $w1
|
||
|
%z:_(s32) = COPY $w2
|
||
|
%add:_(s32) = G_ADD %x, %y
|
||
|
%sub:_(s32) = G_SUB %z, %add
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|
||
|
...
|
||
|
---
|
||
|
name: wrong_constant_neg_no_fold
|
||
|
tracksRegLiveness: true
|
||
|
body: |
|
||
|
bb.0:
|
||
|
liveins: $w0, $w1
|
||
|
; x - (y + x) -> 0 - y
|
||
|
; CHECK-LABEL: name: wrong_constant_neg_no_fold
|
||
|
; CHECK: liveins: $w0, $w1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: %x1:_(s32) = G_CONSTANT i32 1
|
||
|
; CHECK-NEXT: %x2:_(s32) = G_CONSTANT i32 2
|
||
|
; CHECK-NEXT: %y:_(s32) = COPY $w1
|
||
|
; CHECK-NEXT: %add:_(s32) = G_ADD %y, %x1
|
||
|
; CHECK-NEXT: %sub:_(s32) = G_SUB %x2, %add
|
||
|
; CHECK-NEXT: $w0 = COPY %sub(s32)
|
||
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
||
|
%x1:_(s32) = G_CONSTANT i32 1
|
||
|
%x2:_(s32) = G_CONSTANT i32 2
|
||
|
%y:_(s32) = COPY $w1
|
||
|
%add:_(s32) = G_ADD %x1, %y
|
||
|
%sub:_(s32) = G_SUB %x2, %add
|
||
|
$w0 = COPY %sub(s32)
|
||
|
RET_ReallyLR implicit $w0
|