Changeset View
Changeset View
Standalone View
Standalone View
llvm/trunk/test/Transforms/GVNHoist/pr38807.ll
; RUN: opt < %s -early-cse-memssa -gvn-hoist -S | FileCheck %s | |||||
; Make sure opt doesn't crash. On top of that, the instructions | |||||
; of the side blocks should be hoisted to the entry block. | |||||
%s = type { i32, i64 } | |||||
%S = type { %s, i32 } | |||||
;CHECK-LABEL: @foo | |||||
define void @foo(i32* %arg) { | |||||
bb0: | |||||
%0 = bitcast i32* %arg to %S* | |||||
%call.idx.i = getelementptr %S, %S* %0, i64 0, i32 0, i32 0 | |||||
%call.idx.val.i = load i32, i32* %call.idx.i | |||||
br label %bb1 | |||||
;CHECK: bb1: | |||||
;CHECK: %call264 = call zeroext i1 @bar | |||||
;CHECK: store i32 %call.idx.val.i, i32* %call.idx.i | |||||
;CHECK: %1 = getelementptr inbounds %S, %S* %0, i64 0, i32 0, i32 1 | |||||
;CHECK: store i64 undef, i64* %1 | |||||
;CHECK: br i1 %call264, label %bb2, label %bb3 | |||||
bb1: | |||||
%call264 = call zeroext i1 @bar() | |||||
br i1 %call264, label %bb2, label %bb3 | |||||
;CHECK: bb2: | |||||
;CHECK-NOT: store i32 %call.idx.val.i, i32* %call.idx.i | |||||
;CHECK-NOT: store i64 undef, i64* %{.*} | |||||
bb2: | |||||
store i32 %call.idx.val.i, i32* %call.idx.i | |||||
%1 = getelementptr inbounds %S, %S* %0, i64 0, i32 0, i32 1 | |||||
store i64 undef, i64* %1 | |||||
ret void | |||||
;CHECK: bb3: | |||||
;CHECK-NOT: store i32 %call.idx.val.i, i32* %call.idx.i | |||||
;CHECK-NOT: store i64 undef, i64* %{.*} | |||||
bb3: | |||||
store i32 %call.idx.val.i, i32* %call.idx.i | |||||
%2 = getelementptr inbounds %S, %S* %0, i64 0, i32 0, i32 1 | |||||
store i64 undef, i64* %2 | |||||
ret void | |||||
} | |||||
declare zeroext i1 @bar() |