Files
clang-p2996/llvm/test/Transforms/ConstraintElimination/constants-unsigned-predicates.ll
Florian Hahn 6a834d2f2b [ConstraintElim] Use collectOffset instead of custom GEP idx iteration.
Use collectOffset to collect scaled indices and constant offset for GEP
instead of custom code. This simplifies the logic in decomposeGEP and
allows to handle all cases supported by the generic helper.
2022-11-28 16:54:58 +00:00

110 lines
3.5 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
define i1 @test_ult() {
; CHECK-LABEL: @test_ult(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[T_0:%.*]] = icmp ult i8 10, 11
; CHECK-NEXT: [[F_0:%.*]] = icmp ult i8 10, 10
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, false
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 10, 9
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 10, -10
; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], true
; CHECK-NEXT: ret i1 [[RES_3]]
;
entry:
%t.0 = icmp ult i8 10, 11
%f.0 = icmp ult i8 10, 10
%res.1 = xor i1 %t.0, %f.0
%f.1 = icmp ult i8 10, 9
%res.2 = xor i1 %res.1, %f.1
%t.1 = icmp ult i8 10, -10
%res.3 = xor i1 %res.2, %t.1
ret i1 %res.3
}
; Test cases where lhs - rhs results in constant offset.
define i1 @test_ult_gep_1(ptr %base) {
; CHECK-LABEL: @test_ult_gep_1(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[BASE:%.*]], i8 1
; CHECK-NEXT: [[T_0:%.*]] = icmp ult ptr [[BASE]], [[GEP_1]]
; CHECK-NEXT: [[GEP_0:%.*]] = getelementptr inbounds i8, ptr [[BASE]], i8 0
; CHECK-NEXT: [[F_0:%.*]] = icmp ult ptr [[BASE]], [[GEP_0]]
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, false
; CHECK-NEXT: [[F_1:%.*]] = icmp ult ptr [[GEP_1]], [[BASE]]
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false
; CHECK-NEXT: ret i1 [[RES_2]]
;
entry:
%gep.1 = getelementptr inbounds i8, ptr %base, i8 1
%t.0 = icmp ult ptr %base, %gep.1
%gep.0 = getelementptr inbounds i8, ptr %base, i8 0
%f.0 = icmp ult ptr %base, %gep.0
%res.1 = xor i1 %t.0, %f.0
%f.1 = icmp ult ptr %gep.1, %base
%res.2 = xor i1 %res.1, %f.1
ret i1 %res.2
}
define i1 @test_ult_gep_2(ptr %base) {
; CHECK-LABEL: @test_ult_gep_2(
; CHECK-NEXT: [[GEP_SUB_1:%.*]] = getelementptr inbounds i8, ptr [[BASE:%.*]], i8 -1
; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[BASE]], [[GEP_SUB_1]]
; CHECK-NEXT: ret i1 false
;
%gep.sub.1 = getelementptr inbounds i8, ptr %base, i8 -1
%c.1 = icmp ult ptr %base, %gep.sub.1
ret i1 %c.1
}
define i1 @test_ult_gep_3(ptr %base) {
; CHECK-LABEL: @test_ult_gep_3(
; CHECK-NEXT: [[GEP_1_NOINBOUNDS:%.*]] = getelementptr i8, ptr [[BASE:%.*]], i8 1
; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[BASE]], [[GEP_1_NOINBOUNDS]]
; CHECK-NEXT: ret i1 [[C_1]]
;
%gep.1.noinbounds = getelementptr i8, ptr %base, i8 1
%c.1 = icmp ult ptr %base, %gep.1.noinbounds
ret i1 %c.1
}
define i1 @test_eq() {
; CHECK-LABEL: @test_eq(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[F_0:%.*]] = icmp eq i8 10, 11
; CHECK-NEXT: [[T_0:%.*]] = icmp eq i8 10, 10
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_0]], [[F_0]]
; CHECK-NEXT: [[F_1:%.*]] = icmp eq i8 10, 9
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[F_1]]
; CHECK-NEXT: ret i1 [[RES_2]]
;
entry:
%f.0 = icmp eq i8 10, 11
%t.0 = icmp eq i8 10, 10
%res.1 = xor i1 %t.0, %f.0
%f.1 = icmp eq i8 10, 9
%res.2 = xor i1 %res.1, %f.1
ret i1 %res.2
}
define i1 @test_ne() {
; CHECK-LABEL: @test_ne(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[T_0:%.*]] = icmp ne i8 10, 11
; CHECK-NEXT: [[F_0:%.*]] = icmp ne i8 10, 10
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_0]], [[F_0]]
; CHECK-NEXT: [[T_1:%.*]] = icmp ne i8 10, 9
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[T_1]]
; CHECK-NEXT: ret i1 [[RES_2]]
;
entry:
%t.0 = icmp ne i8 10, 11
%f.0 = icmp ne i8 10, 10
%res.1 = xor i1 %t.0, %f.0
%t.1 = icmp ne i8 10, 9
%res.2 = xor i1 %res.1, %t.1
ret i1 %res.2
}