From d8e1203f91500a4a87218e9a8f5de03456bd8603 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 22 Sep 2021 22:28:58 +0200 Subject: [PATCH] [JumpThreading] Add test with free instructions (NFC) Which demonstrates that "free" instructions can prevent jump threading. --- .../JumpThreading/free_instructions.ll | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 llvm/test/Transforms/JumpThreading/free_instructions.ll diff --git a/llvm/test/Transforms/JumpThreading/free_instructions.ll b/llvm/test/Transforms/JumpThreading/free_instructions.ll new file mode 100644 index 000000000000..f768ec996779 --- /dev/null +++ b/llvm/test/Transforms/JumpThreading/free_instructions.ll @@ -0,0 +1,64 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -jump-threading -jump-threading-threshold=3 < %s | FileCheck %s + +; TODO: In this test case, only the stores in %join should cound towards +; the jump threading threshold, as everything else are free instructions. +define i32 @free_instructions(i1 %c, i32* %p) { +; CHECK-LABEL: @free_instructions( +; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] +; CHECK: if: +; CHECK-NEXT: store i32 -1, i32* [[P:%.*]], align 4 +; CHECK-NEXT: br label [[JOIN:%.*]] +; CHECK: else: +; CHECK-NEXT: store i32 -2, i32* [[P]], align 4 +; CHECK-NEXT: br label [[JOIN]] +; CHECK: join: +; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META0:![0-9]+]]) +; CHECK-NEXT: store i32 1, i32* [[P]], align 4, !noalias !0 +; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 32) ] +; CHECK-NEXT: store i32 2, i32* [[P]], align 4 +; CHECK-NEXT: [[P2:%.*]] = bitcast i32* [[P]] to i8* +; CHECK-NEXT: [[P3:%.*]] = call i8* @llvm.launder.invariant.group.p0i8(i8* [[P2]]) +; CHECK-NEXT: [[P4:%.*]] = bitcast i8* [[P3]] to i32* +; CHECK-NEXT: store i32 3, i32* [[P4]], align 4, !invariant.group !3 +; CHECK-NEXT: br i1 [[C]], label [[IF2:%.*]], label [[ELSE2:%.*]] +; CHECK: if2: +; CHECK-NEXT: ret i32 0 +; CHECK: else2: +; CHECK-NEXT: ret i32 1 +; + br i1 %c, label %if, label %else + +if: + store i32 -1, i32* %p + br label %join + +else: + store i32 -2, i32* %p + br label %join + +join: + call void @llvm.experimental.noalias.scope.decl(metadata !0) + store i32 1, i32* %p, !noalias !0 + call void @llvm.assume(i1 true) ["align"(i32* %p, i64 32)] + store i32 2, i32* %p + %p2 = bitcast i32* %p to i8* + %p3 = call i8* @llvm.launder.invariant.group.p0i8(i8* %p2) + %p4 = bitcast i8* %p3 to i32* + store i32 3, i32* %p4, !invariant.group !{} + br i1 %c, label %if2, label %else2 + +if2: + ret i32 0 + +else2: + ret i32 1 +} + +declare void @llvm.assume(i1) +declare void @llvm.experimental.noalias.scope.decl(metadata) +declare i8* @llvm.launder.invariant.group.p0i8(i8*) + +!0 = !{!1} +!1 = distinct !{!1, !2, !"scope"} +!2 = distinct !{!2, !"domain"}