1db91a6b8SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*8ebb3eacSBjorn Pettersson; RUN: opt < %s -passes=sccp -S | FileCheck %s
3db91a6b8SFlorian Hahn
4db91a6b8SFlorian Hahndeclare void @use.i32(i32)
5db91a6b8SFlorian Hahndeclare void @use.i1(i1)
6db91a6b8SFlorian Hahn
7db91a6b8SFlorian Hahndefine void @and_constexpr(i32 %a) {
8db91a6b8SFlorian Hahn; CHECK-LABEL: @and_constexpr(
9db91a6b8SFlorian Hahn; CHECK-NEXT:  entry:
10db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 0)
11db91a6b8SFlorian Hahn; CHECK-NEXT:    [[AND_2:%.*]] = and i32 20, [[A:%.*]]
12db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 [[AND_2]])
13db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 true)
14db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 false)
15db91a6b8SFlorian Hahn; CHECK-NEXT:    [[COND_1:%.*]] = icmp eq i32 [[AND_2]], 10
16db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 [[COND_1]])
17db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 4)
18db91a6b8SFlorian Hahn; CHECK-NEXT:    ret void
19db91a6b8SFlorian Hahn;
20db91a6b8SFlorian Hahnentry:
21db91a6b8SFlorian Hahn  %and.1 = and i32 ptrtoint (i32* inttoptr (i32 0 to i32*) to i32), %a
22db91a6b8SFlorian Hahn  call void @use.i32(i32 %and.1)
23db91a6b8SFlorian Hahn  %and.2 = and i32 ptrtoint (i32* inttoptr (i32 20 to i32*) to i32), %a
24db91a6b8SFlorian Hahn  call void @use.i32(i32 %and.2)
25db91a6b8SFlorian Hahn  %true.1 = icmp ne i32 %and.2, 100
26db91a6b8SFlorian Hahn  call void @use.i1(i1 %true.1)
27db91a6b8SFlorian Hahn  %false.1 = icmp eq i32 %and.2, 100
28db91a6b8SFlorian Hahn  call void @use.i1(i1 %false.1)
29db91a6b8SFlorian Hahn  %cond.1 = icmp eq i32 %and.2, 10
30db91a6b8SFlorian Hahn  call void @use.i1(i1 %cond.1)
31db91a6b8SFlorian Hahn  %and.3 = and i32 ptrtoint (i32* inttoptr (i32 20 to i32*) to i32), ptrtoint (i32* inttoptr (i32 100 to i32*) to i32)
32db91a6b8SFlorian Hahn  call void @use.i32(i32 %and.3)
33db91a6b8SFlorian Hahn  ret void
34db91a6b8SFlorian Hahn}
35db91a6b8SFlorian Hahn
36db91a6b8SFlorian Hahndefine void @add_constexpr(i32 %a) {
37db91a6b8SFlorian Hahn; CHECK-LABEL: @add_constexpr(
38db91a6b8SFlorian Hahn; CHECK-NEXT:  entry:
39db91a6b8SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add i32 0, [[A:%.*]]
40db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 [[ADD_1]])
41db91a6b8SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add i32 20, [[A]]
42db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 [[ADD_2]])
43db91a6b8SFlorian Hahn; CHECK-NEXT:    [[COND_1:%.*]] = icmp ne i32 [[ADD_2]], 100
44db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 [[COND_1]])
45db91a6b8SFlorian Hahn; CHECK-NEXT:    [[COND_2:%.*]] = icmp eq i32 [[ADD_2]], 100
46db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 [[COND_2]])
47db91a6b8SFlorian Hahn; CHECK-NEXT:    [[COND_3:%.*]] = icmp eq i32 [[ADD_2]], 10
48db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 [[COND_3]])
49db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 120)
50db91a6b8SFlorian Hahn; CHECK-NEXT:    ret void
51db91a6b8SFlorian Hahn;
52db91a6b8SFlorian Hahnentry:
53db91a6b8SFlorian Hahn  %add.1 = add i32 ptrtoint (i32* inttoptr (i32 0 to i32*) to i32), %a
54db91a6b8SFlorian Hahn  call void @use.i32(i32 %add.1)
55db91a6b8SFlorian Hahn  %add.2 = add i32 ptrtoint (i32* inttoptr (i32 20 to i32*) to i32), %a
56db91a6b8SFlorian Hahn  call void @use.i32(i32 %add.2)
57db91a6b8SFlorian Hahn  %cond.1 = icmp ne i32 %add.2, 100
58db91a6b8SFlorian Hahn  call void @use.i1(i1 %cond.1)
59db91a6b8SFlorian Hahn  %cond.2 = icmp eq i32 %add.2, 100
60db91a6b8SFlorian Hahn  call void @use.i1(i1 %cond.2)
61db91a6b8SFlorian Hahn  %cond.3 = icmp eq i32 %add.2, 10
62db91a6b8SFlorian Hahn  call void @use.i1(i1 %cond.3)
63db91a6b8SFlorian Hahn  %add.3 = add i32 ptrtoint (i32* inttoptr (i32 20 to i32*) to i32), ptrtoint (i32* inttoptr (i32 100 to i32*) to i32)
64db91a6b8SFlorian Hahn  call void @use.i32(i32 %add.3)
65db91a6b8SFlorian Hahn  ret void
66db91a6b8SFlorian Hahn}
67db91a6b8SFlorian Hahn
68db91a6b8SFlorian Hahndefine void @mul_constexpr(i32 %a) {
69db91a6b8SFlorian Hahn; CHECK-LABEL: @mul_constexpr(
70db91a6b8SFlorian Hahn; CHECK-NEXT:  entry:
71db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 0)
72db91a6b8SFlorian Hahn; CHECK-NEXT:    [[MUL_2:%.*]] = mul i32 20, [[A:%.*]]
73db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 [[MUL_2]])
74db91a6b8SFlorian Hahn; CHECK-NEXT:    [[COND_1:%.*]] = icmp ne i32 [[MUL_2]], 100
75db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 [[COND_1]])
76db91a6b8SFlorian Hahn; CHECK-NEXT:    [[COND_2:%.*]] = icmp eq i32 [[MUL_2]], 100
77db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 [[COND_2]])
78db91a6b8SFlorian Hahn; CHECK-NEXT:    [[COND_3:%.*]] = icmp eq i32 [[MUL_2]], 10
79db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 [[COND_3]])
80db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 2000)
81db91a6b8SFlorian Hahn; CHECK-NEXT:    ret void
82db91a6b8SFlorian Hahn;
83db91a6b8SFlorian Hahnentry:
84db91a6b8SFlorian Hahn  %mul.1 = mul i32 ptrtoint (i32* inttoptr (i32 0 to i32*) to i32), %a
85db91a6b8SFlorian Hahn  call void @use.i32(i32 %mul.1)
86db91a6b8SFlorian Hahn  %mul.2 = mul i32 ptrtoint (i32* inttoptr (i32 20 to i32*) to i32), %a
87db91a6b8SFlorian Hahn  call void @use.i32(i32 %mul.2)
88db91a6b8SFlorian Hahn  %cond.1 = icmp ne i32 %mul.2, 100
89db91a6b8SFlorian Hahn  call void @use.i1(i1 %cond.1)
90db91a6b8SFlorian Hahn  %cond.2 = icmp eq i32 %mul.2, 100
91db91a6b8SFlorian Hahn  call void @use.i1(i1 %cond.2)
92db91a6b8SFlorian Hahn  %cond.3 = icmp eq i32 %mul.2, 10
93db91a6b8SFlorian Hahn  call void @use.i1(i1 %cond.3)
94db91a6b8SFlorian Hahn  %mul.3 = mul i32 ptrtoint (i32* inttoptr (i32 20 to i32*) to i32), ptrtoint (i32* inttoptr (i32 100 to i32*) to i32)
95db91a6b8SFlorian Hahn  call void @use.i32(i32 %mul.3)
96db91a6b8SFlorian Hahn  ret void
97db91a6b8SFlorian Hahn}
98db91a6b8SFlorian Hahn
99db91a6b8SFlorian Hahndefine void @udiv_constexpr(i32 %a) {
100db91a6b8SFlorian Hahn; CHECK-LABEL: @udiv_constexpr(
101db91a6b8SFlorian Hahn; CHECK-NEXT:  entry:
102db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 0)
103db91a6b8SFlorian Hahn; CHECK-NEXT:    [[UDIV_2:%.*]] = udiv i32 20, [[A:%.*]]
104db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 [[UDIV_2]])
105db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 true)
106db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 false)
107db91a6b8SFlorian Hahn; CHECK-NEXT:    [[COND_1:%.*]] = icmp eq i32 [[UDIV_2]], 10
108db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i1(i1 [[COND_1]])
109db91a6b8SFlorian Hahn; CHECK-NEXT:    call void @use.i32(i32 0)
110db91a6b8SFlorian Hahn; CHECK-NEXT:    ret void
111db91a6b8SFlorian Hahn;
112db91a6b8SFlorian Hahnentry:
113db91a6b8SFlorian Hahn  %udiv.1 = udiv i32 ptrtoint (i32* inttoptr (i32 0 to i32*) to i32), %a
114db91a6b8SFlorian Hahn  call void @use.i32(i32 %udiv.1)
115db91a6b8SFlorian Hahn  %udiv.2 = udiv i32 ptrtoint (i32* inttoptr (i32 20 to i32*) to i32), %a
116db91a6b8SFlorian Hahn  call void @use.i32(i32 %udiv.2)
117db91a6b8SFlorian Hahn  %true.1 = icmp ne i32 %udiv.2, 100
118db91a6b8SFlorian Hahn  call void @use.i1(i1 %true.1)
119db91a6b8SFlorian Hahn  %false.1 = icmp eq i32 %udiv.2, 50
120db91a6b8SFlorian Hahn  call void @use.i1(i1 %false.1)
121db91a6b8SFlorian Hahn  %cond.1 = icmp eq i32 %udiv.2, 10
122db91a6b8SFlorian Hahn  call void @use.i1(i1 %cond.1)
123db91a6b8SFlorian Hahn  %udiv.3 = udiv i32 ptrtoint (i32* inttoptr (i32 20 to i32*) to i32), ptrtoint (i32* inttoptr (i32 100 to i32*) to i32)
124db91a6b8SFlorian Hahn  call void @use.i32(i32 %udiv.3)
125db91a6b8SFlorian Hahn  ret void
126db91a6b8SFlorian Hahn}
127