161c4d7b9SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 261c4d7b9SNoah Goldstein; RUN: opt < %s -passes=instcombine -S | FileCheck %s 361c4d7b9SNoah Goldstein 461c4d7b9SNoah Goldsteindeclare void @use.i1(i1) 561c4d7b9SNoah Goldsteindeclare void @use.i8(i8) 661c4d7b9SNoah Goldsteindefine i8 @replace_with_y_noundef(i8 %x, i8 noundef %y, i8 %z) { 761c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_y_noundef( 861c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] 9b37a4b99SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[Y]], i8 [[Z:%.*]] 1061c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 1161c4d7b9SNoah Goldstein; 1261c4d7b9SNoah Goldstein %cmp = icmp eq i8 %x, %y 1361c4d7b9SNoah Goldstein %and = and i8 %x, %y 1461c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %and, i8 %z 1561c4d7b9SNoah Goldstein ret i8 %sel 1661c4d7b9SNoah Goldstein} 1761c4d7b9SNoah Goldstein 1861c4d7b9SNoah Goldsteindefine i8 @replace_with_x_noundef(i8 noundef %x, i8 %y, i8 %z) { 1961c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_x_noundef( 2061c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] 2161c4d7b9SNoah Goldstein; CHECK-NEXT: call void @use.i1(i1 [[CMP]]) 22b37a4b99SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[Z:%.*]], i8 [[X]] 2361c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 2461c4d7b9SNoah Goldstein; 2561c4d7b9SNoah Goldstein %cmp = icmp ne i8 %x, %y 2661c4d7b9SNoah Goldstein call void @use.i1(i1 %cmp) 2761c4d7b9SNoah Goldstein %and = or i8 %x, %y 2861c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %z, i8 %and 2961c4d7b9SNoah Goldstein ret i8 %sel 3061c4d7b9SNoah Goldstein} 3161c4d7b9SNoah Goldstein 3261c4d7b9SNoah Goldsteindefine i8 @replace_with_x_maybe_undef_fail(i8 %x, i8 %y, i8 %z) { 3361c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_x_maybe_undef_fail( 3461c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] 3561c4d7b9SNoah Goldstein; CHECK-NEXT: call void @use.i1(i1 [[CMP]]) 3661c4d7b9SNoah Goldstein; CHECK-NEXT: [[AND:%.*]] = or i8 [[X]], [[Y]] 3761c4d7b9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[Z:%.*]], i8 [[AND]] 3861c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 3961c4d7b9SNoah Goldstein; 4061c4d7b9SNoah Goldstein %cmp = icmp ne i8 %x, %y 4161c4d7b9SNoah Goldstein call void @use.i1(i1 %cmp) 4261c4d7b9SNoah Goldstein %and = or i8 %x, %y 4361c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %z, i8 %and 4461c4d7b9SNoah Goldstein ret i8 %sel 4561c4d7b9SNoah Goldstein} 4661c4d7b9SNoah Goldstein 4761c4d7b9SNoah Goldsteindefine i8 @replace_with_y_for_new_oneuse(i8 noundef %xx, i8 noundef %y, i8 %z) { 4861c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_y_for_new_oneuse( 4961c4d7b9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 5061c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y:%.*]] 5161c4d7b9SNoah Goldstein; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[X]], [[Y]] 5261c4d7b9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 [[Z:%.*]] 5361c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 5461c4d7b9SNoah Goldstein; 5561c4d7b9SNoah Goldstein %x = mul i8 %xx, 13 5661c4d7b9SNoah Goldstein %cmp = icmp eq i8 %x, %y 5761c4d7b9SNoah Goldstein %add = add nuw i8 %x, %y 5861c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %add, i8 %z 5961c4d7b9SNoah Goldstein ret i8 %sel 6061c4d7b9SNoah Goldstein} 6161c4d7b9SNoah Goldstein 6261c4d7b9SNoah Goldsteindefine i8 @replace_with_y_for_new_oneuse2(i8 %xx, i8 noundef %y, i8 %z, i8 %q) { 6361c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_y_for_new_oneuse2( 6461c4d7b9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 6561c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y:%.*]] 6661c4d7b9SNoah Goldstein; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[X]], [[Q:%.*]] 6761c4d7b9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[ADD]], i8 [[Z:%.*]] 6861c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 6961c4d7b9SNoah Goldstein; 7061c4d7b9SNoah Goldstein %x = mul i8 %xx, 13 7161c4d7b9SNoah Goldstein %cmp = icmp eq i8 %x, %y 7261c4d7b9SNoah Goldstein %add = add nuw i8 %x, %q 7361c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %add, i8 %z 7461c4d7b9SNoah Goldstein ret i8 %sel 7561c4d7b9SNoah Goldstein} 7661c4d7b9SNoah Goldstein 7761c4d7b9SNoah Goldsteindefine i8 @replace_with_x_for_new_oneuse(i8 noundef %xx, i8 noundef %yy, i8 %z, i8 %w) { 7861c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_x_for_new_oneuse( 7961c4d7b9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 8061c4d7b9SNoah Goldstein; CHECK-NEXT: [[Y:%.*]] = add i8 [[YY:%.*]], [[W:%.*]] 8161c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y]] 8261c4d7b9SNoah Goldstein; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[X]], [[Y]] 8361c4d7b9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] 8461c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 8561c4d7b9SNoah Goldstein; 8661c4d7b9SNoah Goldstein %x = mul i8 %xx, 13 8761c4d7b9SNoah Goldstein %y = add i8 %yy, %w 8861c4d7b9SNoah Goldstein %cmp = icmp eq i8 %x, %y 8961c4d7b9SNoah Goldstein %mul = mul i8 %x, %y 9061c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %mul, i8 %z 9161c4d7b9SNoah Goldstein ret i8 %sel 9261c4d7b9SNoah Goldstein} 9361c4d7b9SNoah Goldstein 9461c4d7b9SNoah Goldsteindefine i8 @replace_with_x_for_new_oneuse2(i8 noundef %xx, i8 %yy, i8 %z, i8 %w, i8 %q) { 9561c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_x_for_new_oneuse2( 9661c4d7b9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 9761c4d7b9SNoah Goldstein; CHECK-NEXT: [[Y:%.*]] = add i8 [[YY:%.*]], [[W:%.*]] 9861c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y]] 99*a1058776SNikita Popov; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[Q:%.*]], [[Y]] 10061c4d7b9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] 10161c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 10261c4d7b9SNoah Goldstein; 10361c4d7b9SNoah Goldstein %x = mul i8 %xx, 13 10461c4d7b9SNoah Goldstein %y = add i8 %yy, %w 10561c4d7b9SNoah Goldstein %cmp = icmp eq i8 %x, %y 10661c4d7b9SNoah Goldstein %mul = mul i8 %q, %y 10761c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %mul, i8 %z 10861c4d7b9SNoah Goldstein ret i8 %sel 10961c4d7b9SNoah Goldstein} 11061c4d7b9SNoah Goldstein 11161c4d7b9SNoah Goldsteindefine i8 @replace_with_x_for_simple_binop(i8 noundef %xx, i8 %yy, i8 %z, i8 %w) { 11261c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_x_for_simple_binop( 11361c4d7b9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 11461c4d7b9SNoah Goldstein; CHECK-NEXT: [[Y:%.*]] = add i8 [[YY:%.*]], [[W:%.*]] 11561c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y]] 11661c4d7b9SNoah Goldstein; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[X]], [[Y]] 11761c4d7b9SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[Y]]) 11861c4d7b9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] 11961c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 12061c4d7b9SNoah Goldstein; 12161c4d7b9SNoah Goldstein %x = mul i8 %xx, 13 12261c4d7b9SNoah Goldstein %y = add i8 %yy, %w 12361c4d7b9SNoah Goldstein %cmp = icmp eq i8 %x, %y 12461c4d7b9SNoah Goldstein %mul = mul i8 %x, %y 12561c4d7b9SNoah Goldstein call void @use.i8(i8 %y) 12661c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %mul, i8 %z 12761c4d7b9SNoah Goldstein ret i8 %sel 12861c4d7b9SNoah Goldstein} 12961c4d7b9SNoah Goldstein 13061c4d7b9SNoah Goldsteindefine i8 @replace_with_none_for_new_oneuse_fail_maybe_undef(i8 %xx, i8 %y, i8 %z) { 13161c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_none_for_new_oneuse_fail_maybe_undef( 13261c4d7b9SNoah Goldstein; CHECK-NEXT: [[X:%.*]] = mul i8 [[XX:%.*]], 13 13361c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], [[Y:%.*]] 13461c4d7b9SNoah Goldstein; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[X]], [[Y]] 13561c4d7b9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] 13661c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 13761c4d7b9SNoah Goldstein; 13861c4d7b9SNoah Goldstein %x = mul i8 %xx, 13 13961c4d7b9SNoah Goldstein %cmp = icmp eq i8 %x, %y 14061c4d7b9SNoah Goldstein %mul = mul i8 %x, %y 14161c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %mul, i8 %z 14261c4d7b9SNoah Goldstein ret i8 %sel 14361c4d7b9SNoah Goldstein} 14461c4d7b9SNoah Goldstein 14561c4d7b9SNoah Goldsteindefine i8 @replace_with_y_for_simple_binop(i8 %x, i8 noundef %y, i8 %z) { 14661c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_y_for_simple_binop( 14761c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] 14861c4d7b9SNoah Goldstein; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X]], [[Y]] 14961c4d7b9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] 15061c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 15161c4d7b9SNoah Goldstein; 15261c4d7b9SNoah Goldstein %cmp = icmp eq i8 %x, %y 15361c4d7b9SNoah Goldstein %mul = mul nsw i8 %x, %y 15461c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %mul, i8 %z 15561c4d7b9SNoah Goldstein ret i8 %sel 15661c4d7b9SNoah Goldstein} 15761c4d7b9SNoah Goldstein 15861c4d7b9SNoah Goldsteindefine i8 @replace_with_y_for_simple_binop_fail_multiuse(i8 %x, i8 noundef %y, i8 %z) { 15961c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_y_for_simple_binop_fail_multiuse( 16061c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] 16161c4d7b9SNoah Goldstein; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X]], [[Y]] 16261c4d7b9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] 16361c4d7b9SNoah Goldstein; CHECK-NEXT: call void @use.i8(i8 [[MUL]]) 16461c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 16561c4d7b9SNoah Goldstein; 16661c4d7b9SNoah Goldstein %cmp = icmp eq i8 %x, %y 16761c4d7b9SNoah Goldstein %mul = mul nsw i8 %x, %y 16861c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %mul, i8 %z 16961c4d7b9SNoah Goldstein call void @use.i8(i8 %mul) 17061c4d7b9SNoah Goldstein ret i8 %sel 17161c4d7b9SNoah Goldstein} 17261c4d7b9SNoah Goldstein 17361c4d7b9SNoah Goldsteindefine i8 @replace_with_y_for_simple_binop_fail(i8 %x, i8 noundef %y, i8 %z, i8 %q) { 17461c4d7b9SNoah Goldstein; CHECK-LABEL: @replace_with_y_for_simple_binop_fail( 17561c4d7b9SNoah Goldstein; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] 17661c4d7b9SNoah Goldstein; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X]], [[Q:%.*]] 17761c4d7b9SNoah Goldstein; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 [[MUL]], i8 [[Z:%.*]] 17861c4d7b9SNoah Goldstein; CHECK-NEXT: ret i8 [[SEL]] 17961c4d7b9SNoah Goldstein; 18061c4d7b9SNoah Goldstein %cmp = icmp eq i8 %x, %y 18161c4d7b9SNoah Goldstein %mul = mul nsw i8 %x, %q 18261c4d7b9SNoah Goldstein %sel = select i1 %cmp, i8 %mul, i8 %z 18361c4d7b9SNoah Goldstein ret i8 %sel 18461c4d7b9SNoah Goldstein} 185