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.
110 lines
3.5 KiB
LLVM
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
|
|
}
|