1 ; RUN: opt < %s -instcombine -S | FileCheck %s 2 3 define void @test1(i32* %P) { 4 store i32 undef, i32* %P 5 store i32 123, i32* undef 6 store i32 124, i32* null 7 ret void 8 ; CHECK: @test1( 9 ; CHECK-NEXT: store i32 123, i32* undef 10 ; CHECK-NEXT: store i32 undef, i32* null 11 ; CHECK-NEXT: ret void 12 } 13 14 define void @test2(i32* %P) { 15 %X = load i32* %P ; <i32> [#uses=1] 16 %Y = add i32 %X, 0 ; <i32> [#uses=1] 17 store i32 %Y, i32* %P 18 ret void 19 ; CHECK: @test2 20 ; CHECK-NEXT: ret void 21 } 22 23 ;; Simple sinking tests 24 25 ; "if then else" 26 define i32 @test3(i1 %C) { 27 %A = alloca i32 28 br i1 %C, label %Cond, label %Cond2 29 30 Cond: 31 store i32 -987654321, i32* %A 32 br label %Cont 33 34 Cond2: 35 store i32 47, i32* %A 36 br label %Cont 37 38 Cont: 39 %V = load i32* %A 40 ret i32 %V 41 ; CHECK: @test3 42 ; CHECK-NOT: alloca 43 ; CHECK: Cont: 44 ; CHECK-NEXT: %storemerge = phi i32 [ 47, %Cond2 ], [ -987654321, %Cond ] 45 ; CHECK-NEXT: ret i32 %storemerge 46 } 47 48 ; "if then" 49 define i32 @test4(i1 %C) { 50 %A = alloca i32 51 store i32 47, i32* %A 52 br i1 %C, label %Cond, label %Cont 53 54 Cond: 55 store i32 -987654321, i32* %A 56 br label %Cont 57 58 Cont: 59 %V = load i32* %A 60 ret i32 %V 61 ; CHECK: @test4 62 ; CHECK-NOT: alloca 63 ; CHECK: Cont: 64 ; CHECK-NEXT: %storemerge = phi i32 [ -987654321, %Cond ], [ 47, %0 ] 65 ; CHECK-NEXT: ret i32 %storemerge 66 } 67 68 ; "if then" 69 define void @test5(i1 %C, i32* %P) { 70 store i32 47, i32* %P, align 1 71 br i1 %C, label %Cond, label %Cont 72 73 Cond: 74 store i32 -987654321, i32* %P, align 1 75 br label %Cont 76 77 Cont: 78 ret void 79 ; CHECK: @test5 80 ; CHECK: Cont: 81 ; CHECK-NEXT: %storemerge = phi i32 82 ; CHECK-NEXT: store i32 %storemerge, i32* %P, align 1 83 ; CHECK-NEXT: ret void 84 } 85 86