From: Sanjay Patel Date: Thu, 26 Aug 2021 16:33:42 +0000 (-0400) Subject: [GlobalOpt] add tests for constant expressions that can trap; NFC X-Git-Tag: upstream/15.0.7~32935 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=038704c43bc7e29f5d73661441a59e6df0583938;p=platform%2Fupstream%2Fllvm.git [GlobalOpt] add tests for constant expressions that can trap; NFC https://llvm.org/PR47578 --- diff --git a/llvm/test/Transforms/GlobalOpt/constant-can-trap.ll b/llvm/test/Transforms/GlobalOpt/constant-can-trap.ll new file mode 100644 index 0000000..5caef59 --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/constant-can-trap.ll @@ -0,0 +1,83 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -passes=globalopt < %s -S | FileCheck %s + +@i = internal unnamed_addr global i32 1, align 4 +@r = internal global i64 0, align 8 + +declare dso_local void @use(i32) + +define i32 @cantrap_constant() { +; CHECK-LABEL: @cantrap_constant( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[DOTB:%.*]] = load i1, i1* @i, align 1 +; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[DOTB]], i32 trunc (i64 urem (i64 7, i64 zext (i1 icmp eq (i64* inttoptr (i64 1 to i64*), i64* @r) to i64)) to i32), i32 1 +; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[TMP0]], 0 +; CHECK-NEXT: [[NOT_TOBOOL:%.*]] = xor i1 [[TOBOOL]], true +; CHECK-NEXT: [[SPEC_SELECT:%.*]] = zext i1 [[NOT_TOBOOL]] to i32 +; CHECK-NEXT: tail call void @use(i32 [[SPEC_SELECT]]) +; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[EXIT:%.*]] +; CHECK: if.then: +; CHECK-NEXT: store i1 true, i1* @i, align 1 +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret i32 0 +; +entry: + %0 = load i32, i32* @i, align 4 + %tobool = icmp eq i32 %0, 0 + %not.tobool = xor i1 %tobool, true + %spec.select = zext i1 %not.tobool to i32 + tail call void @use(i32 %spec.select) + br i1 %tobool, label %if.then, label %exit + +if.then: + store i32 trunc (i64 urem (i64 7, i64 zext (i1 icmp eq (i64* inttoptr (i64 1 to i64*), i64* @r) to i64)) to i32), i32* @i, align 4 + br label %exit + +exit: + ret i32 0 +} + +@b1 = internal global i64* null, align 8 +@d1 = internal unnamed_addr global i32 0, align 2 + +define void @maytrap() { +; CHECK-LABEL: @maytrap( +; CHECK-NEXT: store i1 true, i1* @d1, align 1 +; CHECK-NEXT: ret void +; + store i32 srem (i32 7, i32 zext (i1 icmp eq (i64** inttoptr (i64 16 to i64**), i64** @b1) to i32)), i32* @d1, align 2 + ret void +} + +define i32 @main1() { +; CHECK-LABEL: @main1( +; CHECK-NEXT: [[T0_B:%.*]] = load i1, i1* @d1, align 1 +; CHECK-NEXT: [[T0:%.*]] = select i1 [[T0_B]], i32 srem (i32 7, i32 zext (i1 icmp eq (i64** inttoptr (i64 16 to i64**), i64** @b1) to i32)), i32 0 +; CHECK-NEXT: ret i32 [[T0]] +; + %t0 = load i32, i32* @d1, align 2 + ret i32 %t0 +} + +@b2 = internal global i64* null, align 8 +@d2 = internal unnamed_addr global i32 0, align 2 + +define void @maynottrap() { +; CHECK-LABEL: @maynottrap( +; CHECK-NEXT: store i1 true, i1* @d2, align 1 +; CHECK-NEXT: ret void +; + store i32 mul (i32 7, i32 zext (i1 icmp eq (i64** inttoptr (i64 16 to i64**), i64** @b2) to i32)), i32* @d2, align 2 + ret void +} + +define i32 @main2() { +; CHECK-LABEL: @main2( +; CHECK-NEXT: [[T0_B:%.*]] = load i1, i1* @d2, align 1 +; CHECK-NEXT: [[T0:%.*]] = select i1 [[T0_B]], i32 mul (i32 zext (i1 icmp eq (i64** inttoptr (i64 16 to i64**), i64** @b2) to i32), i32 7), i32 0 +; CHECK-NEXT: ret i32 [[T0]] +; + %t0 = load i32, i32* @d2, align 2 + ret i32 %t0 +}