| ; RUN: opt -S -gvn-hoist -newgvn < %s | FileCheck %s | |
| ; Check that store hoisting works: there should be only one store left. | |
| ; CHECK-LABEL: @getopt | |
| ; CHECK: store i32 | |
| ; CHECK-NOT: store i32 | |
| @optind = external global i32, align 4 | |
| define void @getopt() { | |
| bb: | |
| br label %bb1 | |
| bb1: ; preds = %bb | |
| br i1 undef, label %bb2, label %bb3 | |
| bb2: ; preds = %bb1 | |
| br label %bb13 | |
| bb3: ; preds = %bb1 | |
| br i1 undef, label %bb4, label %bb9 | |
| bb4: ; preds = %bb3 | |
| %tmp = load i32, i32* @optind, align 4 | |
| br i1 undef, label %bb5, label %bb7 | |
| bb5: ; preds = %bb4 | |
| %tmp6 = add nsw i32 %tmp, 1 | |
| store i32 %tmp6, i32* @optind, align 4 | |
| br label %bb12 | |
| bb7: ; preds = %bb4 | |
| %tmp8 = add nsw i32 %tmp, 1 | |
| store i32 %tmp8, i32* @optind, align 4 | |
| br label %bb13 | |
| bb9: ; preds = %bb3 | |
| %tmp10 = load i32, i32* @optind, align 4 | |
| %tmp11 = add nsw i32 %tmp10, 1 | |
| store i32 %tmp11, i32* @optind, align 4 | |
| br label %bb12 | |
| bb12: ; preds = %bb9, %bb5 | |
| br label %bb13 | |
| bb13: ; preds = %bb12, %bb7, %bb2 | |
| ret void | |
| } | |
| @GlobalVar = internal global float 1.000000e+00 | |
| ; Check that we hoist stores and remove the MSSA phi node. | |
| ; CHECK-LABEL: @hoistStoresUpdateMSSA | |
| ; CHECK: store float | |
| ; CHECK-NOT: store float | |
| define float @hoistStoresUpdateMSSA(float %d) { | |
| entry: | |
| store float 0.000000e+00, float* @GlobalVar | |
| %cmp = fcmp oge float %d, 0.000000e+00 | |
| br i1 %cmp, label %if.then, label %if.end | |
| if.then: | |
| store float 0.000000e+00, float* @GlobalVar | |
| br label %if.end | |
| if.end: | |
| %tmp = load float, float* @GlobalVar, align 4 | |
| ret float %tmp | |
| } |