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
4 define 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]]
12 %add1 = add nsw i32 %x, %y
13 %add2 = add i32 %x, %y
14 %foo = add i32 %add1, %add2
18 define 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]]
26 %add1 = add nuw i32 %x, %y
27 %add2 = add i32 %x, %y
28 %foo = add i32 %add1, %add2
32 define 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]]
40 %add1 = add nuw nsw i32 %x, %y
41 %add2 = add i32 %x, %y
42 %foo = add i32 %add1, %add2
46 define 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]]
54 %add1 = add nsw i32 %x, %y
55 %add2 = add nsw i32 %x, %y
56 %foo = add i32 %add1, %add2
60 define 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]]
68 %add1 = add nuw i32 %x, %y
69 %add2 = add nsw i32 %x, %y
70 %foo = add i32 %add1, %add2
74 define 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]]
82 %add1 = add nuw nsw i32 %x, %y
83 %add2 = add nsw i32 %x, %y
84 %foo = add i32 %add1, %add2
88 define 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]]
96 %add1 = add i32 %x, %y, !what_is_this !{}
97 %add2 = add i32 %x, %y
98 %foo = add i32 %add1, %add2
102 declare void @mumble(i2, i2)
104 define 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
112 %ashr0 = ashr exact i2 %x, 1
113 %ashr1 = ashr i2 %x, 1
114 call void @mumble(i2 %ashr0, i2 %ashr1)