1 ; RUN: opt -gvn -S < %s | FileCheck %s 2 3 define i32 @test1(i32 %x, i32 %y) { 4 ; CHECK: @test1(i32 %x, i32 %y) 5 ; CHECK: %add1 = add i32 %x, %y 6 ; CHECK: %foo = add i32 %add1, %add1 7 8 %add1 = add nsw i32 %x, %y 9 %add2 = add i32 %x, %y 10 %foo = add i32 %add1, %add2 11 ret i32 %foo 12 } 13 14 define i32 @test2(i32 %x, i32 %y) { 15 ; CHECK: @test2(i32 %x, i32 %y) 16 ; CHECK: %add1 = add i32 %x, %y 17 ; CHECK: %foo = add i32 %add1, %add1 18 19 %add1 = add nuw i32 %x, %y 20 %add2 = add i32 %x, %y 21 %foo = add i32 %add1, %add2 22 ret i32 %foo 23 } 24 25 define i32 @test3(i32 %x, i32 %y) { 26 ; CHECK: @test3(i32 %x, i32 %y) 27 ; CHECK: %add1 = add i32 %x, %y 28 ; CHECK: %foo = add i32 %add1, %add1 29 30 %add1 = add nuw nsw i32 %x, %y 31 %add2 = add i32 %x, %y 32 %foo = add i32 %add1, %add2 33 ret i32 %foo 34 } 35 36 define i32 @test4(i32 %x, i32 %y) { 37 ; CHECK: @test4(i32 %x, i32 %y) 38 ; CHECK: %add1 = add nsw i32 %x, %y 39 ; CHECK: %foo = add i32 %add1, %add1 40 41 %add1 = add nsw i32 %x, %y 42 %add2 = add nsw i32 %x, %y 43 %foo = add i32 %add1, %add2 44 ret i32 %foo 45 } 46 47 define i32 @test5(i32 %x, i32 %y) { 48 ; CHECK: @test5(i32 %x, i32 %y) 49 ; CHECK: %add1 = add i32 %x, %y 50 ; CHECK: %foo = add i32 %add1, %add1 51 52 %add1 = add nuw i32 %x, %y 53 %add2 = add nsw i32 %x, %y 54 %foo = add i32 %add1, %add2 55 ret i32 %foo 56 } 57 58 define i32 @test6(i32 %x, i32 %y) { 59 ; CHECK: @test6(i32 %x, i32 %y) 60 ; CHECK: %add1 = add nsw i32 %x, %y 61 ; CHECK: %foo = add i32 %add1, %add1 62 63 %add1 = add nuw nsw i32 %x, %y 64 %add2 = add nsw i32 %x, %y 65 %foo = add i32 %add1, %add2 66 ret i32 %foo 67 } 68 69 define i32 @test7(i32 %x, i32 %y) { 70 ; CHECK: @test7(i32 %x, i32 %y) 71 ; CHECK: %add1 = add i32 %x, %y 72 ; CHECK-NOT: what_is_this 73 ; CHECK: %foo = add i32 %add1, %add1 74 75 %add1 = add i32 %x, %y, !what_is_this !{} 76 %add2 = add i32 %x, %y 77 %foo = add i32 %add1, %add2 78 ret i32 %foo 79 } 80 81 declare void @mumble(i2, i2) 82 83 define void @test8(i2 %x) { 84 ; CHECK-LABEL: @test8( 85 ; CHECK: %[[ashr:.*]] = ashr i2 %x, 1 86 ; CHECK-NEXT: call void @mumble(i2 %[[ashr]], i2 %[[ashr]]) 87 ; CHECK-NEXT: ret void 88 89 %ashr0 = ashr exact i2 %x, 1 90 %ashr1 = ashr i2 %x, 1 91 call void @mumble(i2 %ashr0, i2 %ashr1) 92 ret void 93 } 94