diff options
author | Noah Goldstein <goldstein.w.n@gmail.com> | 2024-04-07 14:01:15 -0500 |
---|---|---|
committer | Noah Goldstein <goldstein.w.n@gmail.com> | 2024-05-16 13:03:32 -0500 |
commit | ebbf484e1c62a312d88c7f6482af11a58d40f52d (patch) | |
tree | d3c04705b31bdc20dc40f9b291b7ae782b3daa9d | |
parent | 05347f8c2fde0cde2fd12f1ec3611eeaf666ece0 (diff) | |
download | llvm-ebbf484e1c62a312d88c7f6482af11a58d40f52d.zip llvm-ebbf484e1c62a312d88c7f6482af11a58d40f52d.tar.gz llvm-ebbf484e1c62a312d88c7f6482af11a58d40f52d.tar.bz2 |
[InstCombine] Add tests for folding `(icmp pred (trunc nuw/nsw X), C)`; NFC
-rw-r--r-- | llvm/test/Transforms/InstCombine/icmp-trunc.ll | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/icmp-trunc.ll b/llvm/test/Transforms/InstCombine/icmp-trunc.ll index b2de9dd..c49c6a3 100644 --- a/llvm/test/Transforms/InstCombine/icmp-trunc.ll +++ b/llvm/test/Transforms/InstCombine/icmp-trunc.ll @@ -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 +} + |