| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | |
| ; RUN: opt -S -passes=instcombine < %s | FileCheck %s | |
| define i32 @and_umax_less(i32 %A) { | |
| ; CHECK-LABEL: @and_umax_less( | |
| ; CHECK-NEXT: [[X:%.*]] = and i32 [[A:%.*]], -32 | |
| ; CHECK-NEXT: ret i32 [[X]] | |
| ; | |
| %l0 = icmp ugt i32 31, %A | |
| %l1 = select i1 %l0, i32 31, i32 %A | |
| %x = and i32 %l1, -32 | |
| ret i32 %x | |
| } | |
| define i32 @and_umax_muchless(i32 %A) { | |
| ; CHECK-LABEL: @and_umax_muchless( | |
| ; CHECK-NEXT: [[X:%.*]] = and i32 [[A:%.*]], -32 | |
| ; CHECK-NEXT: ret i32 [[X]] | |
| ; | |
| %l0 = icmp ugt i32 12, %A | |
| %l1 = select i1 %l0, i32 12, i32 %A | |
| %x = and i32 %l1, -32 | |
| ret i32 %x | |
| } | |
| define i32 @and_umax_more(i32 %A) { | |
| ; CHECK-LABEL: @and_umax_more( | |
| ; CHECK-NEXT: [[L1:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 32) | |
| ; CHECK-NEXT: [[X:%.*]] = and i32 [[L1]], -32 | |
| ; CHECK-NEXT: ret i32 [[X]] | |
| ; | |
| %l0 = icmp ugt i32 32, %A | |
| %l1 = select i1 %l0, i32 32, i32 %A | |
| %x = and i32 %l1, -32 | |
| ret i32 %x | |
| } | |
| define i32 @shr_umax(i32 %A) { | |
| ; CHECK-LABEL: @shr_umax( | |
| ; CHECK-NEXT: [[X:%.*]] = lshr i32 [[A:%.*]], 4 | |
| ; CHECK-NEXT: ret i32 [[X]] | |
| ; | |
| %l0 = icmp ugt i32 15, %A | |
| %l1 = select i1 %l0, i32 15, i32 %A | |
| %x = lshr i32 %l1, 4 | |
| ret i32 %x | |
| } | |
| ; Various constants for C2 & umax(A, C1) | |
| define i8 @t_0_1(i8 %A) { | |
| ; CHECK-LABEL: @t_0_1( | |
| ; CHECK-NEXT: [[X:%.*]] = and i8 [[A:%.*]], 1 | |
| ; CHECK-NEXT: ret i8 [[X]] | |
| ; | |
| %l2 = icmp ugt i8 %A, 0 | |
| %l1 = select i1 %l2, i8 %A, i8 0 | |
| %x = and i8 %l1, 1 | |
| ret i8 %x | |
| } | |
| define i8 @t_0_10(i8 %A) { | |
| ; CHECK-LABEL: @t_0_10( | |
| ; CHECK-NEXT: [[X:%.*]] = and i8 [[A:%.*]], 10 | |
| ; CHECK-NEXT: ret i8 [[X]] | |
| ; | |
| %l2 = icmp ugt i8 %A, 0 | |
| %l1 = select i1 %l2, i8 %A, i8 0 | |
| %x = and i8 %l1, 10 | |
| ret i8 %x | |
| } | |
| define i8 @t_1_10(i8 %A) { | |
| ; CHECK-LABEL: @t_1_10( | |
| ; CHECK-NEXT: [[X:%.*]] = and i8 [[A:%.*]], 10 | |
| ; CHECK-NEXT: ret i8 [[X]] | |
| ; | |
| %l2 = icmp ugt i8 %A, 1 | |
| %l1 = select i1 %l2, i8 %A, i8 1 | |
| %x = and i8 %l1, 10 | |
| ret i8 %x | |
| } | |
| define i8 @t_2_4(i8 %A) { | |
| ; CHECK-LABEL: @t_2_4( | |
| ; CHECK-NEXT: [[X:%.*]] = and i8 [[A:%.*]], 4 | |
| ; CHECK-NEXT: ret i8 [[X]] | |
| ; | |
| %l2 = icmp ugt i8 %A, 2 | |
| %l1 = select i1 %l2, i8 %A, i8 2 | |
| %x = and i8 %l1, 4 | |
| ret i8 %x | |
| } | |
| define i8 @t_2_192(i8 %A) { | |
| ; CHECK-LABEL: @t_2_192( | |
| ; CHECK-NEXT: [[X:%.*]] = and i8 [[A:%.*]], -64 | |
| ; CHECK-NEXT: ret i8 [[X]] | |
| ; | |
| %l2 = icmp ugt i8 %A, 2 | |
| %l1 = select i1 %l2, i8 %A, i8 2 | |
| %x = and i8 %l1, -64 | |
| ret i8 %x | |
| } | |
| define i8 @t_2_63_or(i8 %A) { | |
| ; CHECK-LABEL: @t_2_63_or( | |
| ; CHECK-NEXT: [[X:%.*]] = or i8 [[A:%.*]], 63 | |
| ; CHECK-NEXT: ret i8 [[X]] | |
| ; | |
| %l2 = icmp ugt i8 %A, 2 | |
| %l1 = select i1 %l2, i8 %A, i8 2 | |
| %x = or i8 %l1, 63 | |
| ret i8 %x | |
| } | |
| define i8 @f_1_1(i8 %A) { | |
| ; CHECK-LABEL: @f_1_1( | |
| ; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 1) | |
| ; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], 1 | |
| ; CHECK-NEXT: ret i8 [[X]] | |
| ; | |
| %l2 = icmp ugt i8 %A, 1 | |
| %l1 = select i1 %l2, i8 %A, i8 1 | |
| %x = and i8 %l1, 1 | |
| ret i8 %x | |
| } | |
| define i8 @f_32_32(i8 %A) { | |
| ; CHECK-LABEL: @f_32_32( | |
| ; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 32) | |
| ; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], -32 | |
| ; CHECK-NEXT: ret i8 [[X]] | |
| ; | |
| %l2 = icmp ugt i8 %A, 32 | |
| %l1 = select i1 %l2, i8 %A, i8 32 | |
| %x = and i8 %l1, -32 | |
| ret i8 %x | |
| } | |
| define i8 @f_191_192(i8 %A) { | |
| ; CHECK-LABEL: @f_191_192( | |
| ; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 -65) | |
| ; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], -64 | |
| ; CHECK-NEXT: ret i8 [[X]] | |
| ; | |
| %l2 = icmp ugt i8 %A, 191 | |
| %l1 = select i1 %l2, i8 %A, i8 191 | |
| %x = and i8 %l1, 192 | |
| ret i8 %x | |
| } | |
| define i8 @f_10_1(i8 %A) { | |
| ; CHECK-LABEL: @f_10_1( | |
| ; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 10) | |
| ; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], 1 | |
| ; CHECK-NEXT: ret i8 [[X]] | |
| ; | |
| %l2 = icmp ugt i8 %A, 10 | |
| %l1 = select i1 %l2, i8 %A, i8 10 | |
| %x = and i8 %l1, 1 | |
| ret i8 %x | |
| } | |
| define i32 @and_umin(i32 %A) { | |
| ; CHECK-LABEL: @and_umin( | |
| ; CHECK-NEXT: ret i32 0 | |
| ; | |
| %l0 = icmp ult i32 15, %A | |
| %l1 = select i1 %l0, i32 15, i32 %A | |
| %x = and i32 %l1, -32 | |
| ret i32 %x | |
| } | |
| define i32 @or_umin(i32 %A) { | |
| ; CHECK-LABEL: @or_umin( | |
| ; CHECK-NEXT: ret i32 31 | |
| ; | |
| %l0 = icmp ult i32 15, %A | |
| %l1 = select i1 %l0, i32 15, i32 %A | |
| %x = or i32 %l1, 31 | |
| ret i32 %x | |
| } | |
| define i8 @or_min_31_30(i8 %A) { | |
| ; CHECK-LABEL: @or_min_31_30( | |
| ; CHECK-NEXT: [[R:%.*]] = or i8 [[A:%.*]], 31 | |
| ; CHECK-NEXT: ret i8 [[R]] | |
| ; | |
| %cmp = icmp ult i8 %A, -30 | |
| %min = select i1 %cmp, i8 %A, i8 -30 | |
| %r = or i8 %min, 31 | |
| ret i8 %r | |
| } | |
| define i8 @and_min_7_7(i8 %A) { | |
| ; CHECK-LABEL: @and_min_7_7( | |
| ; CHECK-NEXT: [[R:%.*]] = and i8 [[A:%.*]], -8 | |
| ; CHECK-NEXT: ret i8 [[R]] | |
| ; | |
| %l2 = icmp ult i8 %A, -7 | |
| %min = select i1 %l2, i8 %A, i8 -7 | |
| %r = and i8 %min, -8 | |
| ret i8 %r | |
| } | |
| define i8 @and_min_7_8(i8 %A) { | |
| ; CHECK-LABEL: @and_min_7_8( | |
| ; CHECK-NEXT: [[R:%.*]] = and i8 [[A:%.*]], -8 | |
| ; CHECK-NEXT: ret i8 [[R]] | |
| ; | |
| %l2 = icmp ult i8 %A, -8 | |
| %min = select i1 %l2, i8 %A, i8 -8 | |
| %r = and i8 %min, -8 | |
| ret i8 %r | |
| } | |
| define i8 @and_min_7_9(i8 %A) { | |
| ; CHECK-LABEL: @and_min_7_9( | |
| ; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[A:%.*]], i8 -9) | |
| ; CHECK-NEXT: [[R:%.*]] = and i8 [[MIN]], -8 | |
| ; CHECK-NEXT: ret i8 [[R]] | |
| ; | |
| %l2 = icmp ult i8 %A, -9 | |
| %min = select i1 %l2, i8 %A, i8 -9 | |
| %r = and i8 %min, -8 | |
| ret i8 %r | |
| } | |