1*cdd92214SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2*cdd92214SYingwei Zheng; RUN: opt -passes=instcombine -S %s | FileCheck %s 3*cdd92214SYingwei Zheng 4*cdd92214SYingwei Zhengdefine i1 @umulov_square_i32(i32 %x) { 5*cdd92214SYingwei Zheng; CHECK-LABEL: define i1 @umulov_square_i32( 6*cdd92214SYingwei Zheng; CHECK-SAME: i32 [[X:%.*]]) { 7*cdd92214SYingwei Zheng; CHECK-NEXT: [[RES:%.*]] = icmp ugt i32 [[X]], 65535 8*cdd92214SYingwei Zheng; CHECK-NEXT: ret i1 [[RES]] 9*cdd92214SYingwei Zheng; 10*cdd92214SYingwei Zheng %ret = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %x, i32 %x) 11*cdd92214SYingwei Zheng %res = extractvalue {i32, i1} %ret, 1 12*cdd92214SYingwei Zheng ret i1 %res 13*cdd92214SYingwei Zheng} 14*cdd92214SYingwei Zheng 15*cdd92214SYingwei Zhengdefine i1 @umulov_square_i16(i16 %x) { 16*cdd92214SYingwei Zheng; CHECK-LABEL: define i1 @umulov_square_i16( 17*cdd92214SYingwei Zheng; CHECK-SAME: i16 [[X:%.*]]) { 18*cdd92214SYingwei Zheng; CHECK-NEXT: [[RES:%.*]] = icmp ugt i16 [[X]], 255 19*cdd92214SYingwei Zheng; CHECK-NEXT: ret i1 [[RES]] 20*cdd92214SYingwei Zheng; 21*cdd92214SYingwei Zheng %ret = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %x, i16 %x) 22*cdd92214SYingwei Zheng %res = extractvalue {i16, i1} %ret, 1 23*cdd92214SYingwei Zheng ret i1 %res 24*cdd92214SYingwei Zheng} 25*cdd92214SYingwei Zheng 26*cdd92214SYingwei Zheng; Negative tests 27*cdd92214SYingwei Zheng 28*cdd92214SYingwei Zhengdefine i1 @umulov_square_i13(i13 %x) { 29*cdd92214SYingwei Zheng; CHECK-LABEL: define i1 @umulov_square_i13( 30*cdd92214SYingwei Zheng; CHECK-SAME: i13 [[X:%.*]]) { 31*cdd92214SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call { i13, i1 } @llvm.umul.with.overflow.i13(i13 [[X]], i13 [[X]]) 32*cdd92214SYingwei Zheng; CHECK-NEXT: [[RES:%.*]] = extractvalue { i13, i1 } [[RET]], 1 33*cdd92214SYingwei Zheng; CHECK-NEXT: ret i1 [[RES]] 34*cdd92214SYingwei Zheng; 35*cdd92214SYingwei Zheng %ret = call {i13, i1} @llvm.umul.with.overflow.i13(i13 %x, i13 %x) 36*cdd92214SYingwei Zheng %res = extractvalue {i13, i1} %ret, 1 37*cdd92214SYingwei Zheng ret i1 %res 38*cdd92214SYingwei Zheng} 39*cdd92214SYingwei Zheng 40*cdd92214SYingwei Zhengdefine i1 @umulov_square_i32_multiuse(i32 %x) { 41*cdd92214SYingwei Zheng; CHECK-LABEL: define i1 @umulov_square_i32_multiuse( 42*cdd92214SYingwei Zheng; CHECK-SAME: i32 [[X:%.*]]) { 43*cdd92214SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[X]], i32 [[X]]) 44*cdd92214SYingwei Zheng; CHECK-NEXT: [[RES:%.*]] = extractvalue { i32, i1 } [[RET]], 1 45*cdd92214SYingwei Zheng; CHECK-NEXT: [[VAL:%.*]] = extractvalue { i32, i1 } [[RET]], 0 46*cdd92214SYingwei Zheng; CHECK-NEXT: call void @use(i32 [[VAL]]) 47*cdd92214SYingwei Zheng; CHECK-NEXT: ret i1 [[RES]] 48*cdd92214SYingwei Zheng; 49*cdd92214SYingwei Zheng %ret = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %x, i32 %x) 50*cdd92214SYingwei Zheng %res = extractvalue {i32, i1} %ret, 1 51*cdd92214SYingwei Zheng %val = extractvalue {i32, i1} %ret, 0 52*cdd92214SYingwei Zheng call void @use(i32 %val) 53*cdd92214SYingwei Zheng ret i1 %res 54*cdd92214SYingwei Zheng} 55*cdd92214SYingwei Zheng 56*cdd92214SYingwei Zhengdefine i1 @smulov_square_i32(i32 %x) { 57*cdd92214SYingwei Zheng; CHECK-LABEL: define i1 @smulov_square_i32( 58*cdd92214SYingwei Zheng; CHECK-SAME: i32 [[X:%.*]]) { 59*cdd92214SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[X]], i32 [[X]]) 60*cdd92214SYingwei Zheng; CHECK-NEXT: [[RES:%.*]] = extractvalue { i32, i1 } [[RET]], 1 61*cdd92214SYingwei Zheng; CHECK-NEXT: ret i1 [[RES]] 62*cdd92214SYingwei Zheng; 63*cdd92214SYingwei Zheng %ret = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %x, i32 %x) 64*cdd92214SYingwei Zheng %res = extractvalue {i32, i1} %ret, 1 65*cdd92214SYingwei Zheng ret i1 %res 66*cdd92214SYingwei Zheng} 67*cdd92214SYingwei Zheng 68*cdd92214SYingwei Zhengdeclare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) 69*cdd92214SYingwei Zhengdeclare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) 70*cdd92214SYingwei Zhengdeclare {i16, i1} @llvm.umul.with.overflow.i16(i16, i16) 71*cdd92214SYingwei Zhengdeclare {i13, i1} @llvm.umul.with.overflow.i13(i13, i13) 72*cdd92214SYingwei Zhengdeclare void @use(i32) 73