Place the ssa.copy instructions for assumes after the assume, instead of before it. Both options are valid, but placing them afterwards prevents assumes from being replaced with assume(true). This fixes https://bugs.llvm.org/show_bug.cgi?id=37541 in NewGVN and will avoid a similar issue in SCCP when we handle more predicate infos. Differential Revision: https://reviews.llvm.org/D83631
39 lines
1.0 KiB
LLVM
39 lines
1.0 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -newgvn -S | FileCheck %s
|
|
|
|
define i32 @test1(i32 %arg) {
|
|
; CHECK-LABEL: @test1(
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ARG:%.*]], 5
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
|
|
; CHECK-NEXT: ret i32 [[ARG]]
|
|
;
|
|
%cmp = icmp sge i32 %arg, 5
|
|
call void @llvm.assume(i1 %cmp)
|
|
ret i32 %arg
|
|
}
|
|
|
|
define i32 @test2(i32 %arg, i1 %b) {
|
|
; CHECK-LABEL: @test2(
|
|
; CHECK-NEXT: br label [[BB:%.*]]
|
|
; CHECK: bb:
|
|
; CHECK-NEXT: [[A:%.*]] = phi i32 [ 1, [[TMP0:%.*]] ], [ 2, [[BB]] ]
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[ARG:%.*]], [[A]]
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
|
|
; CHECK-NEXT: br i1 [[B:%.*]], label [[BB]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret i32 [[ARG]]
|
|
;
|
|
br label %bb
|
|
|
|
bb:
|
|
%a = phi i32 [ 1, %0 ], [ 2, %bb ]
|
|
%cmp = icmp eq i32 %arg, %a
|
|
call void @llvm.assume(i1 %cmp)
|
|
br i1 %b, label %bb, label %end
|
|
|
|
end:
|
|
ret i32 %arg
|
|
}
|
|
|
|
declare void @llvm.assume(i1 %cond)
|