Skip to content

Commit

Permalink
[InstCombine] Add tests for folding `(icmp pred (trunc nuw/nsw X), C)…
Browse files Browse the repository at this point in the history
…`; NFC
  • Loading branch information
goldsteinn committed May 11, 2024
1 parent 11cb3c3 commit 6680aa9
Showing 1 changed file with 192 additions and 0 deletions.
192 changes: 192 additions & 0 deletions llvm/test/Transforms/InstCombine/icmp-trunc.ll
Original file line number Diff line number Diff line change
Expand Up @@ -555,3 +555,195 @@ define i1 @shl1_trunc_sgt4(i32 %a) {
%r = icmp sgt i16 %t, 4
ret i1 %r
}

define i1 @eq_nuw(i32 %x) {
; DL64-LABEL: @eq_nuw(
; DL64-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 255
; DL64-NEXT: [[R:%.*]] = icmp eq i32 [[TMP1]], 123
; DL64-NEXT: ret i1 [[R]]
;
; DL8-LABEL: @eq_nuw(
; DL8-NEXT: [[T:%.*]] = trunc nuw i32 [[X:%.*]] to i8
; DL8-NEXT: [[R:%.*]] = icmp eq i8 [[T]], 123
; DL8-NEXT: ret i1 [[R]]
;
%t = trunc nuw i32 %x to i8
%r = icmp eq i8 %t, 123
ret i1 %r
}

define i1 @ult_nuw(i32 %x) {
; CHECK-LABEL: @ult_nuw(
; CHECK-NEXT: [[T:%.*]] = trunc nuw i32 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[T]], 45
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nuw i32 %x to i8
%r = icmp ult i8 %t, 45
ret i1 %r
}

define i1 @ule_nuw(i32 %x) {
; CHECK-LABEL: @ule_nuw(
; CHECK-NEXT: [[T:%.*]] = trunc nuw i32 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[T]], 46
; CHECK-NEXT: call void @use(i8 [[T]])
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nuw i32 %x to i8
%r = icmp ule i8 %t, 45
call void @use(i8 %t)
ret i1 %r
}

define i1 @ugt_nuw(i32 %x) {
; CHECK-LABEL: @ugt_nuw(
; CHECK-NEXT: [[T:%.*]] = trunc nuw i32 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[T]], 12
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nuw i32 %x to i8
%r = icmp ugt i8 %t, 12
ret i1 %r
}

define i1 @uge_nuw(i32 %x) {
; CHECK-LABEL: @uge_nuw(
; CHECK-NEXT: [[T:%.*]] = trunc nuw i32 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[T]], 98
; CHECK-NEXT: call void @use(i8 [[T]])
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nuw i32 %x to i8
%r = icmp uge i8 %t, 99
call void @use(i8 %t)
ret i1 %r
}

define i1 @uge_nuw_i48(i48 %x) {
; CHECK-LABEL: @uge_nuw_i48(
; CHECK-NEXT: [[T:%.*]] = trunc nuw i48 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[T]], 98
; CHECK-NEXT: call void @use(i8 [[T]])
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nuw i48 %x to i8
%r = icmp uge i8 %t, 99
call void @use(i8 %t)
ret i1 %r
}

define i1 @sgt_nuw_fail(i32 %x) {
; CHECK-LABEL: @sgt_nuw_fail(
; CHECK-NEXT: [[T:%.*]] = trunc nuw i32 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[T]], 12
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nuw i32 %x to i8
%r = icmp sgt i8 %t, 12
ret i1 %r
}

define i1 @ne_nsw(i32 %x) {
; DL64-LABEL: @ne_nsw(
; DL64-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 255
; DL64-NEXT: [[R:%.*]] = icmp ne i32 [[TMP1]], 133
; DL64-NEXT: ret i1 [[R]]
;
; DL8-LABEL: @ne_nsw(
; DL8-NEXT: [[T:%.*]] = trunc nsw i32 [[X:%.*]] to i8
; DL8-NEXT: [[R:%.*]] = icmp ne i8 [[T]], -123
; DL8-NEXT: ret i1 [[R]]
;
%t = trunc nsw i32 %x to i8
%r = icmp ne i8 %t, -123
ret i1 %r
}

define i1 @slt_nsw(i32 %x) {
; CHECK-LABEL: @slt_nsw(
; CHECK-NEXT: [[T:%.*]] = trunc nsw i32 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[T]], 45
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nsw i32 %x to i8
%r = icmp slt i8 %t, 45
ret i1 %r
}

define i1 @sle_nsw(i16 %x) {
; CHECK-LABEL: @sle_nsw(
; CHECK-NEXT: [[T:%.*]] = trunc nsw i16 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[T]], 46
; CHECK-NEXT: call void @use(i8 [[T]])
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nsw i16 %x to i8
%r = icmp sle i8 %t, 45
call void @use(i8 %t)
ret i1 %r
}

define i1 @sgt_nsw(i32 %x) {
; CHECK-LABEL: @sgt_nsw(
; CHECK-NEXT: [[T:%.*]] = trunc nsw i32 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[T]], -12
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nsw i32 %x to i8
%r = icmp sgt i8 %t, -12
ret i1 %r
}

define i1 @sge_nsw(i64 %x) {
; CHECK-LABEL: @sge_nsw(
; CHECK-NEXT: [[T:%.*]] = trunc nsw i64 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[T]], 98
; CHECK-NEXT: call void @use(i8 [[T]])
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nsw i64 %x to i8
%r = icmp sge i8 %t, 99
call void @use(i8 %t)
ret i1 %r
}



define i1 @sge_nsw_i48(i48 %x) {
; CHECK-LABEL: @sge_nsw_i48(
; CHECK-NEXT: [[T:%.*]] = trunc nsw i48 [[X:%.*]] to i8
; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[T]], 98
; CHECK-NEXT: call void @use(i8 [[T]])
; CHECK-NEXT: ret i1 [[R]]
;
%t = trunc nsw i48 %x to i8
%r = icmp sge i8 %t, 99
call void @use(i8 %t)
ret i1 %r
}


define <2 x i1> @uge_nsw(<2 x i32> %x) {
; CHECK-LABEL: @uge_nsw(
; CHECK-NEXT: [[T:%.*]] = trunc nsw <2 x i32> [[X:%.*]] to <2 x i8>
; CHECK-NEXT: [[R:%.*]] = icmp ugt <2 x i8> [[T]], <i8 -46, i8 -46>
; CHECK-NEXT: ret <2 x i1> [[R]]
;
%t = trunc nsw <2 x i32> %x to <2 x i8>
%r = icmp uge <2 x i8> %t, <i8 -45, i8 -45>
ret <2 x i1> %r
}


define <2 x i1> @uge_nsw_non_splat(<2 x i32> %x) {
; CHECK-LABEL: @uge_nsw_non_splat(
; CHECK-NEXT: [[T:%.*]] = trunc nsw <2 x i32> [[X:%.*]] to <2 x i8>
; CHECK-NEXT: [[R:%.*]] = icmp ugt <2 x i8> [[T]], <i8 44, i8 45>
; CHECK-NEXT: ret <2 x i1> [[R]]
;
%t = trunc nsw <2 x i32> %x to <2 x i8>
%r = icmp uge <2 x i8> %t, <i8 45, i8 46>
ret <2 x i1> %r
}

0 comments on commit 6680aa9

Please sign in to comment.