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

492 lines
8.5 KiB
LLVM

; Test the use of TEST UNDER MASK for 32-bit operations.
;
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s
@g = global i32 0
; Check the lowest useful TMLL value.
define void @f1(i32 %a) {
; CHECK-LABEL: f1:
; CHECK: tmll %r2, 1
; CHECK: ber %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 1
%cmp = icmp eq i32 %and, 0
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check the high end of the TMLL range.
define void @f2(i32 %a) {
; CHECK-LABEL: f2:
; CHECK: tmll %r2, 65535
; CHECK: bner %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 65535
%cmp = icmp ne i32 %and, 0
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check the lowest useful TMLH value, which is the next value up.
define void @f3(i32 %a) {
; CHECK-LABEL: f3:
; CHECK: tmlh %r2, 1
; CHECK: bner %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 65536
%cmp = icmp ne i32 %and, 0
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check the next value up again, which cannot use TM.
define void @f4(i32 %a) {
; CHECK-LABEL: f4:
; CHECK-NOT: {{tm[lh].}}
; CHECK: br %r14
entry:
%and = and i32 %a, 4294901759
%cmp = icmp eq i32 %and, 0
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check the high end of the TMLH range.
define void @f5(i32 %a) {
; CHECK-LABEL: f5:
; CHECK: tmlh %r2, 65535
; CHECK: ber %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 4294901760
%cmp = icmp eq i32 %and, 0
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for LT comparisons that are equivalent to
; an equality comparison with zero.
define void @f6(i32 %a) {
; CHECK-LABEL: f6:
; CHECK: tmll %r2, 240
; CHECK: ber %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 240
%cmp = icmp slt i32 %and, 16
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; ...same again with LE.
define void @f7(i32 %a) {
; CHECK-LABEL: f7:
; CHECK: tmll %r2, 240
; CHECK: ber %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 240
%cmp = icmp sle i32 %and, 15
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for GE comparisons that are equivalent to
; an inequality comparison with zero.
define void @f8(i32 %a) {
; CHECK-LABEL: f8:
; CHECK: tmll %r2, 240
; CHECK: bner %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 240
%cmp = icmp uge i32 %and, 16
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; ...same again with GT.
define void @f9(i32 %a) {
; CHECK-LABEL: f9:
; CHECK: tmll %r2, 240
; CHECK: bner %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 240
%cmp = icmp ugt i32 %and, 15
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for LT comparisons that effectively
; test whether the top bit is clear.
define void @f10(i32 %a) {
; CHECK-LABEL: f10:
; CHECK: tmll %r2, 35
; CHECK: bler %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 35
%cmp = icmp ult i32 %and, 8
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; ...same again with LE.
define void @f11(i32 %a) {
; CHECK-LABEL: f11:
; CHECK: tmll %r2, 35
; CHECK: bler %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 35
%cmp = icmp ule i32 %and, 31
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for GE comparisons that effectively test
; whether the top bit is set.
define void @f12(i32 %a) {
; CHECK-LABEL: f12:
; CHECK: tmll %r2, 140
; CHECK: bnler %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 140
%cmp = icmp uge i32 %and, 128
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; ...same again for GT.
define void @f13(i32 %a) {
; CHECK-LABEL: f13:
; CHECK: tmll %r2, 140
; CHECK: bnler %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 140
%cmp = icmp ugt i32 %and, 126
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for equality comparisons with the mask.
define void @f14(i32 %a) {
; CHECK-LABEL: f14:
; CHECK: tmll %r2, 101
; CHECK: bor %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 101
%cmp = icmp eq i32 %and, 101
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for inequality comparisons with the mask.
define void @f15(i32 %a) {
; CHECK-LABEL: f15:
; CHECK: tmll %r2, 65519
; CHECK: bnor %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 65519
%cmp = icmp ne i32 %and, 65519
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for LT comparisons that are equivalent
; to inequality comparisons with the mask.
define void @f16(i32 %a) {
; CHECK-LABEL: f16:
; CHECK: tmll %r2, 130
; CHECK: bnor %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 130
%cmp = icmp ult i32 %and, 129
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; ...same again with LE.
define void @f17(i32 %a) {
; CHECK-LABEL: f17:
; CHECK: tmll %r2, 130
; CHECK: bnor %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 130
%cmp = icmp ule i32 %and, 128
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for GE comparisons that are equivalent
; to equality comparisons with the mask.
define void @f18(i32 %a) {
; CHECK-LABEL: f18:
; CHECK: tmll %r2, 194
; CHECK: bor %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 194
%cmp = icmp uge i32 %and, 193
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; ...same again for GT.
define void @f19(i32 %a) {
; CHECK-LABEL: f19:
; CHECK: tmll %r2, 194
; CHECK: bor %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 194
%cmp = icmp ugt i32 %and, 192
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for equality comparisons for the low bit
; when the mask has two bits.
define void @f20(i32 %a) {
; CHECK-LABEL: f20:
; CHECK: tmll %r2, 20
; CHECK: blr %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 20
%cmp = icmp eq i32 %and, 4
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for inequality comparisons for the low bit
; when the mask has two bits.
define void @f21(i32 %a) {
; CHECK-LABEL: f21:
; CHECK: tmll %r2, 20
; CHECK: bnlr %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 20
%cmp = icmp ne i32 %and, 4
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for equality comparisons for the high bit
; when the mask has two bits.
define void @f22(i32 %a) {
; CHECK-LABEL: f22:
; CHECK: tmll %r2, 20
; CHECK: bhr %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 20
%cmp = icmp eq i32 %and, 16
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can use TMLL for inequality comparisons for the high bit
; when the mask has two bits.
define void @f23(i32 %a) {
; CHECK-LABEL: f23:
; CHECK: tmll %r2, 20
; CHECK: bnhr %r14
; CHECK: br %r14
entry:
%and = and i32 %a, 20
%cmp = icmp ne i32 %and, 16
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can fold an SHL into a TMxx mask.
define void @f24(i32 %a) {
; CHECK-LABEL: f24:
; CHECK: tmll %r2, 255
; CHECK: bner %r14
; CHECK: br %r14
entry:
%shl = shl i32 %a, 12
%and = and i32 %shl, 1044480
%cmp = icmp ne i32 %and, 0
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}
; Check that we can fold an SHR into a TMxx mask.
define void @f25(i32 %a) {
; CHECK-LABEL: f25:
; CHECK: tmlh %r2, 512
; CHECK: bner %r14
; CHECK: br %r14
entry:
%shr = lshr i32 %a, 25
%and = and i32 %shr, 1
%cmp = icmp ne i32 %and, 0
br i1 %cmp, label %exit, label %store
store:
store i32 1, ptr@g
br label %exit
exit:
ret void
}