Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 1 | ; RUN: opt < %s -instcombine -S | FileCheck %s |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 2 | ; PR3103 |
| 3 | |
| 4 | define i8 @test1(i8 %x, i8 %y) { |
Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 5 | ; CHECK-LABEL: @test1( |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 6 | %A = udiv i8 %x, %y |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 7 | ; CHECK-NEXT: urem |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 8 | %B = mul i8 %A, %y |
| 9 | %C = sub i8 %x, %B |
| 10 | ret i8 %C |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 11 | ; CHECK-NEXT: ret |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 12 | } |
| 13 | |
| 14 | define i8 @test2(i8 %x, i8 %y) { |
Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 15 | ; CHECK-LABEL: @test2( |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 16 | %A = sdiv i8 %x, %y |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 17 | ; CHECK-NEXT: srem |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 18 | %B = mul i8 %A, %y |
| 19 | %C = sub i8 %x, %B |
| 20 | ret i8 %C |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 21 | ; CHECK-NEXT: ret |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 22 | } |
| 23 | |
| 24 | define i8 @test3(i8 %x, i8 %y) { |
Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 25 | ; CHECK-LABEL: @test3( |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 26 | %A = udiv i8 %x, %y |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 27 | ; CHECK-NEXT: urem |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 28 | %B = mul i8 %A, %y |
| 29 | %C = sub i8 %B, %x |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 30 | ; CHECK-NEXT: sub |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 31 | ret i8 %C |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 32 | ; CHECK-NEXT: ret |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 33 | } |
| 34 | |
| 35 | define i8 @test4(i8 %x) { |
Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 36 | ; CHECK-LABEL: @test4( |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 37 | %A = udiv i8 %x, 3 |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 38 | ; CHECK-NEXT: urem |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 39 | %B = mul i8 %A, -3 |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 40 | ; CHECK-NEXT: sub |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 41 | %C = sub i8 %x, %B |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 42 | ; CHECK-NEXT: add |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 43 | ret i8 %C |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 44 | ; CHECK-NEXT: ret |
| 45 | } |
| 46 | |
| 47 | define i32 @test5(i32 %x, i32 %y) { |
Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 48 | ; CHECK-LABEL: @test5( |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 49 | ; (((X / Y) * Y) / Y) -> X / Y |
| 50 | %div = sdiv i32 %x, %y |
| 51 | ; CHECK-NEXT: sdiv |
| 52 | %mul = mul i32 %div, %y |
| 53 | %r = sdiv i32 %mul, %y |
| 54 | ret i32 %r |
| 55 | ; CHECK-NEXT: ret |
| 56 | } |
| 57 | |
| 58 | define i32 @test6(i32 %x, i32 %y) { |
Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 59 | ; CHECK-LABEL: @test6( |
Duncan Sands | 771e82a | 2011-01-28 16:51:11 +0000 | [diff] [blame] | 60 | ; (((X / Y) * Y) / Y) -> X / Y |
| 61 | %div = udiv i32 %x, %y |
| 62 | ; CHECK-NEXT: udiv |
| 63 | %mul = mul i32 %div, %y |
| 64 | %r = udiv i32 %mul, %y |
| 65 | ret i32 %r |
| 66 | ; CHECK-NEXT: ret |
Nick Lewycky | 07d726e | 2008-11-21 07:33:58 +0000 | [diff] [blame] | 67 | } |