forked from OSchip/llvm-project
[InstCombine] add test for assume in block with unreachable (PR47416); NFC
This commit is contained in:
parent
b3e139444f
commit
c5d6b2b7e5
|
|
@ -1,66 +1,56 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define i32 @foo1(i32* %a) #0 {
|
||||
; CHECK-LABEL: @foo1(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A:%.*]], align 32
|
||||
; CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint i32* [[A]] to i64
|
||||
; CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31
|
||||
; CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
|
||||
; CHECK-NEXT: ret i32 [[TMP0]]
|
||||
;
|
||||
entry:
|
||||
%0 = load i32, i32* %a, align 4
|
||||
declare void @llvm.assume(i1) #1
|
||||
|
||||
; Check that the alignment has been upgraded and that the assume has not
|
||||
; been removed:
|
||||
|
||||
define i32 @foo1(i32* %a) #0 {
|
||||
; CHECK-LABEL: @foo1(
|
||||
; CHECK-NEXT: [[T0:%.*]] = load i32, i32* [[A:%.*]], align 32
|
||||
; CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint i32* [[A]] to i64
|
||||
; CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31
|
||||
; CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
|
||||
; CHECK-NEXT: ret i32 [[T0]]
|
||||
;
|
||||
%t0 = load i32, i32* %a, align 4
|
||||
%ptrint = ptrtoint i32* %a to i64
|
||||
%maskedptr = and i64 %ptrint, 31
|
||||
%maskcond = icmp eq i64 %maskedptr, 0
|
||||
tail call void @llvm.assume(i1 %maskcond)
|
||||
|
||||
ret i32 %0
|
||||
ret i32 %t0
|
||||
}
|
||||
|
||||
; Same check as in @foo1, but make sure it works if the assume is first too.
|
||||
|
||||
define i32 @foo2(i32* %a) #0 {
|
||||
; CHECK-LABEL: @foo2(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[PTRINT:%.*]] = ptrtoint i32* [[A:%.*]] to i64
|
||||
; CHECK-NEXT: [[MASKEDPTR:%.*]] = and i64 [[PTRINT]], 31
|
||||
; CHECK-NEXT: [[MASKCOND:%.*]] = icmp eq i64 [[MASKEDPTR]], 0
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 [[MASKCOND]])
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 32
|
||||
; CHECK-NEXT: ret i32 [[TMP0]]
|
||||
; CHECK-NEXT: [[T0:%.*]] = load i32, i32* [[A]], align 32
|
||||
; CHECK-NEXT: ret i32 [[T0]]
|
||||
;
|
||||
entry:
|
||||
; Same check as in @foo1, but make sure it works if the assume is first too.
|
||||
|
||||
%ptrint = ptrtoint i32* %a to i64
|
||||
%maskedptr = and i64 %ptrint, 31
|
||||
%maskcond = icmp eq i64 %maskedptr, 0
|
||||
tail call void @llvm.assume(i1 %maskcond)
|
||||
|
||||
%0 = load i32, i32* %a, align 4
|
||||
ret i32 %0
|
||||
%t0 = load i32, i32* %a, align 4
|
||||
ret i32 %t0
|
||||
}
|
||||
|
||||
declare void @llvm.assume(i1) #1
|
||||
|
||||
define i32 @simple(i32 %a) #1 {
|
||||
; CHECK-LABEL: @simple(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 4
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
|
||||
; CHECK-NEXT: ret i32 4
|
||||
;
|
||||
entry:
|
||||
|
||||
|
||||
%cmp = icmp eq i32 %a, 4
|
||||
tail call void @llvm.assume(i1 %cmp)
|
||||
ret i32 %a
|
||||
|
|
@ -68,72 +58,55 @@ entry:
|
|||
|
||||
define i32 @can1(i1 %a, i1 %b, i1 %c) {
|
||||
; CHECK-LABEL: @can1(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 [[A:%.*]])
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 [[B:%.*]])
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 [[C:%.*]])
|
||||
; CHECK-NEXT: ret i32 5
|
||||
;
|
||||
entry:
|
||||
%and1 = and i1 %a, %b
|
||||
%and = and i1 %and1, %c
|
||||
tail call void @llvm.assume(i1 %and)
|
||||
|
||||
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
define i32 @can2(i1 %a, i1 %b, i1 %c) {
|
||||
; CHECK-LABEL: @can2(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[A:%.*]], true
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]])
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[B:%.*]], true
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[A:%.*]], true
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP1]])
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = xor i1 [[B:%.*]], true
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP2]])
|
||||
; CHECK-NEXT: ret i32 5
|
||||
;
|
||||
entry:
|
||||
%v = or i1 %a, %b
|
||||
%w = xor i1 %v, 1
|
||||
tail call void @llvm.assume(i1 %w)
|
||||
|
||||
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
define i32 @bar1(i32 %a) #0 {
|
||||
; CHECK-LABEL: @bar1(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], 7
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 1
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
|
||||
; CHECK-NEXT: ret i32 1
|
||||
;
|
||||
entry:
|
||||
%and1 = and i32 %a, 3
|
||||
|
||||
|
||||
%and = and i32 %a, 7
|
||||
%cmp = icmp eq i32 %and, 1
|
||||
tail call void @llvm.assume(i1 %cmp)
|
||||
|
||||
ret i32 %and1
|
||||
}
|
||||
|
||||
define i32 @bar2(i32 %a) #0 {
|
||||
; CHECK-LABEL: @bar2(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], 7
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 1
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
|
||||
; CHECK-NEXT: ret i32 1
|
||||
;
|
||||
entry:
|
||||
|
||||
%and = and i32 %a, 7
|
||||
%cmp = icmp eq i32 %and, 1
|
||||
tail call void @llvm.assume(i1 %cmp)
|
||||
|
||||
%and1 = and i32 %a, 3
|
||||
ret i32 %and1
|
||||
}
|
||||
|
|
@ -176,15 +149,11 @@ define i32 @bar4(i32 %a, i32 %b) {
|
|||
;
|
||||
entry:
|
||||
%and1 = and i32 %b, 3
|
||||
|
||||
|
||||
%and = and i32 %a, 7
|
||||
%cmp = icmp eq i32 %and, 1
|
||||
tail call void @llvm.assume(i1 %cmp)
|
||||
|
||||
%cmp2 = icmp eq i32 %a, %b
|
||||
tail call void @llvm.assume(i1 %cmp2)
|
||||
|
||||
ret i32 %and1
|
||||
}
|
||||
|
||||
|
|
@ -377,10 +346,10 @@ define i32 @assumption_conflicts_with_known_bits(i32 %a, i32 %b) {
|
|||
define void @debug_interference(i8 %x) {
|
||||
; CHECK-LABEL: @debug_interference(
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[X:%.*]], 0
|
||||
; CHECK-NEXT: tail call void @llvm.dbg.value(metadata i32 5, metadata !7, metadata !DIExpression()), !dbg !9
|
||||
; CHECK-NEXT: tail call void @llvm.dbg.value(metadata i32 5, [[META7:metadata !.*]], metadata !DIExpression()), [[DBG9:!dbg !.*]]
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 false)
|
||||
; CHECK-NEXT: tail call void @llvm.dbg.value(metadata i32 5, metadata !7, metadata !DIExpression()), !dbg !9
|
||||
; CHECK-NEXT: tail call void @llvm.dbg.value(metadata i32 5, metadata !7, metadata !DIExpression()), !dbg !9
|
||||
; CHECK-NEXT: tail call void @llvm.dbg.value(metadata i32 5, [[META7]], metadata !DIExpression()), [[DBG9]]
|
||||
; CHECK-NEXT: tail call void @llvm.dbg.value(metadata i32 5, [[META7]], metadata !DIExpression()), [[DBG9]]
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP2]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
|
|
@ -532,7 +501,6 @@ define void @always_true_assumption() {
|
|||
;
|
||||
call void @llvm.assume(i1 true)
|
||||
ret void
|
||||
|
||||
}
|
||||
|
||||
; The alloca guarantees that the low bits of %a are zero because of alignment.
|
||||
|
|
@ -588,6 +556,47 @@ define void @PR36270(i32 %b) {
|
|||
unreachable
|
||||
}
|
||||
|
||||
; PR47416
|
||||
|
||||
define i32 @unreachable_assume(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: @unreachable_assume(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CMP0:%.*]] = icmp sgt i32 [[X:%.*]], 1
|
||||
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[Y:%.*]], 1
|
||||
; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP0]], [[CMP1]]
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 [[OR]])
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[X]], 1
|
||||
; CHECK-NEXT: br i1 [[CMP2]], label [[IF:%.*]], label [[EXIT:%.*]]
|
||||
; CHECK: if:
|
||||
; CHECK-NEXT: [[A:%.*]] = and i32 [[Y]], -2
|
||||
; CHECK-NEXT: [[CMP3:%.*]] = icmp ne i32 [[A]], 104
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP3]])
|
||||
; CHECK-NEXT: br label [[EXIT]]
|
||||
; CHECK: exit:
|
||||
; CHECK-NEXT: [[CMP4:%.*]] = icmp eq i32 [[X]], 2
|
||||
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP4]])
|
||||
; CHECK-NEXT: unreachable
|
||||
;
|
||||
entry:
|
||||
%cmp0 = icmp sgt i32 %x, 1
|
||||
%cmp1 = icmp eq i32 %y, 1
|
||||
%or = or i1 %cmp0, %cmp1
|
||||
tail call void @llvm.assume(i1 %or)
|
||||
%cmp2 = icmp eq i32 %x, 1
|
||||
br i1 %cmp2, label %if, label %exit
|
||||
|
||||
if:
|
||||
%a = and i32 %y, -2
|
||||
%cmp3 = icmp ne i32 %a, 104
|
||||
tail call void @llvm.assume(i1 %cmp3)
|
||||
br label %exit
|
||||
|
||||
exit:
|
||||
%cmp4 = icmp eq i32 %x, 2
|
||||
tail call void @llvm.assume(i1 %cmp4)
|
||||
unreachable
|
||||
}
|
||||
|
||||
declare void @llvm.dbg.value(metadata, metadata, metadata)
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
|
|
|
|||
Loading…
Reference in New Issue