; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 ; RUN: opt -p="simplifycfg" -S < %s | FileCheck %s ;; Verify that fake uses are not ignored when sinking instructions in ;; SimplifyCFG; when a fake use appears in only one incoming block they prevent ;; further sinking, and when identical fake uses appear on both sides they ;; are sunk normally. target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" define void @foo(i1 %bool, ptr %p) { ; CHECK-LABEL: define void @foo( ; CHECK-SAME: i1 [[BOOL:%.*]], ptr [[P:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: br i1 [[BOOL]], label %[[IF_ELSE:.*]], label %[[IF_THEN:.*]] ; CHECK: [[COMMON_RET:.*]]: ; CHECK-NEXT: ret void ; CHECK: [[IF_THEN]]: ; CHECK-NEXT: store ptr [[P]], ptr [[P]], align 8 ; CHECK-NEXT: br label %[[COMMON_RET]] ; CHECK: [[IF_ELSE]]: ; CHECK-NEXT: store ptr [[P]], ptr [[P]], align 8 ; CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[P]]) ; CHECK-NEXT: br label %[[COMMON_RET]] ; entry: br i1 %bool, label %if.else, label %if.then common.ret: ; preds = %if.else, %if.then ret void if.then: ; preds = %entry store ptr %p, ptr %p, align 8 br label %common.ret if.else: ; preds = %entry store ptr %p, ptr %p, align 8 notail call void (...) @llvm.fake.use(ptr %p) br label %common.ret } define void @bar(i1 %bool, ptr %p) { ; CHECK-LABEL: define void @bar( ; CHECK-SAME: i1 [[BOOL:%.*]], ptr [[P:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: store ptr [[P]], ptr [[P]], align 8 ; CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[P]]) ; CHECK-NEXT: ret void ; entry: br i1 %bool, label %if.else, label %if.then common.ret: ; preds = %if.else, %if.then ret void if.then: ; preds = %entry store ptr %p, ptr %p, align 8 notail call void (...) @llvm.fake.use(ptr %p) br label %common.ret if.else: ; preds = %entry store ptr %p, ptr %p, align 8 notail call void (...) @llvm.fake.use(ptr %p) br label %common.ret }