Skip to content

Commit ca268ed

Browse files
committed
[ConstraintElimination] Decompose zext for unsigned compares.
For unsigned compares, zext should be a no-op and we can add the extended value to the constraint system.
1 parent 3bb6dc0 commit ca268ed

File tree

3 files changed

+9
-6
lines changed

3 files changed

+9
-6
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ static SmallVector<std::pair<int64_t, Value *>, 4> decompose(Value *V) {
7979
}
8080

8181
Value *Op0;
82+
if (match(V, m_ZExt(m_Value(Op0))))
83+
V = Op0;
84+
8285
Value *Op1;
8386
ConstantInt *CI;
8487
if (match(V, m_NUWAdd(m_Value(Op0), m_ConstantInt(CI))))

llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,7 @@ define i4 @ptr_N_step_zext_n_zext(i8* %src, i8* %lower, i8* %upper, i16 %N, i16
803803
; CHECK-NEXT: [[SRC_STEP:%.*]] = getelementptr inbounds i8, i8* [[SRC]], i32 [[STEP_ADD_1_EXT]]
804804
; CHECK-NEXT: [[CMP_STEP_START:%.*]] = icmp ult i8* [[SRC_STEP]], [[LOWER]]
805805
; CHECK-NEXT: [[CMP_STEP_END:%.*]] = icmp uge i8* [[SRC_STEP]], [[UPPER]]
806-
; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], false
806+
; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], [[CMP_STEP_END]]
807807
; CHECK-NEXT: br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]
808808
; CHECK: exit:
809809
; CHECK-NEXT: ret i4 3

llvm/test/Transforms/ConstraintElimination/zext.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ define void @uge_compare_short_and_extended(i16 %x, i16 %y) {
6767
; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]]
6868
; CHECK: bb1:
6969
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i32 [[X_EXT]], [[Y_EXT]]
70-
; CHECK-NEXT: call void @use(i1 [[T_1]])
70+
; CHECK-NEXT: call void @use(i1 true)
7171
; CHECK-NEXT: [[C_2:%.*]] = icmp uge i32 [[X_EXT]], 10
7272
; CHECK-NEXT: call void @use(i1 [[C_2]])
7373
; CHECK-NEXT: [[C_3:%.*]] = icmp sge i32 [[Y_EXT]], [[X_EXT]]
@@ -77,9 +77,9 @@ define void @uge_compare_short_and_extended(i16 %x, i16 %y) {
7777
; CHECK-NEXT: ret void
7878
; CHECK: bb2:
7979
; CHECK-NEXT: [[T_2:%.*]] = icmp uge i32 [[Y_EXT]], [[X_EXT]]
80-
; CHECK-NEXT: call void @use(i1 [[T_2]])
80+
; CHECK-NEXT: call void @use(i1 true)
8181
; CHECK-NEXT: [[F_1:%.*]] = icmp uge i32 [[X_EXT]], [[Y_EXT]]
82-
; CHECK-NEXT: call void @use(i1 [[F_1]])
82+
; CHECK-NEXT: call void @use(i1 false)
8383
; CHECK-NEXT: [[C_5:%.*]] = icmp uge i32 [[X_EXT]], 10
8484
; CHECK-NEXT: call void @use(i1 [[C_5]])
8585
; CHECK-NEXT: [[C_6:%.*]] = icmp uge i32 10, [[X_EXT]]
@@ -135,9 +135,9 @@ define void @uge_zext_add(i16 %x, i32 %y) {
135135
; CHECK-NEXT: ret void
136136
; CHECK: bb2:
137137
; CHECK-NEXT: [[T_2:%.*]] = icmp uge i32 [[Y]], [[X_EXT]]
138-
; CHECK-NEXT: call void @use(i1 [[T_2]])
138+
; CHECK-NEXT: call void @use(i1 true)
139139
; CHECK-NEXT: [[F_1:%.*]] = icmp uge i32 [[X_EXT]], [[Y]]
140-
; CHECK-NEXT: call void @use(i1 [[F_1]])
140+
; CHECK-NEXT: call void @use(i1 false)
141141
; CHECK-NEXT: [[C_5:%.*]] = icmp uge i32 [[X_EXT]], 10
142142
; CHECK-NEXT: call void @use(i1 [[C_5]])
143143
; CHECK-NEXT: [[C_6:%.*]] = icmp uge i32 10, [[X_EXT]]

0 commit comments

Comments
 (0)