153a079c8SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 253a079c8SNoah Goldstein; RUN: opt -passes=instsimplify -S < %s | FileCheck %s 353a079c8SNoah Goldstein 453a079c8SNoah Goldsteindefine i1 @sdiv_neg_neg_high_bits(i8 %x, i8 %y) { 553a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_neg_neg_high_bits( 6*124547eaSNoah Goldstein; CHECK-NEXT: ret i1 false 753a079c8SNoah Goldstein; 853a079c8SNoah Goldstein %num = or i8 %x, 128 953a079c8SNoah Goldstein %denum = or i8 %y, 131 1053a079c8SNoah Goldstein %div = sdiv i8 %num, %denum 1153a079c8SNoah Goldstein %and = and i8 %div, 128 1253a079c8SNoah Goldstein %r = icmp eq i8 %and, 128 1353a079c8SNoah Goldstein ret i1 %r 1453a079c8SNoah Goldstein} 1553a079c8SNoah Goldstein 1653a079c8SNoah Goldsteindefine i1 @sdiv_pos_neg_high_bits(i8 %x, i8 %y) { 1753a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_pos_neg_high_bits( 18*124547eaSNoah Goldstein; CHECK-NEXT: ret i1 false 1953a079c8SNoah Goldstein; 2053a079c8SNoah Goldstein %xx = and i8 %x, 127 2153a079c8SNoah Goldstein %num = or i8 %xx, 49 2253a079c8SNoah Goldstein %denum = or i8 %y, 241 2353a079c8SNoah Goldstein %div = sdiv i8 %num, %denum 2453a079c8SNoah Goldstein %and = and i8 %div, 128 2553a079c8SNoah Goldstein %r = icmp eq i8 %and, 0 2653a079c8SNoah Goldstein ret i1 %r 2753a079c8SNoah Goldstein} 2853a079c8SNoah Goldstein 2953a079c8SNoah Goldsteindefine i1 @sdiv_pos_neg_high_bits_fail_maybez(i8 %x, i8 %y) { 3053a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_pos_neg_high_bits_fail_maybez( 3153a079c8SNoah Goldstein; CHECK-NEXT: [[XX:%.*]] = and i8 [[X:%.*]], 127 3253a079c8SNoah Goldstein; CHECK-NEXT: [[NUM:%.*]] = or i8 [[XX]], 49 3353a079c8SNoah Goldstein; CHECK-NEXT: [[DENUM:%.*]] = or i8 [[Y:%.*]], -64 3453a079c8SNoah Goldstein; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[NUM]], [[DENUM]] 3553a079c8SNoah Goldstein; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], -128 3653a079c8SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0 3753a079c8SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 3853a079c8SNoah Goldstein; 3953a079c8SNoah Goldstein %xx = and i8 %x, 127 4053a079c8SNoah Goldstein %num = or i8 %xx, 49 4153a079c8SNoah Goldstein %denum = or i8 %y, 192 4253a079c8SNoah Goldstein %div = sdiv i8 %num, %denum 4353a079c8SNoah Goldstein %and = and i8 %div, 128 4453a079c8SNoah Goldstein %r = icmp eq i8 %and, 0 4553a079c8SNoah Goldstein ret i1 %r 4653a079c8SNoah Goldstein} 4753a079c8SNoah Goldstein 4853a079c8SNoah Goldsteindefine i1 @sdiv_exact_pos_neg_high_bits(i8 %x, i8 %y) { 4953a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_exact_pos_neg_high_bits( 50*124547eaSNoah Goldstein; CHECK-NEXT: ret i1 false 5153a079c8SNoah Goldstein; 5253a079c8SNoah Goldstein %xx = and i8 %x, 127 5353a079c8SNoah Goldstein %num = or i8 %xx, 49 5453a079c8SNoah Goldstein %denum = or i8 %y, 192 5553a079c8SNoah Goldstein %div = sdiv exact i8 %num, %denum 5653a079c8SNoah Goldstein %and = and i8 %div, 128 5753a079c8SNoah Goldstein %r = icmp eq i8 %and, 0 5853a079c8SNoah Goldstein ret i1 %r 5953a079c8SNoah Goldstein} 6053a079c8SNoah Goldstein 6153a079c8SNoah Goldsteindefine i1 @sdiv_neg_pos_high_bits(i8 %x, i8 %y) { 6253a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_neg_pos_high_bits( 63*124547eaSNoah Goldstein; CHECK-NEXT: ret i1 false 6453a079c8SNoah Goldstein; 6553a079c8SNoah Goldstein %xx = and i8 %x, 159 6653a079c8SNoah Goldstein %num = or i8 %xx, 129 6753a079c8SNoah Goldstein %yy = and i8 %y, 15 6853a079c8SNoah Goldstein %denum = or i8 %yy, 9 6953a079c8SNoah Goldstein %div = sdiv i8 %num, %denum 7053a079c8SNoah Goldstein %and = and i8 %div, 128 7153a079c8SNoah Goldstein %r = icmp eq i8 %and, 0 7253a079c8SNoah Goldstein ret i1 %r 7353a079c8SNoah Goldstein} 7453a079c8SNoah Goldstein 7553a079c8SNoah Goldsteindefine i1 @sdiv_neg_pos_high_bits_fail_maybez(i8 %x, i8 %y) { 7653a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_neg_pos_high_bits_fail_maybez( 7753a079c8SNoah Goldstein; CHECK-NEXT: [[NUM:%.*]] = or i8 [[X:%.*]], -128 7853a079c8SNoah Goldstein; CHECK-NEXT: [[YY:%.*]] = and i8 [[Y:%.*]], 15 7953a079c8SNoah Goldstein; CHECK-NEXT: [[DENUM:%.*]] = or i8 [[YY]], 9 8053a079c8SNoah Goldstein; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[NUM]], [[DENUM]] 8153a079c8SNoah Goldstein; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], -128 8253a079c8SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0 8353a079c8SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 8453a079c8SNoah Goldstein; 8553a079c8SNoah Goldstein %num = or i8 %x, 128 8653a079c8SNoah Goldstein %yy = and i8 %y, 15 8753a079c8SNoah Goldstein %denum = or i8 %yy, 9 8853a079c8SNoah Goldstein %div = sdiv i8 %num, %denum 8953a079c8SNoah Goldstein %and = and i8 %div, 128 9053a079c8SNoah Goldstein %r = icmp eq i8 %and, 0 9153a079c8SNoah Goldstein ret i1 %r 9253a079c8SNoah Goldstein} 9353a079c8SNoah Goldstein 9453a079c8SNoah Goldsteindefine i1 @sdiv_exact_odd_odd(i8 %x, i8 %y) { 9553a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_exact_odd_odd( 96*124547eaSNoah Goldstein; CHECK-NEXT: ret i1 false 9753a079c8SNoah Goldstein; 9853a079c8SNoah Goldstein %num = or i8 %x, 1 9953a079c8SNoah Goldstein %denum = or i8 %y, 1 10053a079c8SNoah Goldstein %div = sdiv exact i8 %num, %denum 10153a079c8SNoah Goldstein %and = and i8 %div, 1 10253a079c8SNoah Goldstein %r = icmp eq i8 %and, 0 10353a079c8SNoah Goldstein ret i1 %r 10453a079c8SNoah Goldstein} 10553a079c8SNoah Goldstein 10653a079c8SNoah Goldsteindefine i1 @sdiv_exact_even_odd(i8 %x, i8 %y) { 10753a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_exact_even_odd( 108*124547eaSNoah Goldstein; CHECK-NEXT: ret i1 false 10953a079c8SNoah Goldstein; 11053a079c8SNoah Goldstein %num = and i8 %x, -2 11153a079c8SNoah Goldstein %denum = or i8 %y, 1 11253a079c8SNoah Goldstein %div = sdiv exact i8 %num, %denum 11353a079c8SNoah Goldstein %and = and i8 %div, 1 11453a079c8SNoah Goldstein %r = icmp eq i8 %and, 1 11553a079c8SNoah Goldstein ret i1 %r 11653a079c8SNoah Goldstein} 11753a079c8SNoah Goldstein 11853a079c8SNoah Goldsteindefine i1 @sdiv_exact_even_even_fail_unknown(i8 %x, i8 %y) { 11953a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_exact_even_even_fail_unknown( 12053a079c8SNoah Goldstein; CHECK-NEXT: [[NUM:%.*]] = and i8 [[X:%.*]], -2 12153a079c8SNoah Goldstein; CHECK-NEXT: [[DENUM:%.*]] = and i8 [[Y:%.*]], -2 12253a079c8SNoah Goldstein; CHECK-NEXT: [[DIV:%.*]] = sdiv exact i8 [[NUM]], [[DENUM]] 12353a079c8SNoah Goldstein; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], 1 12453a079c8SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 1 12553a079c8SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 12653a079c8SNoah Goldstein; 12753a079c8SNoah Goldstein %num = and i8 %x, -2 12853a079c8SNoah Goldstein %denum = and i8 %y, -2 12953a079c8SNoah Goldstein %div = sdiv exact i8 %num, %denum 13053a079c8SNoah Goldstein %and = and i8 %div, 1 13153a079c8SNoah Goldstein %r = icmp eq i8 %and, 1 13253a079c8SNoah Goldstein ret i1 %r 13353a079c8SNoah Goldstein} 13453a079c8SNoah Goldstein 13553a079c8SNoah Goldsteindefine i1 @sdiv_exact_even_even_fail_unknown2(i8 %x, i8 %y) { 13653a079c8SNoah Goldstein; CHECK-LABEL: @sdiv_exact_even_even_fail_unknown2( 13753a079c8SNoah Goldstein; CHECK-NEXT: [[NUM:%.*]] = and i8 [[X:%.*]], -2 13853a079c8SNoah Goldstein; CHECK-NEXT: [[DENUM:%.*]] = and i8 [[Y:%.*]], -2 13953a079c8SNoah Goldstein; CHECK-NEXT: [[DIV:%.*]] = sdiv exact i8 [[NUM]], [[DENUM]] 14053a079c8SNoah Goldstein; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], 1 14153a079c8SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0 14253a079c8SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 14353a079c8SNoah Goldstein; 14453a079c8SNoah Goldstein %num = and i8 %x, -2 14553a079c8SNoah Goldstein %denum = and i8 %y, -2 14653a079c8SNoah Goldstein %div = sdiv exact i8 %num, %denum 14753a079c8SNoah Goldstein %and = and i8 %div, 1 14853a079c8SNoah Goldstein %r = icmp eq i8 %and, 0 14953a079c8SNoah Goldstein ret i1 %r 15053a079c8SNoah Goldstein} 15153a079c8SNoah Goldstein 15253a079c8SNoah Goldsteindefine i1 @udiv_high_bits(i8 %x, i8 %y) { 15353a079c8SNoah Goldstein; CHECK-LABEL: @udiv_high_bits( 1547d05ab99SNoah Goldstein; CHECK-NEXT: ret i1 false 15553a079c8SNoah Goldstein; 15653a079c8SNoah Goldstein %num = and i8 %x, 129 15753a079c8SNoah Goldstein %denum = or i8 %y, 31 15853a079c8SNoah Goldstein %div = udiv i8 %num, %denum 15953a079c8SNoah Goldstein %and = and i8 %div, 8 16053a079c8SNoah Goldstein %r = icmp eq i8 %and, 8 16153a079c8SNoah Goldstein ret i1 %r 16253a079c8SNoah Goldstein} 16353a079c8SNoah Goldstein 16453a079c8SNoah Goldsteindefine i1 @udiv_exact_odd_odd(i8 %x, i8 %y) { 16553a079c8SNoah Goldstein; CHECK-LABEL: @udiv_exact_odd_odd( 16699795afbSNoah Goldstein; CHECK-NEXT: ret i1 false 16753a079c8SNoah Goldstein; 16853a079c8SNoah Goldstein %num = or i8 %x, 1 16953a079c8SNoah Goldstein %denum = or i8 %y, 1 17053a079c8SNoah Goldstein %div = udiv exact i8 %num, %denum 17153a079c8SNoah Goldstein %and = and i8 %div, 1 17253a079c8SNoah Goldstein %r = icmp eq i8 %and, 0 17353a079c8SNoah Goldstein ret i1 %r 17453a079c8SNoah Goldstein} 17553a079c8SNoah Goldstein 17653a079c8SNoah Goldsteindefine i1 @udiv_exact_even_odd(i8 %x, i8 %y) { 17753a079c8SNoah Goldstein; CHECK-LABEL: @udiv_exact_even_odd( 17899795afbSNoah Goldstein; CHECK-NEXT: ret i1 false 17953a079c8SNoah Goldstein; 18053a079c8SNoah Goldstein %num = and i8 %x, -2 18153a079c8SNoah Goldstein %denum = or i8 %y, 1 18253a079c8SNoah Goldstein %div = udiv exact i8 %num, %denum 18353a079c8SNoah Goldstein %and = and i8 %div, 1 18453a079c8SNoah Goldstein %r = icmp eq i8 %and, 1 18553a079c8SNoah Goldstein ret i1 %r 18653a079c8SNoah Goldstein} 18753a079c8SNoah Goldstein 18853a079c8SNoah Goldsteindefine i1 @udiv_exact_even_even_fail_unknown(i8 %x, i8 %y) { 18953a079c8SNoah Goldstein; CHECK-LABEL: @udiv_exact_even_even_fail_unknown( 19053a079c8SNoah Goldstein; CHECK-NEXT: [[NUM:%.*]] = and i8 [[X:%.*]], -2 19153a079c8SNoah Goldstein; CHECK-NEXT: [[DENUM:%.*]] = and i8 [[Y:%.*]], -2 19253a079c8SNoah Goldstein; CHECK-NEXT: [[DIV:%.*]] = udiv exact i8 [[NUM]], [[DENUM]] 19353a079c8SNoah Goldstein; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], 1 19453a079c8SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 1 19553a079c8SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 19653a079c8SNoah Goldstein; 19753a079c8SNoah Goldstein %num = and i8 %x, -2 19853a079c8SNoah Goldstein %denum = and i8 %y, -2 19953a079c8SNoah Goldstein %div = udiv exact i8 %num, %denum 20053a079c8SNoah Goldstein %and = and i8 %div, 1 20153a079c8SNoah Goldstein %r = icmp eq i8 %and, 1 20253a079c8SNoah Goldstein ret i1 %r 20353a079c8SNoah Goldstein} 20453a079c8SNoah Goldstein 20553a079c8SNoah Goldsteindefine i1 @udiv_exact_even_even_fail_unknown2(i8 %x, i8 %y) { 20653a079c8SNoah Goldstein; CHECK-LABEL: @udiv_exact_even_even_fail_unknown2( 20753a079c8SNoah Goldstein; CHECK-NEXT: [[NUM:%.*]] = and i8 [[X:%.*]], -2 20853a079c8SNoah Goldstein; CHECK-NEXT: [[DENUM:%.*]] = and i8 [[Y:%.*]], -2 20953a079c8SNoah Goldstein; CHECK-NEXT: [[DIV:%.*]] = udiv exact i8 [[NUM]], [[DENUM]] 21053a079c8SNoah Goldstein; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], 1 21153a079c8SNoah Goldstein; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0 21253a079c8SNoah Goldstein; CHECK-NEXT: ret i1 [[R]] 21353a079c8SNoah Goldstein; 21453a079c8SNoah Goldstein %num = and i8 %x, -2 21553a079c8SNoah Goldstein %denum = and i8 %y, -2 21653a079c8SNoah Goldstein %div = udiv exact i8 %num, %denum 21753a079c8SNoah Goldstein %and = and i8 %div, 1 21853a079c8SNoah Goldstein %r = icmp eq i8 %and, 0 21953a079c8SNoah Goldstein ret i1 %r 22053a079c8SNoah Goldstein} 221