Skip to content

Commit ba0e871

Browse files
committed
[ConstraintElim] Look through SExt with precond Op sge 0.
Look through SExt with a precondition that the operand is signed positive. https://alive2.llvm.org/ce/z/zvVVHj
1 parent f685481 commit ba0e871

File tree

3 files changed

+11
-7
lines changed

3 files changed

+11
-7
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,12 @@ static Decomposition decompose(Value *V,
554554
V = Op0;
555555
}
556556

557+
if (match(V, m_SExt(m_Value(Op0)))) {
558+
V = Op0;
559+
Preconditions.emplace_back(CmpInst::ICMP_SGE, Op0,
560+
ConstantInt::get(Op0->getType(), 0));
561+
}
562+
557563
Value *Op1;
558564
ConstantInt *CI;
559565
if (match(V, m_NUWAdd(m_Value(Op0), m_Value(Op1)))) {

llvm/test/Transforms/ConstraintElimination/sext-unsigned-predicates.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ define void @uge_sext(i16 %x, i32 %y) {
1313
; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]
1414
; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[BB2:%.*]]
1515
; CHECK: bb1:
16-
; CHECK-NEXT: call void @use(i1 true)
16+
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i32 [[X_EXT]], [[Y]]
17+
; CHECK-NEXT: call void @use(i1 [[T_1]])
1718
; CHECK-NEXT: [[C_3:%.*]] = icmp uge i16 [[X]], -10
1819
; CHECK-NEXT: call void @use(i1 [[C_3]])
1920
; CHECK-NEXT: [[C_4:%.*]] = icmp uge i32 [[X_EXT]], -9
@@ -65,8 +66,7 @@ define void @uge_sext_known_positive(i16 %x, i32 %y) {
6566
; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[BB2:%.*]]
6667
; CHECK: bb1:
6768
; CHECK-NEXT: call void @use(i1 true)
68-
; CHECK-NEXT: [[T_2:%.*]] = icmp uge i16 [[X]], 10
69-
; CHECK-NEXT: call void @use(i1 [[T_2]])
69+
; CHECK-NEXT: call void @use(i1 true)
7070
; CHECK-NEXT: [[C_3:%.*]] = icmp uge i32 [[X_EXT]], 11
7171
; CHECK-NEXT: call void @use(i1 [[C_3]])
7272
; CHECK-NEXT: [[C_4:%.*]] = icmp uge i32 [[X_EXT]], 11

llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -503,11 +503,9 @@ define i32 @sge_2_gep(i32 %idx, ptr %src, i32 %idx.2) {
503503
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[IDX]], 2
504504
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
505505
; CHECK-NEXT: [[ADD_PTR_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i32 [[IDX_2:%.*]]
506-
; CHECK-NEXT: [[T_1:%.*]] = icmp ult ptr [[SRC]], [[ADD_PTR]]
507506
; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[SRC]], [[ADD_PTR_2]]
508-
; CHECK-NEXT: [[X_1:%.*]] = xor i1 [[T_1]], [[C_1]]
509-
; CHECK-NEXT: [[F_1:%.*]] = icmp uge ptr [[SRC]], [[ADD_PTR]]
510-
; CHECK-NEXT: [[X_2:%.*]] = xor i1 [[X_1]], [[F_1]]
507+
; CHECK-NEXT: [[X_1:%.*]] = xor i1 true, [[C_1]]
508+
; CHECK-NEXT: [[X_2:%.*]] = xor i1 [[X_1]], false
511509
; CHECK-NEXT: br i1 [[X_2]], label [[THEN:%.*]], label [[ELSE:%.*]]
512510
; CHECK: then:
513511
; CHECK-NEXT: ret i32 0

0 commit comments

Comments
 (0)