blob: 0d1398082601e62d05a9276d3b65f720612087d3 [file] [log] [blame]
Chris Lattner8170e8f2002-05-06 05:35:20 +00001; This test makes sure that div instructions are properly eliminated.
Chris Lattner8170e8f2002-05-06 05:35:20 +00002
Dan Gohman72a13d22009-09-08 22:34:10 +00003; RUN: opt < %s -instcombine -S | not grep div
Chris Lattner8170e8f2002-05-06 05:35:20 +00004
Tanya Lattnerbaa370b2008-03-18 03:45:45 +00005define i32 @test1(i32 %A) {
6 %B = sdiv i32 %A, 1 ; <i32> [#uses=1]
7 ret i32 %B
Chris Lattner2bf6c222003-02-18 19:16:45 +00008}
Chris Lattnerc5fccf32003-02-18 19:28:47 +00009
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000010define i32 @test2(i32 %A) {
11 ; => Shift
12 %B = udiv i32 %A, 8 ; <i32> [#uses=1]
13 ret i32 %B
Chris Lattnerc5fccf32003-02-18 19:28:47 +000014}
15
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000016define i32 @test3(i32 %A) {
17 ; => 0, don't need to keep traps
18 %B = sdiv i32 0, %A ; <i32> [#uses=1]
19 ret i32 %B
Chris Lattnerc5fccf32003-02-18 19:28:47 +000020}
Chris Lattnere24003a2004-04-26 14:01:47 +000021
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000022define i32 @test4(i32 %A) {
23 ; 0-A
24 %B = sdiv i32 %A, -1 ; <i32> [#uses=1]
25 ret i32 %B
Chris Lattnere24003a2004-04-26 14:01:47 +000026}
Chris Lattnercbd7a982004-09-28 18:21:01 +000027
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000028define i32 @test5(i32 %A) {
29 %B = udiv i32 %A, -16 ; <i32> [#uses=1]
30 %C = udiv i32 %B, -4 ; <i32> [#uses=1]
31 ret i32 %C
Chris Lattnercbd7a982004-09-28 18:21:01 +000032}
Chris Lattnerd9d85382004-09-29 17:37:07 +000033
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000034define i1 @test6(i32 %A) {
35 %B = udiv i32 %A, 123 ; <i32> [#uses=1]
36 ; A < 123
37 %C = icmp eq i32 %B, 0 ; <i1> [#uses=1]
38 ret i1 %C
Chris Lattnerd9d85382004-09-29 17:37:07 +000039}
40
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000041define i1 @test7(i32 %A) {
42 %B = udiv i32 %A, 10 ; <i32> [#uses=1]
43 ; A >= 20 && A < 30
44 %C = icmp eq i32 %B, 2 ; <i1> [#uses=1]
45 ret i1 %C
Chris Lattner9803a0a2004-12-12 21:40:22 +000046}
47
Tanya Lattnerbaa370b2008-03-18 03:45:45 +000048define i1 @test8(i8 %A) {
49 %B = udiv i8 %A, 123 ; <i8> [#uses=1]
50 ; A >= 246
51 %C = icmp eq i8 %B, 2 ; <i1> [#uses=1]
52 ret i1 %C
53}
54
55define i1 @test9(i8 %A) {
56 %B = udiv i8 %A, 123 ; <i8> [#uses=1]
57 ; A < 246
58 %C = icmp ne i8 %B, 2 ; <i1> [#uses=1]
59 ret i1 %C
60}
61
62define i32 @test10(i32 %X, i1 %C) {
63 %V = select i1 %C, i32 64, i32 8 ; <i32> [#uses=1]
64 %R = udiv i32 %X, %V ; <i32> [#uses=1]
65 ret i32 %R
66}
67
68define i32 @test11(i32 %X, i1 %C) {
69 %A = select i1 %C, i32 1024, i32 32 ; <i32> [#uses=1]
70 %B = udiv i32 %X, %A ; <i32> [#uses=1]
71 ret i32 %B
Chris Lattnerb624bb52006-02-05 07:52:47 +000072}
Chris Lattner5c953b72008-05-16 02:59:42 +000073
74; PR2328
75define i32 @test12(i32 %x) nounwind {
76 %tmp3 = udiv i32 %x, %x ; 1
77 ret i32 %tmp3
78}
79
80define i32 @test13(i32 %x) nounwind {
81 %tmp3 = sdiv i32 %x, %x ; 1
82 ret i32 %tmp3
83}
84