This is a workaround and it would be better to fix this generally, but doing it generally is quite tricky. See D48541 and PR38117. Doing it in PredicateInfo directly allows us to use the type address to differentiate different unnamed types, because neither the created declarations nor the ssa_copy calls should be visible after PredicateInfo got destroyed. Reviewers: efriedma, davide Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D49126 llvm-svn: 337828
69 lines
2.3 KiB
LLVM
69 lines
2.3 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -print-predicateinfo < %s 2>&1 | FileCheck %s
|
|
define i1 @f(i32 %x, i1 %y) {
|
|
; CHECK-LABEL: @f(
|
|
; CHECK-NEXT: br i1 [[Y:%.*]], label [[BB0:%.*]], label [[BB1:%.*]]
|
|
; CHECK: bb0:
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
|
|
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[X]])
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[BB2:%.*]], label [[BB3:%.*]]
|
|
; CHECK: bb1:
|
|
; CHECK-NEXT: [[X2:%.*]] = add nuw nsw i32 [[X]], 1
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i32 [[X2]], 2
|
|
; CHECK: [[X2_0:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[X2]])
|
|
; CHECK-NEXT: br i1 [[CMP2]], label [[BB2]], label [[BB3]]
|
|
; CHECK: bb2:
|
|
; CHECK-NEXT: [[X3:%.*]] = phi i32 [ [[X_0]], [[BB0]] ], [ [[X2_0]], [[BB1]] ]
|
|
; CHECK-NEXT: br label [[BB3]]
|
|
; CHECK: bb3:
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
br i1 %y, label %bb0, label %bb1
|
|
bb0:
|
|
%cmp = icmp sge i32 %x, 0 ; x > 0
|
|
br i1 %cmp, label %bb2, label %bb3
|
|
bb1:
|
|
%x2 = add nsw nuw i32 %x, 1
|
|
%cmp2 = icmp sge i32 %x2, 2 ; x+1 > 2 / x > 1
|
|
br i1 %cmp2, label %bb2, label %bb3
|
|
bb2:
|
|
%x3 = phi i32 [ %x, %bb0 ], [ %x2, %bb1 ]
|
|
br label %bb3
|
|
bb3:
|
|
ret i1 0
|
|
}
|
|
|
|
define i1 @g(i32 %x, i1 %y) {
|
|
; CHECK-LABEL: @g(
|
|
; CHECK-NEXT: br i1 [[Y:%.*]], label [[BB0:%.*]], label [[BB1:%.*]]
|
|
; CHECK: bb0:
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
|
|
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[X]])
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[BB3:%.*]], label [[BB2:%.*]]
|
|
; CHECK: bb1:
|
|
; CHECK-NEXT: [[X2:%.*]] = add nuw nsw i32 [[X]], 1
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i32 [[X2]], 2
|
|
; CHECK: [[X2_0:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[X2]])
|
|
; CHECK-NEXT: br i1 [[CMP2]], label [[BB3]], label [[BB2]]
|
|
; CHECK: bb2:
|
|
; CHECK-NEXT: [[X3:%.*]] = phi i32 [ [[X_0]], [[BB0]] ], [ [[X2_0]], [[BB1]] ]
|
|
; CHECK-NEXT: br label [[BB3]]
|
|
; CHECK: bb3:
|
|
; CHECK-NEXT: ret i1 false
|
|
;
|
|
br i1 %y, label %bb0, label %bb1
|
|
bb0:
|
|
%cmp = icmp sge i32 %x, 0 ; x > 0
|
|
br i1 %cmp, label %bb3, label %bb2
|
|
bb1:
|
|
%x2 = add nsw nuw i32 %x, 1
|
|
%cmp2 = icmp sge i32 %x2, 2 ; x+1 > 2 / x > 1
|
|
br i1 %cmp2, label %bb3, label %bb2
|
|
bb2:
|
|
%x3 = phi i32 [ %x, %bb0 ], [ %x2, %bb1 ]
|
|
br label %bb3
|
|
bb3:
|
|
ret i1 0
|
|
}
|
|
|