Kai Nacke a1710eb3cd [SystemZ][NFC] Opaque pointer migration.
The LIT test cases were migrated with the script provided by
Nikita Popov.

No manual changes were made. Committed without review since
no functional changes, after consultation with uweigand.
2022-10-11 21:09:43 +00:00

75 lines
2.4 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=s390x-linux-gnu -mcpu=z13 < %s | FileCheck %s
; Test that DAGCombiner gets helped by computeKnownBitsForTargetNode().
; SystemZISD::REPLICATE
define i32 @f0(ptr %p0) {
; CHECK-LABEL: f0:
; CHECK: # %bb.0:
; CHECK-NEXT: vl %v0, 0(%r2), 3
; CHECK-NEXT: vgbm %v1, 0
; CHECK-NEXT: vceqf %v0, %v0, %v1
; CHECK-NEXT: vrepif %v1, 1
; CHECK-NEXT: vnc %v0, %v1, %v0
; CHECK-NEXT: vst %v0, 0(%r2), 3
; CHECK-NEXT: vlgvf %r2, %v0, 3
; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d
; CHECK-NEXT: br %r14
%a0 = load <4 x i32>, ptr %p0, align 8
%cmp0 = icmp ne <4 x i32> %a0, zeroinitializer
%zxt0 = zext <4 x i1> %cmp0 to <4 x i32>
store <4 x i32> %zxt0, ptr %p0, align 8
%ext0 = extractelement <4 x i32> %zxt0, i32 3
br label %exit
exit:
; The vector icmp+zext involves a REPLICATE of 1's. If KnownBits reflects
; this, DAGCombiner can see that the i32 icmp and zext here are not needed.
%cmp1 = icmp ne i32 %ext0, 0
%zxt1 = zext i1 %cmp1 to i32
ret i32 %zxt1
}
; SystemZISD::JOIN_DWORDS (and REPLICATE)
; The DAG XOR has JOIN_DWORDS and REPLICATE operands. With KnownBits properly set
; for both these nodes, ICMP is used instead of TM during lowering because
; adjustForRedundantAnd() succeeds.
define void @f1(i64 %a0, i64 %a1) {
; CHECK-LABEL: f1:
; CHECK: # %bb.0:
; CHECK-NEXT: risbgn %r0, %r2, 63, 191, 0
; CHECK-NEXT: risbgn %r1, %r3, 63, 191, 0
; CHECK-NEXT: vlvgp %v0, %r0, %r1
; CHECK-NEXT: vrepig %v1, 1
; CHECK-NEXT: vx %v0, %v0, %v1
; CHECK-NEXT: vlgvg %r0, %v0, 0
; CHECK-NEXT: cgijlh %r0, 0, .LBB1_3
; CHECK-NEXT: # %bb.1:
; CHECK-NEXT: vlgvg %r0, %v0, 1
; CHECK-NEXT: cgijlh %r0, 0, .LBB1_3
; CHECK-NEXT: # %bb.2:
; CHECK-NEXT: .LBB1_3:
%1 = and i64 %a0, 1
%2 = and i64 %a1, 1
%3 = insertelement <2 x i64> undef, i64 %1, i32 0
%4 = insertelement <2 x i64> %3, i64 %2, i32 1
%5 = xor <2 x i64> %4, <i64 1, i64 1>
%6 = extractelement <2 x i64> %5, i32 0
%7 = and i64 %6, 1
%8 = icmp eq i64 %7, 0
br i1 %8, label %9, label %14
; <label>:9: ; preds = %0
%10 = extractelement <2 x i64> %5, i32 1
%11 = and i64 %10, 1
%12 = icmp eq i64 %11, 0
br i1 %12, label %13, label %14
; <label>:13: ; preds = %0
unreachable
; <label>:14: ; preds = %0
unreachable
}