xref: /llvm-project/llvm/test/Transforms/NewGVN/pr12979.ll (revision fb4a836b5c8513a7d40d82b4d5d0f546d2a354f4)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2; RUN: opt -passes=newgvn -S < %s | FileCheck %s
3
4define i32 @test1(i32 %x, i32 %y) {
5; CHECK-LABEL: define i32 @test1
6; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
7; CHECK-NEXT:    [[ADD1:%.*]] = add i32 [[X]], [[Y]]
8; CHECK-NEXT:    [[FOO:%.*]] = add i32 [[ADD1]], [[ADD1]]
9; CHECK-NEXT:    ret i32 [[FOO]]
10;
11
12  %add1 = add nsw i32 %x, %y
13  %add2 = add     i32 %x, %y
14  %foo = add i32 %add1, %add2
15  ret i32 %foo
16}
17
18define i32 @test2(i32 %x, i32 %y) {
19; CHECK-LABEL: define i32 @test2
20; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
21; CHECK-NEXT:    [[ADD1:%.*]] = add i32 [[X]], [[Y]]
22; CHECK-NEXT:    [[FOO:%.*]] = add i32 [[ADD1]], [[ADD1]]
23; CHECK-NEXT:    ret i32 [[FOO]]
24;
25
26  %add1 = add nuw i32 %x, %y
27  %add2 = add     i32 %x, %y
28  %foo = add i32 %add1, %add2
29  ret i32 %foo
30}
31
32define i32 @test3(i32 %x, i32 %y) {
33; CHECK-LABEL: define i32 @test3
34; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
35; CHECK-NEXT:    [[ADD1:%.*]] = add i32 [[X]], [[Y]]
36; CHECK-NEXT:    [[FOO:%.*]] = add i32 [[ADD1]], [[ADD1]]
37; CHECK-NEXT:    ret i32 [[FOO]]
38;
39
40  %add1 = add nuw nsw i32 %x, %y
41  %add2 = add     i32 %x, %y
42  %foo = add i32 %add1, %add2
43  ret i32 %foo
44}
45
46define i32 @test4(i32 %x, i32 %y) {
47; CHECK-LABEL: define i32 @test4
48; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
49; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[X]], [[Y]]
50; CHECK-NEXT:    [[FOO:%.*]] = add i32 [[ADD1]], [[ADD1]]
51; CHECK-NEXT:    ret i32 [[FOO]]
52;
53
54  %add1 = add nsw i32 %x, %y
55  %add2 = add nsw i32 %x, %y
56  %foo = add i32 %add1, %add2
57  ret i32 %foo
58}
59
60define i32 @test5(i32 %x, i32 %y) {
61; CHECK-LABEL: define i32 @test5
62; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
63; CHECK-NEXT:    [[ADD1:%.*]] = add i32 [[X]], [[Y]]
64; CHECK-NEXT:    [[FOO:%.*]] = add i32 [[ADD1]], [[ADD1]]
65; CHECK-NEXT:    ret i32 [[FOO]]
66;
67
68  %add1 = add nuw i32 %x, %y
69  %add2 = add nsw i32 %x, %y
70  %foo = add i32 %add1, %add2
71  ret i32 %foo
72}
73
74define i32 @test6(i32 %x, i32 %y) {
75; CHECK-LABEL: define i32 @test6
76; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
77; CHECK-NEXT:    [[ADD1:%.*]] = add nsw i32 [[X]], [[Y]]
78; CHECK-NEXT:    [[FOO:%.*]] = add i32 [[ADD1]], [[ADD1]]
79; CHECK-NEXT:    ret i32 [[FOO]]
80;
81
82  %add1 = add nuw nsw i32 %x, %y
83  %add2 = add nsw i32 %x, %y
84  %foo = add i32 %add1, %add2
85  ret i32 %foo
86}
87
88define i32 @test7(i32 %x, i32 %y) {
89; CHECK-LABEL: define i32 @test7
90; CHECK-SAME: (i32 [[X:%.*]], i32 [[Y:%.*]]) {
91; CHECK-NEXT:    [[ADD1:%.*]] = add i32 [[X]], [[Y]]
92; CHECK-NEXT:    [[FOO:%.*]] = add i32 [[ADD1]], [[ADD1]]
93; CHECK-NEXT:    ret i32 [[FOO]]
94;
95
96  %add1 = add i32 %x, %y, !what_is_this !{}
97  %add2 = add i32 %x, %y
98  %foo = add i32 %add1, %add2
99  ret i32 %foo
100}
101
102declare void @mumble(i2, i2)
103
104define void @test8(i2 %x) {
105; CHECK-LABEL: define void @test8
106; CHECK-SAME: (i2 [[X:%.*]]) {
107; CHECK-NEXT:    [[ASHR0:%.*]] = ashr i2 [[X]], 1
108; CHECK-NEXT:    call void @mumble(i2 [[ASHR0]], i2 [[ASHR0]])
109; CHECK-NEXT:    ret void
110;
111
112  %ashr0 = ashr exact i2 %x, 1
113  %ashr1 = ashr i2 %x, 1
114  call void @mumble(i2 %ashr0, i2 %ashr1)
115  ret void
116}
117