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