You've already forked linux-packaging-mono
Imported Upstream version 5.18.0.167
Former-commit-id: 289509151e0fee68a1b591a20c9f109c3c789d3a
This commit is contained in:
parent
e19d552987
commit
b084638f15
@ -1,471 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -print-predicateinfo -analyze < %s 2>&1 | FileCheck %s
|
||||
|
||||
@a = external global i32 ; <i32*> [#uses=7]
|
||||
|
||||
define i32 @test1() nounwind {
|
||||
; CHECK-LABEL: @test1(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* @a, align 4
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 4
|
||||
; CHECK-NEXT: br i1 [[TMP1]], label [[BB:%.*]], label [[BB1:%.*]]
|
||||
; CHECK: bb:
|
||||
; CHECK-NEXT: br label [[BB8:%.*]]
|
||||
; CHECK: bb1:
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* @a, align 4
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 5
|
||||
; CHECK-NEXT: br i1 [[TMP3]], label [[BB2:%.*]], label [[BB3:%.*]]
|
||||
; CHECK: bb2:
|
||||
; CHECK-NEXT: br label [[BB8]]
|
||||
; CHECK: bb3:
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = load i32, i32* @a, align 4
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i32 [[TMP4]], 4
|
||||
; CHECK-NEXT: br i1 [[TMP5]], label [[BB4:%.*]], label [[BB5:%.*]]
|
||||
; CHECK: bb4:
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* @a, align 4
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = add i32 [[TMP6]], 5
|
||||
; CHECK-NEXT: br label [[BB8]]
|
||||
; CHECK: bb5:
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = load i32, i32* @a, align 4
|
||||
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 5
|
||||
; CHECK-NEXT: br i1 [[TMP9]], label [[BB6:%.*]], label [[BB7:%.*]]
|
||||
; CHECK: bb6:
|
||||
; CHECK-NEXT: [[TMP10:%.*]] = load i32, i32* @a, align 4
|
||||
; CHECK-NEXT: [[TMP11:%.*]] = add i32 [[TMP10]], 4
|
||||
; CHECK-NEXT: br label [[BB8]]
|
||||
; CHECK: bb7:
|
||||
; CHECK-NEXT: [[TMP12:%.*]] = load i32, i32* @a, align 4
|
||||
; CHECK-NEXT: br label [[BB8]]
|
||||
; CHECK: bb8:
|
||||
; CHECK-NEXT: [[DOT0:%.*]] = phi i32 [ [[TMP12]], [[BB7]] ], [ [[TMP11]], [[BB6]] ], [ [[TMP7]], [[BB4]] ], [ 4, [[BB2]] ], [ 5, [[BB]] ]
|
||||
; CHECK-NEXT: br label [[RETURN:%.*]]
|
||||
; CHECK: return:
|
||||
; CHECK-NEXT: ret i32 [[DOT0]]
|
||||
;
|
||||
entry:
|
||||
%0 = load i32, i32* @a, align 4
|
||||
%1 = icmp eq i32 %0, 4
|
||||
br i1 %1, label %bb, label %bb1
|
||||
|
||||
bb: ; preds = %entry
|
||||
br label %bb8
|
||||
|
||||
bb1: ; preds = %entry
|
||||
%2 = load i32, i32* @a, align 4
|
||||
%3 = icmp eq i32 %2, 5
|
||||
br i1 %3, label %bb2, label %bb3
|
||||
|
||||
bb2: ; preds = %bb1
|
||||
br label %bb8
|
||||
|
||||
bb3: ; preds = %bb1
|
||||
%4 = load i32, i32* @a, align 4
|
||||
%5 = icmp eq i32 %4, 4
|
||||
br i1 %5, label %bb4, label %bb5
|
||||
|
||||
bb4: ; preds = %bb3
|
||||
%6 = load i32, i32* @a, align 4
|
||||
%7 = add i32 %6, 5
|
||||
br label %bb8
|
||||
|
||||
bb5: ; preds = %bb3
|
||||
%8 = load i32, i32* @a, align 4
|
||||
%9 = icmp eq i32 %8, 5
|
||||
br i1 %9, label %bb6, label %bb7
|
||||
|
||||
bb6: ; preds = %bb5
|
||||
%10 = load i32, i32* @a, align 4
|
||||
%11 = add i32 %10, 4
|
||||
br label %bb8
|
||||
|
||||
bb7: ; preds = %bb5
|
||||
%12 = load i32, i32* @a, align 4
|
||||
br label %bb8
|
||||
|
||||
bb8: ; preds = %bb7, %bb6, %bb4, %bb2, %bb
|
||||
%.0 = phi i32 [ %12, %bb7 ], [ %11, %bb6 ], [ %7, %bb4 ], [ 4, %bb2 ], [ 5, %bb ]
|
||||
br label %return
|
||||
|
||||
return: ; preds = %bb8
|
||||
ret i32 %.0
|
||||
}
|
||||
|
||||
declare void @foo(i1)
|
||||
declare void @bar(i32)
|
||||
|
||||
define void @test3(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: @test3(
|
||||
; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0
|
||||
; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[Z:%.*]] = and i1 [[XZ]], [[YZ]]
|
||||
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK: [[Y_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])
|
||||
; CHECK: [[XZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])
|
||||
; CHECK: [[YZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])
|
||||
; CHECK: [[Z_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])
|
||||
; CHECK-NEXT: br i1 [[Z]], label [[BOTH_ZERO:%.*]], label [[NOPE:%.*]]
|
||||
; CHECK: both_zero:
|
||||
; CHECK-NEXT: call void @foo(i1 [[XZ_0]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[YZ_0]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[X_0]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[Y_0]])
|
||||
; CHECK-NEXT: ret void
|
||||
; CHECK: nope:
|
||||
; CHECK-NEXT: call void @foo(i1 [[Z_0]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%xz = icmp eq i32 %x, 0
|
||||
%yz = icmp eq i32 %y, 0
|
||||
%z = and i1 %xz, %yz
|
||||
br i1 %z, label %both_zero, label %nope
|
||||
both_zero:
|
||||
call void @foo(i1 %xz)
|
||||
call void @foo(i1 %yz)
|
||||
call void @bar(i32 %x)
|
||||
call void @bar(i32 %y)
|
||||
ret void
|
||||
nope:
|
||||
call void @foo(i1 %z)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test4(i1 %b, i32 %x) {
|
||||
; CHECK-LABEL: @test4(
|
||||
; CHECK-NEXT: br i1 [[B:%.*]], label [[SW:%.*]], label [[CASE3:%.*]]
|
||||
; CHECK: sw:
|
||||
; CHECK: i32 0, label [[CASE0:%.*]]
|
||||
; CHECK-NEXT: i32 1, label [[CASE1:%.*]]
|
||||
; CHECK-NEXT: i32 2, label [[CASE0]]
|
||||
; CHECK-NEXT: i32 3, label [[CASE3]]
|
||||
; CHECK-NEXT: i32 4, label [[DEFAULT:%.*]]
|
||||
; CHECK-NEXT: ] Edge: [label [[SW]],label %case1] }
|
||||
; CHECK-NEXT: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X:%.*]])
|
||||
; CHECK-NEXT: switch i32 [[X]], label [[DEFAULT]] [
|
||||
; CHECK-NEXT: i32 0, label [[CASE0]]
|
||||
; CHECK-NEXT: i32 1, label [[CASE1]]
|
||||
; CHECK-NEXT: i32 2, label [[CASE0]]
|
||||
; CHECK-NEXT: i32 3, label [[CASE3]]
|
||||
; CHECK-NEXT: i32 4, label [[DEFAULT]]
|
||||
; CHECK-NEXT: ]
|
||||
; CHECK: default:
|
||||
; CHECK-NEXT: call void @bar(i32 [[X]])
|
||||
; CHECK-NEXT: ret void
|
||||
; CHECK: case0:
|
||||
; CHECK-NEXT: call void @bar(i32 [[X]])
|
||||
; CHECK-NEXT: ret void
|
||||
; CHECK: case1:
|
||||
; CHECK-NEXT: call void @bar(i32 [[X_0]])
|
||||
; CHECK-NEXT: ret void
|
||||
; CHECK: case3:
|
||||
; CHECK-NEXT: call void @bar(i32 [[X]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
br i1 %b, label %sw, label %case3
|
||||
sw:
|
||||
switch i32 %x, label %default [
|
||||
i32 0, label %case0
|
||||
i32 1, label %case1
|
||||
i32 2, label %case0
|
||||
i32 3, label %case3
|
||||
i32 4, label %default
|
||||
]
|
||||
default:
|
||||
call void @bar(i32 %x)
|
||||
ret void
|
||||
case0:
|
||||
call void @bar(i32 %x)
|
||||
ret void
|
||||
case1:
|
||||
call void @bar(i32 %x)
|
||||
ret void
|
||||
case3:
|
||||
call void @bar(i32 %x)
|
||||
ret void
|
||||
}
|
||||
|
||||
define i1 @test5(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: @test5(
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK: [[X_1:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK: [[Y_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])
|
||||
; CHECK: [[Y_1:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]
|
||||
; CHECK: same:
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[X_0]], [[Y_0]]
|
||||
; CHECK-NEXT: ret i1 [[CMP2]]
|
||||
; CHECK: different:
|
||||
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i32 [[X_1]], [[Y_1]]
|
||||
; CHECK-NEXT: ret i1 [[CMP3]]
|
||||
;
|
||||
%cmp = icmp eq i32 %x, %y
|
||||
br i1 %cmp, label %same, label %different
|
||||
|
||||
same:
|
||||
%cmp2 = icmp ne i32 %x, %y
|
||||
ret i1 %cmp2
|
||||
|
||||
different:
|
||||
%cmp3 = icmp eq i32 %x, %y
|
||||
ret i1 %cmp3
|
||||
}
|
||||
|
||||
define i1 @test6(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: @test6(
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], [[Y]]
|
||||
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i32 [[X]], [[Y]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]
|
||||
; CHECK: same:
|
||||
; CHECK-NEXT: ret i1 [[CMP2]]
|
||||
; CHECK: different:
|
||||
; CHECK-NEXT: ret i1 [[CMP3]]
|
||||
;
|
||||
%cmp2 = icmp ne i32 %x, %y
|
||||
%cmp = icmp eq i32 %x, %y
|
||||
%cmp3 = icmp eq i32 %x, %y
|
||||
br i1 %cmp, label %same, label %different
|
||||
|
||||
same:
|
||||
ret i1 %cmp2
|
||||
|
||||
different:
|
||||
ret i1 %cmp3
|
||||
}
|
||||
|
||||
define i1 @test6_fp(float %x, float %y) {
|
||||
; CHECK-LABEL: @test6_fp(
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = fcmp une float [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[X]], [[Y]]
|
||||
; CHECK-NEXT: [[CMP3:%.*]] = fcmp oeq float [[X]], [[Y]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]
|
||||
; CHECK: same:
|
||||
; CHECK-NEXT: ret i1 [[CMP2]]
|
||||
; CHECK: different:
|
||||
; CHECK-NEXT: ret i1 [[CMP3]]
|
||||
;
|
||||
%cmp2 = fcmp une float %x, %y
|
||||
%cmp = fcmp oeq float %x, %y
|
||||
%cmp3 = fcmp oeq float %x, %y
|
||||
br i1 %cmp, label %same, label %different
|
||||
|
||||
same:
|
||||
ret i1 %cmp2
|
||||
|
||||
different:
|
||||
ret i1 %cmp3
|
||||
}
|
||||
|
||||
define i1 @test7(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: @test7(
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK: [[X_1:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK: [[Y_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])
|
||||
; CHECK: [[Y_1:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]
|
||||
; CHECK: same:
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[X_0]], [[Y_0]]
|
||||
; CHECK-NEXT: ret i1 [[CMP2]]
|
||||
; CHECK: different:
|
||||
; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt i32 [[X_1]], [[Y_1]]
|
||||
; CHECK-NEXT: ret i1 [[CMP3]]
|
||||
;
|
||||
%cmp = icmp sgt i32 %x, %y
|
||||
br i1 %cmp, label %same, label %different
|
||||
|
||||
same:
|
||||
%cmp2 = icmp sle i32 %x, %y
|
||||
ret i1 %cmp2
|
||||
|
||||
different:
|
||||
%cmp3 = icmp sgt i32 %x, %y
|
||||
ret i1 %cmp3
|
||||
}
|
||||
|
||||
define i1 @test7_fp(float %x, float %y) {
|
||||
; CHECK-LABEL: @test7_fp(
|
||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK: [[X_0:%.*]] = call float @llvm.ssa.copy.f32(float [[X]])
|
||||
; CHECK: [[X_1:%.*]] = call float @llvm.ssa.copy.f32(float [[X]])
|
||||
; CHECK: [[Y_0:%.*]] = call float @llvm.ssa.copy.f32(float [[Y]])
|
||||
; CHECK: [[Y_1:%.*]] = call float @llvm.ssa.copy.f32(float [[Y]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]
|
||||
; CHECK: same:
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = fcmp ule float [[X_0]], [[Y_0]]
|
||||
; CHECK-NEXT: ret i1 [[CMP2]]
|
||||
; CHECK: different:
|
||||
; CHECK-NEXT: [[CMP3:%.*]] = fcmp ogt float [[X_1]], [[Y_1]]
|
||||
; CHECK-NEXT: ret i1 [[CMP3]]
|
||||
;
|
||||
%cmp = fcmp ogt float %x, %y
|
||||
br i1 %cmp, label %same, label %different
|
||||
|
||||
same:
|
||||
%cmp2 = fcmp ule float %x, %y
|
||||
ret i1 %cmp2
|
||||
|
||||
different:
|
||||
%cmp3 = fcmp ogt float %x, %y
|
||||
ret i1 %cmp3
|
||||
}
|
||||
|
||||
define i1 @test8(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: @test8(
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp sle i32 [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X]], [[Y]]
|
||||
; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt i32 [[X]], [[Y]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]
|
||||
; CHECK: same:
|
||||
; CHECK-NEXT: ret i1 [[CMP2]]
|
||||
; CHECK: different:
|
||||
; CHECK-NEXT: ret i1 [[CMP3]]
|
||||
;
|
||||
%cmp2 = icmp sle i32 %x, %y
|
||||
%cmp = icmp sgt i32 %x, %y
|
||||
%cmp3 = icmp sgt i32 %x, %y
|
||||
br i1 %cmp, label %same, label %different
|
||||
|
||||
same:
|
||||
ret i1 %cmp2
|
||||
|
||||
different:
|
||||
ret i1 %cmp3
|
||||
}
|
||||
|
||||
define i1 @test8_fp(float %x, float %y) {
|
||||
; CHECK-LABEL: @test8_fp(
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = fcmp ule float [[X:%.*]], [[Y:%.*]]
|
||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X]], [[Y]]
|
||||
; CHECK-NEXT: [[CMP3:%.*]] = fcmp ogt float [[X]], [[Y]]
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]
|
||||
; CHECK: same:
|
||||
; CHECK-NEXT: ret i1 [[CMP2]]
|
||||
; CHECK: different:
|
||||
; CHECK-NEXT: ret i1 [[CMP3]]
|
||||
;
|
||||
%cmp2 = fcmp ule float %x, %y
|
||||
%cmp = fcmp ogt float %x, %y
|
||||
%cmp3 = fcmp ogt float %x, %y
|
||||
br i1 %cmp, label %same, label %different
|
||||
|
||||
same:
|
||||
ret i1 %cmp2
|
||||
|
||||
different:
|
||||
ret i1 %cmp3
|
||||
}
|
||||
|
||||
define i32 @test9(i32 %i, i32 %j) {
|
||||
; CHECK-LABEL: @test9(
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[I:%.*]], [[J:%.*]]
|
||||
; CHECK: [[I_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[I]])
|
||||
; CHECK: [[J_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[J]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[RET:%.*]]
|
||||
; CHECK: cond_true:
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub i32 [[I_0]], [[J_0]]
|
||||
; CHECK-NEXT: ret i32 [[DIFF]]
|
||||
; CHECK: ret:
|
||||
; CHECK-NEXT: ret i32 5
|
||||
;
|
||||
%cmp = icmp eq i32 %i, %j
|
||||
br i1 %cmp, label %cond_true, label %ret
|
||||
|
||||
cond_true:
|
||||
%diff = sub i32 %i, %j
|
||||
ret i32 %diff
|
||||
|
||||
ret:
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
define i32 @test10(i32 %j, i32 %i) {
|
||||
; CHECK-LABEL: @test10(
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[I:%.*]], [[J:%.*]]
|
||||
; CHECK: [[J_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[J]])
|
||||
; CHECK: [[I_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[I]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[RET:%.*]]
|
||||
; CHECK: cond_true:
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub i32 [[I_0]], [[J_0]]
|
||||
; CHECK-NEXT: ret i32 [[DIFF]]
|
||||
; CHECK: ret:
|
||||
; CHECK-NEXT: ret i32 5
|
||||
;
|
||||
%cmp = icmp eq i32 %i, %j
|
||||
br i1 %cmp, label %cond_true, label %ret
|
||||
|
||||
cond_true:
|
||||
%diff = sub i32 %i, %j
|
||||
ret i32 %diff
|
||||
|
||||
ret:
|
||||
ret i32 5
|
||||
}
|
||||
|
||||
declare i32 @yogibar()
|
||||
|
||||
define i32 @test11(i32 %x) {
|
||||
; CHECK-LABEL: @test11(
|
||||
; CHECK-NEXT: [[V0:%.*]] = call i32 @yogibar()
|
||||
; CHECK-NEXT: [[V1:%.*]] = call i32 @yogibar()
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V0]], [[V1]]
|
||||
; CHECK: [[V0_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[V0]])
|
||||
; CHECK: [[V1_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[V1]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[NEXT:%.*]]
|
||||
; CHECK: cond_true:
|
||||
; CHECK-NEXT: ret i32 [[V1_0]]
|
||||
; CHECK: next:
|
||||
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[X:%.*]], [[V0_0]]
|
||||
; CHECK: [[V0_0_1:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[V0_0]])
|
||||
; CHECK-NEXT: br i1 [[CMP2]], label [[COND_TRUE2:%.*]], label [[NEXT2:%.*]]
|
||||
; CHECK: cond_true2:
|
||||
; CHECK-NEXT: ret i32 [[V0_0_1]]
|
||||
; CHECK: next2:
|
||||
; CHECK-NEXT: ret i32 0
|
||||
;
|
||||
%v0 = call i32 @yogibar()
|
||||
%v1 = call i32 @yogibar()
|
||||
%cmp = icmp eq i32 %v0, %v1
|
||||
br i1 %cmp, label %cond_true, label %next
|
||||
|
||||
cond_true:
|
||||
ret i32 %v1
|
||||
|
||||
next:
|
||||
%cmp2 = icmp eq i32 %x, %v0
|
||||
br i1 %cmp2, label %cond_true2, label %next2
|
||||
|
||||
cond_true2:
|
||||
ret i32 %v0
|
||||
|
||||
next2:
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
define i32 @test12(i32 %x) {
|
||||
; CHECK-LABEL: @test12(
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0
|
||||
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK: [[X_1:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
||||
; CHECK: cond_true:
|
||||
; CHECK-NEXT: br label [[RET:%.*]]
|
||||
; CHECK: cond_false:
|
||||
; CHECK-NEXT: br label [[RET]]
|
||||
; CHECK: ret:
|
||||
; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[X_0]], [[COND_TRUE]] ], [ [[X_1]], [[COND_FALSE]] ]
|
||||
; CHECK-NEXT: ret i32 [[RES]]
|
||||
;
|
||||
%cmp = icmp eq i32 %x, 0
|
||||
br i1 %cmp, label %cond_true, label %cond_false
|
||||
|
||||
cond_true:
|
||||
br label %ret
|
||||
|
||||
cond_false:
|
||||
br label %ret
|
||||
|
||||
ret:
|
||||
%res = phi i32 [ %x, %cond_true ], [ %x, %cond_false ]
|
||||
ret i32 %res
|
||||
}
|
@ -1,68 +0,0 @@
|
||||
; 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(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(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(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(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
|
||||
}
|
||||
|
@ -1,242 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -print-predicateinfo -analyze < %s 2>&1 | FileCheck %s
|
||||
|
||||
define i32 @f1(i32 %x) {
|
||||
; CHECK-LABEL: @f1(
|
||||
; CHECK-NEXT: bb0:
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0
|
||||
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[BB2:%.*]], label [[BB1:%.*]]
|
||||
; CHECK: bb1:
|
||||
; CHECK-NEXT: br label [[BB2]]
|
||||
; CHECK: bb2:
|
||||
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[X_0]], [[BB0:%.*]] ], [ 0, [[BB1]] ]
|
||||
; CHECK-NEXT: [[FOO:%.*]] = add i32 [[COND]], [[X]]
|
||||
; CHECK-NEXT: ret i32 [[FOO]]
|
||||
;
|
||||
bb0:
|
||||
%cmp = icmp eq i32 %x, 0
|
||||
br i1 %cmp, label %bb2, label %bb1
|
||||
bb1:
|
||||
br label %bb2
|
||||
bb2:
|
||||
%cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
|
||||
%foo = add i32 %cond, %x
|
||||
ret i32 %foo
|
||||
}
|
||||
|
||||
define i32 @f2(i32 %x) {
|
||||
; CHECK-LABEL: @f2(
|
||||
; CHECK-NEXT: bb0:
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X:%.*]], 0
|
||||
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[BB1:%.*]], label [[BB2:%.*]]
|
||||
; CHECK: bb1:
|
||||
; CHECK-NEXT: br label [[BB2]]
|
||||
; CHECK: bb2:
|
||||
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[X_0]], [[BB0:%.*]] ], [ 0, [[BB1]] ]
|
||||
; CHECK-NEXT: [[FOO:%.*]] = add i32 [[COND]], [[X]]
|
||||
; CHECK-NEXT: ret i32 [[FOO]]
|
||||
;
|
||||
bb0:
|
||||
%cmp = icmp ne i32 %x, 0
|
||||
br i1 %cmp, label %bb1, label %bb2
|
||||
bb1:
|
||||
br label %bb2
|
||||
bb2:
|
||||
%cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
|
||||
%foo = add i32 %cond, %x
|
||||
ret i32 %foo
|
||||
}
|
||||
|
||||
define i32 @f3(i32 %x) {
|
||||
; CHECK-LABEL: @f3(
|
||||
; CHECK-NEXT: bb0:
|
||||
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X:%.*]])
|
||||
; CHECK-NEXT: switch i32 [[X]], label [[BB1:%.*]] [
|
||||
; CHECK-NEXT: i32 0, label [[BB2:%.*]]
|
||||
; CHECK-NEXT: ]
|
||||
; CHECK: bb1:
|
||||
; CHECK-NEXT: br label [[BB2]]
|
||||
; CHECK: bb2:
|
||||
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[X_0]], [[BB0:%.*]] ], [ 0, [[BB1]] ]
|
||||
; CHECK-NEXT: [[FOO:%.*]] = add i32 [[COND]], [[X]]
|
||||
; CHECK-NEXT: ret i32 [[FOO]]
|
||||
;
|
||||
bb0:
|
||||
switch i32 %x, label %bb1 [ i32 0, label %bb2]
|
||||
bb1:
|
||||
br label %bb2
|
||||
bb2:
|
||||
%cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
|
||||
%foo = add i32 %cond, %x
|
||||
ret i32 %foo
|
||||
}
|
||||
|
||||
|
||||
define double @fcmp_oeq_not_zero(double %x, double %y) {
|
||||
; CHECK-LABEL: @fcmp_oeq_not_zero(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y:%.*]], 2.000000e+00
|
||||
; CHECK: [[Y_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Y]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[RETURN:%.*]]
|
||||
; CHECK: if:
|
||||
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Y_0]]
|
||||
; CHECK-NEXT: br label [[RETURN]]
|
||||
; CHECK: return:
|
||||
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[IF]] ], [ [[X]], [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: ret double [[RETVAL]]
|
||||
;
|
||||
entry:
|
||||
%cmp = fcmp oeq double %y, 2.0
|
||||
br i1 %cmp, label %if, label %return
|
||||
|
||||
if:
|
||||
%div = fdiv double %x, %y
|
||||
br label %return
|
||||
|
||||
return:
|
||||
%retval = phi double [ %div, %if ], [ %x, %entry ]
|
||||
ret double %retval
|
||||
|
||||
}
|
||||
|
||||
define double @fcmp_une_not_zero(double %x, double %y) {
|
||||
; CHECK-LABEL: @fcmp_une_not_zero(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y:%.*]], 2.000000e+00
|
||||
; CHECK: [[Y_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Y]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[RETURN:%.*]], label [[ELSE:%.*]]
|
||||
; CHECK: else:
|
||||
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Y_0]]
|
||||
; CHECK-NEXT: br label [[RETURN]]
|
||||
; CHECK: return:
|
||||
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[ELSE]] ], [ [[X]], [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: ret double [[RETVAL]]
|
||||
;
|
||||
entry:
|
||||
%cmp = fcmp une double %y, 2.0
|
||||
br i1 %cmp, label %return, label %else
|
||||
|
||||
else:
|
||||
%div = fdiv double %x, %y
|
||||
br label %return
|
||||
|
||||
return:
|
||||
%retval = phi double [ %div, %else ], [ %x, %entry ]
|
||||
ret double %retval
|
||||
|
||||
}
|
||||
|
||||
define double @fcmp_oeq_zero(double %x, double %y) {
|
||||
; CHECK-LABEL: @fcmp_oeq_zero(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y:%.*]], 0.000000e+00
|
||||
; CHECK: [[Y_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Y]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[RETURN:%.*]]
|
||||
; CHECK: if:
|
||||
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Y_0]]
|
||||
; CHECK-NEXT: br label [[RETURN]]
|
||||
; CHECK: return:
|
||||
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[IF]] ], [ [[X]], [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: ret double [[RETVAL]]
|
||||
;
|
||||
entry:
|
||||
%cmp = fcmp oeq double %y, 0.0
|
||||
br i1 %cmp, label %if, label %return
|
||||
|
||||
if:
|
||||
%div = fdiv double %x, %y
|
||||
br label %return
|
||||
|
||||
return:
|
||||
%retval = phi double [ %div, %if ], [ %x, %entry ]
|
||||
ret double %retval
|
||||
|
||||
}
|
||||
|
||||
define double @fcmp_une_zero(double %x, double %y) {
|
||||
; CHECK-LABEL: @fcmp_une_zero(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y:%.*]], -0.000000e+00
|
||||
; CHECK: [[Y_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Y]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[RETURN:%.*]], label [[ELSE:%.*]]
|
||||
; CHECK: else:
|
||||
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Y_0]]
|
||||
; CHECK-NEXT: br label [[RETURN]]
|
||||
; CHECK: return:
|
||||
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[ELSE]] ], [ [[X]], [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: ret double [[RETVAL]]
|
||||
;
|
||||
entry:
|
||||
%cmp = fcmp une double %y, -0.0
|
||||
br i1 %cmp, label %return, label %else
|
||||
|
||||
else:
|
||||
%div = fdiv double %x, %y
|
||||
br label %return
|
||||
|
||||
return:
|
||||
%retval = phi double [ %div, %else ], [ %x, %entry ]
|
||||
ret double %retval
|
||||
|
||||
}
|
||||
|
||||
|
||||
define double @fcmp_oeq_maybe_zero(double %x, double %y, double %z1, double %z2) {
|
||||
; CHECK-LABEL: @fcmp_oeq_maybe_zero(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[Z:%.*]] = fadd double [[Z1:%.*]], [[Z2:%.*]]
|
||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y:%.*]], [[Z]]
|
||||
; CHECK: [[Z_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Z]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[RETURN:%.*]]
|
||||
; CHECK: if:
|
||||
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Z_0]]
|
||||
; CHECK-NEXT: br label [[RETURN]]
|
||||
; CHECK: return:
|
||||
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[IF]] ], [ [[X]], [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: ret double [[RETVAL]]
|
||||
;
|
||||
entry:
|
||||
%z = fadd double %z1, %z2
|
||||
%cmp = fcmp oeq double %y, %z
|
||||
br i1 %cmp, label %if, label %return
|
||||
|
||||
if:
|
||||
%div = fdiv double %x, %z
|
||||
br label %return
|
||||
|
||||
return:
|
||||
%retval = phi double [ %div, %if ], [ %x, %entry ]
|
||||
ret double %retval
|
||||
|
||||
}
|
||||
|
||||
define double @fcmp_une_maybe_zero(double %x, double %y, double %z1, double %z2) {
|
||||
; CHECK-LABEL: @fcmp_une_maybe_zero(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[Z:%.*]] = fadd double [[Z1:%.*]], [[Z2:%.*]]
|
||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y:%.*]], [[Z]]
|
||||
; CHECK: [[Z_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Z]])
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[RETURN:%.*]], label [[ELSE:%.*]]
|
||||
; CHECK: else:
|
||||
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Z_0]]
|
||||
; CHECK-NEXT: br label [[RETURN]]
|
||||
; CHECK: return:
|
||||
; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[ELSE]] ], [ [[X]], [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: ret double [[RETVAL]]
|
||||
;
|
||||
entry:
|
||||
%z = fadd double %z1, %z2
|
||||
%cmp = fcmp une double %y, %z
|
||||
br i1 %cmp, label %return, label %else
|
||||
|
||||
else:
|
||||
%div = fdiv double %x, %z
|
||||
br label %return
|
||||
|
||||
return:
|
||||
%retval = phi double [ %div, %else ], [ %x, %entry ]
|
||||
ret double %retval
|
||||
|
||||
}
|
@ -1,68 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -print-predicateinfo -analyze < %s 2>&1 | FileCheck %s
|
||||
; Don't insert predicate info for conditions with a single target.
|
||||
@a = global i32 1, align 4
|
||||
@d = common global i32 0, align 4
|
||||
@c = common global i32 0, align 4
|
||||
@b = common global i32 0, align 4
|
||||
@e = common global i32 0, align 4
|
||||
|
||||
define i32 @main() {
|
||||
; CHECK-LABEL: @main(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @d, align 4
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 0
|
||||
; CHECK-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP13:%.*]]
|
||||
; CHECK: [[TMP4:%.*]] = load i32, i32* @a, align 4
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* @c, align 4
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = icmp slt i32 [[TMP5]], 1
|
||||
; CHECK-NEXT: br i1 [[TMP6]], label [[TMP7:%.*]], label [[TMP9:%.*]]
|
||||
; CHECK: [[TMP8:%.*]] = icmp eq i32 [[TMP4]], 0
|
||||
; CHECK-NEXT: br i1 [[TMP8]], label [[TMP9]], label [[TMP9]]
|
||||
; CHECK: [[DOT0:%.*]] = phi i32 [ [[TMP4]], [[TMP7]] ], [ [[TMP4]], [[TMP7]] ], [ [[DOT1:%.*]], [[TMP13]] ], [ [[TMP4]], [[TMP3]] ]
|
||||
; CHECK-NEXT: [[TMP10:%.*]] = load i32, i32* @b, align 4
|
||||
; CHECK-NEXT: [[TMP11:%.*]] = sdiv i32 [[TMP10]], [[DOT0]]
|
||||
; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i32 [[TMP11]], 0
|
||||
; CHECK-NEXT: br i1 [[TMP12]], label [[TMP13]], label [[TMP13]]
|
||||
; CHECK: [[DOT1]] = phi i32 [ [[DOT0]], [[TMP9]] ], [ [[DOT0]], [[TMP9]] ], [ undef, [[TMP0:%.*]] ]
|
||||
; CHECK-NEXT: [[TMP14:%.*]] = load i32, i32* @e, align 4
|
||||
; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i32 [[TMP14]], 0
|
||||
; CHECK-NEXT: br i1 [[TMP15]], label [[TMP16:%.*]], label [[TMP9]]
|
||||
; CHECK: ret i32 0
|
||||
;
|
||||
%1 = load i32, i32* @d, align 4
|
||||
%2 = icmp eq i32 %1, 0
|
||||
br i1 %2, label %3, label %13
|
||||
|
||||
; <label>:3: ; preds = %0
|
||||
%4 = load i32, i32* @a, align 4
|
||||
%5 = load i32, i32* @c, align 4
|
||||
%6 = icmp slt i32 %5, 1
|
||||
br i1 %6, label %7, label %9
|
||||
|
||||
; <label>:7: ; preds = %3
|
||||
%8 = icmp eq i32 %4, 0
|
||||
br i1 %8, label %9, label %9
|
||||
|
||||
; <label>:9: ; preds = %13, %7, %7, %3
|
||||
%.0 = phi i32 [ %4, %7 ], [ %4, %7 ], [ %.1, %13 ], [ %4, %3 ]
|
||||
%10 = load i32, i32* @b, align 4
|
||||
%11 = sdiv i32 %10, %.0
|
||||
%12 = icmp eq i32 %11, 0
|
||||
br i1 %12, label %13, label %13
|
||||
|
||||
; <label>:13: ; preds = %9, %9, %0
|
||||
%.1 = phi i32 [ %.0, %9 ], [ %.0, %9 ], [ undef, %0 ]
|
||||
%14 = load i32, i32* @e, align 4
|
||||
%15 = icmp eq i32 %14, 0
|
||||
br i1 %15, label %16, label %9
|
||||
|
||||
; <label>:16: ; preds = %13
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
; Function Attrs: argmemonly nounwind
|
||||
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
|
||||
|
||||
; Function Attrs: argmemonly nounwind
|
||||
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
|
||||
|
@ -1,93 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -print-predicateinfo -analyze < %s 2>&1 | FileCheck %s
|
||||
; Don't insert predicate info for conditions with a single target.
|
||||
@a = global i32 6, align 4
|
||||
@c = global i32 -1, align 4
|
||||
@e = common global i32 0, align 4
|
||||
@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
|
||||
@d = common global i32 0, align 4
|
||||
@b = common global [6 x i32] zeroinitializer, align 16
|
||||
|
||||
; Function Attrs: nounwind ssp uwtable
|
||||
define i32 @main() {
|
||||
; CHECK-LABEL: @main(
|
||||
; CHECK-NEXT: store i32 6, i32* @e, align 4
|
||||
; CHECK-NEXT: br label [[TMP1:%.*]]
|
||||
; CHECK: [[TMP2:%.*]] = load i32, i32* @d, align 4
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = sext i32 [[TMP2]] to i64
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [6 x i32], [6 x i32]* @b, i64 0, i64 [[TMP3]]
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* [[TMP4]], align 4
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 [[TMP5]])
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = load i32, i32* @a, align 4
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0
|
||||
; CHECK-NEXT: br i1 [[TMP8]], label %thread-pre-split, label [[TMP9:%.*]]
|
||||
; CHECK: [[TMP10:%.*]] = load i32, i32* @e, align 4
|
||||
; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i32 [[TMP10]], 0
|
||||
; CHECK-NEXT: br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP12]]
|
||||
; CHECK: thread-pre-split:
|
||||
; CHECK-NEXT: [[DOTPR:%.*]] = load i32, i32* @e, align 4
|
||||
; CHECK-NEXT: br label [[TMP12]]
|
||||
; CHECK: [[TMP13:%.*]] = phi i32 [ [[DOTPR]], %thread-pre-split ], [ [[TMP10]], [[TMP9]] ], [ [[TMP10]], [[TMP9]] ]
|
||||
; CHECK-NEXT: [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0
|
||||
; CHECK-NEXT: br i1 [[TMP14]], label [[TMP15:%.*]], label [[TMP15]]
|
||||
; CHECK: br i1 [[TMP14]], label [[TMP16:%.*]], label [[TMP17:%.*]]
|
||||
; CHECK: br label [[TMP17]]
|
||||
; CHECK: [[DOT0:%.*]] = phi i32 [ 1, [[TMP16]] ], [ -1, [[TMP15]] ]
|
||||
; CHECK-NEXT: [[TMP18:%.*]] = and i32 [[DOT0]], 8693
|
||||
; CHECK-NEXT: [[TMP19:%.*]] = load i32, i32* @c, align 4
|
||||
; CHECK-NEXT: [[TMP20:%.*]] = xor i32 [[TMP18]], [[TMP19]]
|
||||
; CHECK-NEXT: [[TMP21:%.*]] = xor i32 [[TMP20]], -1
|
||||
; CHECK-NEXT: store i32 [[TMP21]], i32* @d, align 4
|
||||
; CHECK-NEXT: [[TMP22:%.*]] = icmp slt i32 [[TMP20]], -2
|
||||
; CHECK-NEXT: br i1 [[TMP22]], label [[TMP1]], label [[TMP23:%.*]]
|
||||
; CHECK: ret i32 0
|
||||
;
|
||||
store i32 6, i32* @e, align 4
|
||||
br label %1
|
||||
|
||||
; <label>:1: ; preds = %17, %0
|
||||
%2 = load i32, i32* @d, align 4
|
||||
%3 = sext i32 %2 to i64
|
||||
%4 = getelementptr inbounds [6 x i32], [6 x i32]* @b, i64 0, i64 %3
|
||||
%5 = load i32, i32* %4, align 4
|
||||
%6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %5) #2
|
||||
%7 = load i32, i32* @a, align 4
|
||||
%8 = icmp eq i32 %7, 0
|
||||
br i1 %8, label %thread-pre-split, label %9
|
||||
|
||||
; <label>:9: ; preds = %1
|
||||
%10 = load i32, i32* @e, align 4
|
||||
%11 = icmp eq i32 %10, 0
|
||||
br i1 %11, label %12, label %12
|
||||
|
||||
thread-pre-split: ; preds = %1
|
||||
%.pr = load i32, i32* @e, align 4
|
||||
br label %12
|
||||
|
||||
; <label>:12: ; preds = %thread-pre-split, %9, %9
|
||||
%13 = phi i32 [ %.pr, %thread-pre-split ], [ %10, %9 ], [ %10, %9 ]
|
||||
%14 = icmp ne i32 %13, 0
|
||||
br i1 %14, label %15, label %15
|
||||
|
||||
; <label>:15: ; preds = %12, %12
|
||||
br i1 %14, label %16, label %17
|
||||
|
||||
; <label>:16: ; preds = %15
|
||||
br label %17
|
||||
|
||||
; <label>:17: ; preds = %16, %15
|
||||
%.0 = phi i32 [ 1, %16 ], [ -1, %15 ]
|
||||
%18 = and i32 %.0, 8693
|
||||
%19 = load i32, i32* @c, align 4
|
||||
%20 = xor i32 %18, %19
|
||||
%21 = xor i32 %20, -1
|
||||
store i32 %21, i32* @d, align 4
|
||||
%22 = icmp slt i32 %20, -2
|
||||
br i1 %22, label %1, label %23
|
||||
|
||||
; <label>:23: ; preds = %17
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @printf(i8*, ...)
|
||||
|
@ -1,211 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -print-predicateinfo < %s 2>&1 | FileCheck %s
|
||||
|
||||
declare void @foo(i1)
|
||||
declare void @bar(i32)
|
||||
declare void @llvm.assume(i1)
|
||||
|
||||
define void @testor(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: @testor(
|
||||
; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0
|
||||
; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[Z:%.*]] = or i1 [[XZ]], [[YZ]]
|
||||
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK: [[Y_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])
|
||||
; CHECK: [[XZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])
|
||||
; CHECK: [[YZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])
|
||||
; CHECK: [[Z_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])
|
||||
; CHECK-NEXT: br i1 [[Z]], label [[ONEOF:%.*]], label [[NEITHER:%.*]]
|
||||
; CHECK: oneof:
|
||||
; CHECK-NEXT: call void @foo(i1 [[XZ]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[YZ]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[X]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[Y]])
|
||||
; CHECK-NEXT: ret void
|
||||
; CHECK: neither:
|
||||
; CHECK-NEXT: call void @foo(i1 [[XZ_0]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[YZ_0]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[X_0]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[Y_0]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[Z_0]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%xz = icmp eq i32 %x, 0
|
||||
%yz = icmp eq i32 %y, 0
|
||||
%z = or i1 %xz, %yz
|
||||
br i1 %z, label %oneof, label %neither
|
||||
oneof:
|
||||
;; Should not insert on the true edge for or
|
||||
call void @foo(i1 %xz)
|
||||
call void @foo(i1 %yz)
|
||||
call void @bar(i32 %x)
|
||||
call void @bar(i32 %y)
|
||||
ret void
|
||||
neither:
|
||||
call void @foo(i1 %xz)
|
||||
call void @foo(i1 %yz)
|
||||
call void @bar(i32 %x)
|
||||
call void @bar(i32 %y)
|
||||
call void @foo(i1 %z)
|
||||
ret void
|
||||
}
|
||||
define void @testand(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: @testand(
|
||||
; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0
|
||||
; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[Z:%.*]] = and i1 [[XZ]], [[YZ]]
|
||||
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK: [[Y_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])
|
||||
; CHECK: [[XZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])
|
||||
; CHECK: [[YZ_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])
|
||||
; CHECK: [[Z_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])
|
||||
; CHECK-NEXT: br i1 [[Z]], label [[BOTH:%.*]], label [[NOPE:%.*]]
|
||||
; CHECK: both:
|
||||
; CHECK-NEXT: call void @foo(i1 [[XZ_0]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[YZ_0]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[X_0]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[Y_0]])
|
||||
; CHECK-NEXT: ret void
|
||||
; CHECK: nope:
|
||||
; CHECK-NEXT: call void @foo(i1 [[XZ]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[YZ]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[X]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[Y]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[Z_0]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%xz = icmp eq i32 %x, 0
|
||||
%yz = icmp eq i32 %y, 0
|
||||
%z = and i1 %xz, %yz
|
||||
br i1 %z, label %both, label %nope
|
||||
both:
|
||||
call void @foo(i1 %xz)
|
||||
call void @foo(i1 %yz)
|
||||
call void @bar(i32 %x)
|
||||
call void @bar(i32 %y)
|
||||
ret void
|
||||
nope:
|
||||
;; Should not insert on the false edge for and
|
||||
call void @foo(i1 %xz)
|
||||
call void @foo(i1 %yz)
|
||||
call void @bar(i32 %x)
|
||||
call void @bar(i32 %y)
|
||||
call void @foo(i1 %z)
|
||||
ret void
|
||||
}
|
||||
define void @testandsame(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: @testandsame(
|
||||
; CHECK-NEXT: [[XGT:%.*]] = icmp sgt i32 [[X:%.*]], 0
|
||||
; CHECK-NEXT: [[XLT:%.*]] = icmp slt i32 [[X]], 100
|
||||
; CHECK-NEXT: [[Z:%.*]] = and i1 [[XGT]], [[XLT]]
|
||||
; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK: [[X_0_1:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X_0]])
|
||||
; CHECK: [[XGT_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XGT]])
|
||||
; CHECK: [[XLT_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XLT]])
|
||||
; CHECK: [[Z_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])
|
||||
; CHECK-NEXT: br i1 [[Z]], label [[BOTH:%.*]], label [[NOPE:%.*]]
|
||||
; CHECK: both:
|
||||
; CHECK-NEXT: call void @foo(i1 [[XGT_0]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[XLT_0]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[X_0_1]])
|
||||
; CHECK-NEXT: ret void
|
||||
; CHECK: nope:
|
||||
; CHECK-NEXT: call void @foo(i1 [[XGT]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[XLT]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[Z_0]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%xgt = icmp sgt i32 %x, 0
|
||||
%xlt = icmp slt i32 %x, 100
|
||||
%z = and i1 %xgt, %xlt
|
||||
br i1 %z, label %both, label %nope
|
||||
both:
|
||||
call void @foo(i1 %xgt)
|
||||
call void @foo(i1 %xlt)
|
||||
call void @bar(i32 %x)
|
||||
ret void
|
||||
nope:
|
||||
call void @foo(i1 %xgt)
|
||||
call void @foo(i1 %xlt)
|
||||
call void @foo(i1 %z)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @testandassume(i32 %x, i32 %y) {
|
||||
; CHECK-LABEL: @testandassume(
|
||||
; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0
|
||||
; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[Z:%.*]] = and i1 [[XZ]], [[YZ]]
|
||||
; CHECK: [[TMP1:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]])
|
||||
; CHECK: [[TMP2:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[Y]])
|
||||
; CHECK: [[TMP3:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[XZ]])
|
||||
; CHECK: [[TMP4:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[YZ]])
|
||||
; CHECK: [[TMP5:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP5]])
|
||||
; CHECK: [[DOT0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[TMP1]])
|
||||
; CHECK: [[DOT01:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[TMP2]])
|
||||
; CHECK: [[DOT02:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[TMP3]])
|
||||
; CHECK: [[DOT03:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[TMP4]])
|
||||
; CHECK: [[DOT04:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[TMP5]])
|
||||
; CHECK-NEXT: br i1 [[TMP5]], label [[BOTH:%.*]], label [[NOPE:%.*]]
|
||||
; CHECK: both:
|
||||
; CHECK-NEXT: call void @foo(i1 [[DOT02]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[DOT03]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[DOT0]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[DOT01]])
|
||||
; CHECK-NEXT: ret void
|
||||
; CHECK: nope:
|
||||
; CHECK-NEXT: call void @foo(i1 [[DOT04]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%xz = icmp eq i32 %x, 0
|
||||
%yz = icmp eq i32 %y, 0
|
||||
%z = and i1 %xz, %yz
|
||||
call void @llvm.assume(i1 %z)
|
||||
br i1 %z, label %both, label %nope
|
||||
both:
|
||||
call void @foo(i1 %xz)
|
||||
call void @foo(i1 %yz)
|
||||
call void @bar(i32 %x)
|
||||
call void @bar(i32 %y)
|
||||
ret void
|
||||
nope:
|
||||
call void @foo(i1 %z)
|
||||
ret void
|
||||
}
|
||||
|
||||
;; Unlike and/or for branches, assume is *always* true, so we only match and for it
|
||||
define void @testorassume(i32 %x, i32 %y) {
|
||||
;
|
||||
; CHECK-LABEL: @testorassume(
|
||||
; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0
|
||||
; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0
|
||||
; CHECK-NEXT: [[Z:%.*]] = or i1 [[XZ]], [[YZ]]
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 [[Z]])
|
||||
; CHECK: [[Z_0:%.*]] = call i1 @llvm.ssa.copy.i1(i1 [[Z]])
|
||||
; CHECK-NEXT: br i1 [[Z]], label [[BOTH:%.*]], label [[NOPE:%.*]]
|
||||
; CHECK: both:
|
||||
; CHECK-NEXT: call void @foo(i1 [[XZ]])
|
||||
; CHECK-NEXT: call void @foo(i1 [[YZ]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[X]])
|
||||
; CHECK-NEXT: call void @bar(i32 [[Y]])
|
||||
; CHECK-NEXT: ret void
|
||||
; CHECK: nope:
|
||||
; CHECK-NEXT: call void @foo(i1 [[Z_0]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%xz = icmp eq i32 %x, 0
|
||||
%yz = icmp eq i32 %y, 0
|
||||
%z = or i1 %xz, %yz
|
||||
call void @llvm.assume(i1 %z)
|
||||
br i1 %z, label %both, label %nope
|
||||
both:
|
||||
call void @foo(i1 %xz)
|
||||
call void @foo(i1 %yz)
|
||||
call void @bar(i32 %x)
|
||||
call void @bar(i32 %y)
|
||||
ret void
|
||||
nope:
|
||||
call void @foo(i1 %z)
|
||||
ret void
|
||||
}
|
@ -1,66 +0,0 @@
|
||||
; RUN: opt -run-twice -verify -disable-debug-info-type-map -S -o - %s | FileCheck %s
|
||||
|
||||
; Generated using:
|
||||
; $ cat p.cpp
|
||||
; void sink(void *);
|
||||
; class A {
|
||||
; public:
|
||||
; template <typename> void m_fn2() { static int a; }
|
||||
; virtual void m_fn1();
|
||||
; };
|
||||
; void foo() {
|
||||
; class B : public A {
|
||||
; public:
|
||||
; B() { m_fn2<B>(); }
|
||||
; };
|
||||
; sink(new B);
|
||||
; }
|
||||
; $ clang++ -target x86_64-unknown-linux -fvisibility=hidden -O2 -g2 -flto -S p.cpp -o p.ll
|
||||
; # then manually removed function/gv definitions
|
||||
|
||||
; Test that when the module is cloned it does not contain a reference to
|
||||
; the original DICompileUnit as a result of a collision between the cloned
|
||||
; DISubprogram for m_fn2<B> (which refers to the non-ODR entity B via
|
||||
; template parameters) and the original DISubprogram.
|
||||
|
||||
; CHECK: DICompileUnit
|
||||
; CHECK-NOT: DICompileUnit
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux"
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.module.flags = !{!28, !29}
|
||||
!llvm.ident = !{!30}
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 5.0.0 ", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3)
|
||||
!1 = !DIFile(filename: "p.cpp", directory: "/usr/local/google/home/pcc/b682773-2-repro/small2")
|
||||
!2 = !{}
|
||||
!3 = !{!4}
|
||||
!4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression())
|
||||
!5 = distinct !DIGlobalVariable(name: "a", scope: !6, file: !1, line: 5, type: !27, isLocal: true, isDefinition: true)
|
||||
!6 = distinct !DISubprogram(name: "m_fn2<B>", linkageName: "_ZN1A5m_fn2IZ3foovE1BEEvv", scope: !7, file: !1, line: 5, type: !8, isLocal: true, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, templateParams: !11, declaration: !23, variables: !24)
|
||||
!7 = !DICompositeType(tag: DW_TAG_class_type, name: "A", file: !1, line: 3, flags: DIFlagFwdDecl, identifier: "_ZTS1A")
|
||||
!8 = !DISubroutineType(types: !9)
|
||||
!9 = !{null, !10}
|
||||
!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
|
||||
!11 = !{!12}
|
||||
!12 = !DITemplateTypeParameter(type: !13)
|
||||
!13 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "B", scope: !14, file: !1, line: 10, size: 64, elements: !17, vtableHolder: !7)
|
||||
!14 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !1, file: !1, line: 9, type: !15, isLocal: false, isDefinition: true, scopeLine: 9, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !2)
|
||||
!15 = !DISubroutineType(types: !16)
|
||||
!16 = !{null}
|
||||
!17 = !{!18, !19}
|
||||
!18 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !13, baseType: !7, flags: DIFlagPublic)
|
||||
!19 = !DISubprogram(name: "B", scope: !13, file: !1, line: 12, type: !20, isLocal: false, isDefinition: false, scopeLine: 12, flags: DIFlagPublic | DIFlagPrototyped, isOptimized: true)
|
||||
!20 = !DISubroutineType(types: !21)
|
||||
!21 = !{null, !22}
|
||||
!22 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !13, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
|
||||
!23 = !DISubprogram(name: "m_fn2<B>", linkageName: "_ZN1A5m_fn2IZ3foovE1BEEvv", scope: !7, file: !1, line: 5, type: !8, isLocal: false, isDefinition: false, scopeLine: 5, flags: DIFlagPublic | DIFlagPrototyped, isOptimized: true, templateParams: !11)
|
||||
!24 = !{!25}
|
||||
!25 = !DILocalVariable(name: "this", arg: 1, scope: !6, type: !26, flags: DIFlagArtificial | DIFlagObjectPointer)
|
||||
!26 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64)
|
||||
!27 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
!28 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!29 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!30 = !{!"clang version 5.0.0 "}
|
@ -1,24 +0,0 @@
|
||||
; RUN: opt < %s -S -basicaa -memcpyopt | FileCheck %s
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
define void @test(i8* noalias dereferenceable(1) %in, i8* noalias dereferenceable(1) %out) {
|
||||
%tmp = alloca i8
|
||||
%tmp2 = alloca i8
|
||||
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %out, i8* %in, i64 1, i32 8, i1 false)
|
||||
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp, i8* %in, i64 1, i32 8, i1 false), !alias.scope !4
|
||||
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp2, i8* %tmp, i64 1, i32 8, i1 false), !alias.scope !5
|
||||
|
||||
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %out, i8* %tmp2, i64 1, i32 8, i1 false), !noalias !6
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i32, i1)
|
||||
|
||||
!0 = !{!0}
|
||||
!1 = distinct !{!1, !0, !"in"}
|
||||
!2 = distinct !{!2, !0, !"tmp"}
|
||||
!3 = distinct !{!3, !0, !"tmp2"}
|
||||
!4 = distinct !{!1, !2}
|
||||
!5 = distinct !{!2, !3}
|
||||
!6 = distinct !{!1, !2}
|
26
external/llvm/test/Transforms/Util/flattencfg.ll
vendored
26
external/llvm/test/Transforms/Util/flattencfg.ll
vendored
@ -1,26 +0,0 @@
|
||||
; RUN: opt -flattencfg -S < %s | FileCheck %s
|
||||
|
||||
|
||||
; This test checks whether the pass completes without a crash.
|
||||
; The code is not transformed in any way
|
||||
;
|
||||
; CHECK-LABEL: @test_not_crash
|
||||
define void @test_not_crash(i32 %in_a) #0 {
|
||||
entry:
|
||||
%cmp0 = icmp eq i32 %in_a, -1
|
||||
%cmp1 = icmp ne i32 %in_a, 0
|
||||
%cond0 = and i1 %cmp0, %cmp1
|
||||
br i1 %cond0, label %b0, label %b1
|
||||
|
||||
b0: ; preds = %entry
|
||||
%cmp2 = icmp eq i32 %in_a, 0
|
||||
%cmp3 = icmp ne i32 %in_a, 1
|
||||
%cond1 = or i1 %cmp2, %cmp3
|
||||
br i1 %cond1, label %exit, label %b1
|
||||
|
||||
b1: ; preds = %entry, %b0
|
||||
br label %exit
|
||||
|
||||
exit: ; preds = %entry, %b0, %b1
|
||||
ret void
|
||||
}
|
@ -1,60 +0,0 @@
|
||||
; RUN: opt -S -instcombine -o - %s | FileCheck %s
|
||||
|
||||
; Test that fast math lib call simplification of double math function to float
|
||||
; equivalent doesn't occur when the calling function matches the float
|
||||
; equivalent math function. Otherwise this can cause the generation of infinite
|
||||
; loops when compiled with -O2/3 and fast math.
|
||||
|
||||
; Test case C source:
|
||||
;
|
||||
; extern double exp(double x);
|
||||
; inline float expf(float x) { return (float) exp((double) x); }
|
||||
; float fn(float f) { return expf(f); }
|
||||
;
|
||||
; IR generated with command:
|
||||
;
|
||||
; clang -cc1 -O2 -ffast-math -emit-llvm -disable-llvm-passes -triple x86_64-unknown-unknown -o - <srcfile>
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-unknown"
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define float @fn(float %f) #0 {
|
||||
; CHECK: define float @fn(
|
||||
; CHECK: call fast float @expf(
|
||||
%f.addr = alloca float, align 4
|
||||
store float %f, float* %f.addr, align 4, !tbaa !1
|
||||
%1 = load float, float* %f.addr, align 4, !tbaa !1
|
||||
%call = call fast float @expf(float %1) #3
|
||||
ret float %call
|
||||
}
|
||||
|
||||
; Function Attrs: inlinehint nounwind readnone
|
||||
define available_externally float @expf(float %x) #1 {
|
||||
; CHECK: define available_externally float @expf(
|
||||
; CHECK: fpext float
|
||||
; CHECK: call fast double @exp(
|
||||
; CHECK: fptrunc double
|
||||
%x.addr = alloca float, align 4
|
||||
store float %x, float* %x.addr, align 4, !tbaa !1
|
||||
%1 = load float, float* %x.addr, align 4, !tbaa !1
|
||||
%conv = fpext float %1 to double
|
||||
%call = call fast double @exp(double %conv) #3
|
||||
%conv1 = fptrunc double %call to float
|
||||
ret float %conv1
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind readnone
|
||||
declare double @exp(double) #2
|
||||
|
||||
attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||
attributes #1 = { inlinehint nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||
attributes #2 = { nounwind readnone }
|
||||
|
||||
!llvm.ident = !{!0}
|
||||
|
||||
!0 = !{!"clang version 5.0.0"}
|
||||
!1 = !{!2, !2, i64 0}
|
||||
!2 = !{!"float", !3, i64 0}
|
||||
!3 = !{!"omnipotent char", !4, i64 0}
|
||||
!4 = !{!"Simple C/C++ TBAA"}
|
@ -1,57 +0,0 @@
|
||||
; RUN: opt < %s -instcombine -o /dev/null -pass-remarks-output=%t -S \
|
||||
; RUN: -pass-remarks=instcombine 2>&1 | FileCheck %s
|
||||
; RUN: cat %t | FileCheck -check-prefix=YAML %s
|
||||
; RUN: opt < %s -passes='require<opt-remark-emit>,instcombine' -o /dev/null \
|
||||
; RUN: -pass-remarks-output=%t -S -pass-remarks=instcombine 2>&1 | FileCheck %s
|
||||
; RUN: cat %t | FileCheck -check-prefix=YAML %s
|
||||
|
||||
; CHECK: remark: libcalls-opt-remarks.c:10:10: folded strlen(select) to select of constants{{$}}
|
||||
; CHECK-NOT: remark:
|
||||
|
||||
; YAML: --- !Passed
|
||||
; YAML-NEXT: Pass: instcombine
|
||||
; YAML-NEXT: Name: simplify-libcalls
|
||||
; YAML-NEXT: DebugLoc: { File: libcalls-opt-remarks.c, Line: 10, Column: 10 }
|
||||
; YAML-NEXT: Function: f1
|
||||
; YAML-NEXT: Args:
|
||||
; YAML-NEXT: - String: 'folded strlen(select) to select of constants'
|
||||
; YAML-NEXT: ...
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
|
||||
declare i32 @strlen(i8*)
|
||||
|
||||
@hello = constant [6 x i8] c"hello\00"
|
||||
@longer = constant [7 x i8] c"longer\00"
|
||||
|
||||
define i32 @f1(i1) !dbg !7 {
|
||||
%hello = getelementptr [6 x i8], [6 x i8]* @hello, i32 0, i32 0, !dbg !10
|
||||
%longer = getelementptr [7 x i8], [7 x i8]* @longer, i32 0, i32 0, !dbg !12
|
||||
%2 = select i1 %0, i8* %hello, i8* %longer, !dbg !9
|
||||
%3 = call i32 @strlen(i8* %2), !dbg !14
|
||||
ret i32 %3, !dbg !16
|
||||
}
|
||||
|
||||
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.module.flags = !{!3, !4, !5}
|
||||
!llvm.ident = !{!6}
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "Apple LLVM version 8.1.0 (clang-802.0.42)", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2)
|
||||
!1 = !DIFile(filename: "libcalls-opt-remarks.c", directory: "/tmp")
|
||||
!2 = !{}
|
||||
!3 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!5 = !{i32 1, !"PIC Level", i32 2}
|
||||
!6 = !{!"Apple LLVM version 8.1.0 (clang-802.0.42)"}
|
||||
!7 = distinct !DISubprogram(name: "f1", scope: !1, file: !1, line: 9, type: !8, isLocal: false, isDefinition: true, scopeLine: 9, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !2)
|
||||
!8 = !DISubroutineType(types: !2)
|
||||
!9 = !DILocation(line: 10, column: 17, scope: !7)
|
||||
!10 = !DILocation(line: 10, column: 24, scope: !11)
|
||||
!11 = !DILexicalBlockFile(scope: !7, file: !1, discriminator: 1)
|
||||
!12 = !DILocation(line: 10, column: 32, scope: !13)
|
||||
!13 = !DILexicalBlockFile(scope: !7, file: !1, discriminator: 2)
|
||||
!14 = !DILocation(line: 10, column: 10, scope: !15)
|
||||
!15 = !DILexicalBlockFile(scope: !7, file: !1, discriminator: 3)
|
||||
!16 = !DILocation(line: 10, column: 3, scope: !15)
|
@ -1,241 +0,0 @@
|
||||
; RUN: opt < %s -libcalls-shrinkwrap -S | FileCheck %s
|
||||
; New PM
|
||||
; RUN: opt < %s -passes=libcalls-shrinkwrap -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 void @test_range_error(double %value) {
|
||||
entry:
|
||||
%call_0 = call double @cosh(double %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -7.100000e+02
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 7.100000e+02
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT:[0-9]+]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_0 = call double @cosh(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_1 = call double @exp(double %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -7.450000e+02
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 7.090000e+02
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_1 = call double @exp(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_3 = call double @exp2(double %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -1.074000e+03
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 1.023000e+03
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_3 = call double @exp2(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_4 = call double @sinh(double %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt double %value, -7.100000e+02
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt double %value, 7.100000e+02
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_4 = call double @sinh(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_5 = call double @expm1(double %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ogt double %value, 7.090000e+02
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_5 = call double @expm1(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
declare double @cosh(double)
|
||||
declare double @exp(double)
|
||||
declare double @exp2(double)
|
||||
declare double @sinh(double)
|
||||
declare double @expm1(double)
|
||||
|
||||
define void @test_domain_error(double %value) {
|
||||
entry:
|
||||
%call_00 = call double @acos(double %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %value, 1.000000e+00
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp olt double %value, -1.000000e+00
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_00 = call double @acos(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_01 = call double @asin(double %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %value, 1.000000e+00
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp olt double %value, -1.000000e+00
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_01 = call double @asin(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_02 = call double @cos(double %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp oeq double %value, 0xFFF0000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp oeq double %value, 0x7FF0000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_02 = call double @cos(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_03 = call double @sin(double %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp oeq double %value, 0xFFF0000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp oeq double %value, 0x7FF0000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_03 = call double @sin(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_04 = call double @acosh(double %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp olt double %value, 1.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_04 = call double @acosh(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_05 = call double @sqrt(double %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp olt double %value, 0.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_05 = call double @sqrt(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_06 = call double @atanh(double %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp oge double %value, 1.000000e+00
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %value, -1.000000e+00
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_06 = call double @atanh(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_07 = call double @log(double %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_07 = call double @log(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_08 = call double @log10(double %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_08 = call double @log10(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_09 = call double @log2(double %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_09 = call double @log2(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_10 = call double @logb(double %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, 0.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_10 = call double @logb(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_11 = call double @log1p(double %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole double %value, -1.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_11 = call double @log1p(double %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
declare double @acos(double)
|
||||
declare double @asin(double)
|
||||
declare double @cos(double)
|
||||
declare double @sin(double)
|
||||
declare double @acosh(double)
|
||||
declare double @sqrt(double)
|
||||
declare double @atanh(double)
|
||||
declare double @log(double)
|
||||
declare double @log10(double)
|
||||
declare double @log2(double)
|
||||
declare double @logb(double)
|
||||
declare double @log1p(double)
|
||||
|
||||
define void @test_pow(i32 %int_val, double %exp) {
|
||||
%call = call double @pow(double 2.500000e+00, double %exp)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ogt double %exp, 1.270000e+02
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call = call double @pow(double 2.500000e+00, double %exp)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%conv = sitofp i32 %int_val to double
|
||||
%call1 = call double @pow(double %conv, double %exp)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %exp, 3.200000e+01
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %conv, 0.000000e+00
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call1 = call double @pow(double %conv, double %exp)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%conv2 = trunc i32 %int_val to i8
|
||||
%conv3 = uitofp i8 %conv2 to double
|
||||
%call4 = call double @pow(double %conv3, double %exp)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %exp, 1.280000e+02
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %conv3, 0.000000e+00
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call4 = call double @pow(double %conv3, double %exp)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
|
||||
%conv5 = trunc i32 %int_val to i16
|
||||
%conv6 = uitofp i16 %conv5 to double
|
||||
%call7 = call double @pow(double %conv6, double %exp)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp ogt double %exp, 6.400000e+01
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ole double %conv6, 0.000000e+00
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call7 = call double @pow(double %conv6, double %exp)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
declare double @pow(double, double)
|
||||
|
||||
; CHECK: ![[BRANCH_WEIGHT]] = !{!"branch_weights", i32 1, i32 2000}
|
@ -1,191 +0,0 @@
|
||||
; RUN: opt < %s -libcalls-shrinkwrap -S | FileCheck %s
|
||||
; New PM
|
||||
; RUN: opt < %s -passes=libcalls-shrinkwrap -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 void @test_range_error(float %value) {
|
||||
entry:
|
||||
%call_0 = call float @coshf(float %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt float %value, -8.900000e+01
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt float %value, 8.900000e+01
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT:[0-9]+]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_0 = call float @coshf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_1 = call float @expf(float %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt float %value, -1.030000e+02
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt float %value, 8.800000e+01
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_1 = call float @expf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_3 = call float @exp2f(float %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt float %value, -1.490000e+02
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt float %value, 1.270000e+02
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_3 = call float @exp2f(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_4 = call float @sinhf(float %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt float %value, -8.900000e+01
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt float %value, 8.900000e+01
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_4 = call float @sinhf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_5 = call float @expm1f(float %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ogt float %value, 8.800000e+01
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_5 = call float @expm1f(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
declare float @coshf(float)
|
||||
declare float @expf(float)
|
||||
declare float @exp2f(float)
|
||||
declare float @sinhf(float)
|
||||
declare float @expm1f(float)
|
||||
|
||||
define void @test_domain_error(float %value) {
|
||||
entry:
|
||||
|
||||
%call_00 = call float @acosf(float %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp ogt float %value, 1.000000e+00
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp olt float %value, -1.000000e+00
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_00 = call float @acosf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_01 = call float @asinf(float %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp ogt float %value, 1.000000e+00
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp olt float %value, -1.000000e+00
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_01 = call float @asinf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_02 = call float @cosf(float %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp oeq float %value, 0xFFF0000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp oeq float %value, 0x7FF0000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_02 = call float @cosf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_03 = call float @sinf(float %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp oeq float %value, 0xFFF0000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp oeq float %value, 0x7FF0000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_03 = call float @sinf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_04 = call float @acoshf(float %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp olt float %value, 1.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_04 = call float @acoshf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_05 = call float @sqrtf(float %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp olt float %value, 0.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_05 = call float @sqrtf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_06 = call float @atanhf(float %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp oge float %value, 1.000000e+00
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ole float %value, -1.000000e+00
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_06 = call float @atanhf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_07 = call float @logf(float %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole float %value, 0.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_07 = call float @logf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_08 = call float @log10f(float %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole float %value, 0.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_08 = call float @log10f(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_09 = call float @log2f(float %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole float %value, 0.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_09 = call float @log2f(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_10 = call float @logbf(float %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole float %value, 0.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_10 = call float @logbf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_11 = call float @log1pf(float %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole float %value, -1.000000e+00
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_11 = call float @log1pf(float %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
ret void
|
||||
}
|
||||
|
||||
declare float @acosf(float)
|
||||
declare float @asinf(float)
|
||||
declare float @cosf(float)
|
||||
declare float @sinf(float)
|
||||
declare float @acoshf(float)
|
||||
declare float @sqrtf(float)
|
||||
declare float @atanhf(float)
|
||||
declare float @logf(float)
|
||||
declare float @log10f(float)
|
||||
declare float @log2f(float)
|
||||
declare float @logbf(float)
|
||||
declare float @log1pf(float)
|
||||
|
||||
; CHECK: ![[BRANCH_WEIGHT]] = !{!"branch_weights", i32 1, i32 2000}
|
@ -1,192 +0,0 @@
|
||||
; RUN: opt < %s -libcalls-shrinkwrap -S | FileCheck %s
|
||||
; New PM
|
||||
; RUN: opt < %s -passes=libcalls-shrinkwrap -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 void @test_range_error(x86_fp80 %value) {
|
||||
entry:
|
||||
%call_0 = call x86_fp80 @coshl(x86_fp80 %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt x86_fp80 %value, 0xKC00CB174000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt x86_fp80 %value, 0xK400CB174000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT:[0-9]+]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_0 = call x86_fp80 @coshl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_1 = call x86_fp80 @expl(x86_fp80 %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt x86_fp80 %value, 0xKC00CB21C000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt x86_fp80 %value, 0xK400CB170000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_1 = call x86_fp80 @expl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_3 = call x86_fp80 @exp2l(x86_fp80 %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt x86_fp80 %value, 0xKC00D807A000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt x86_fp80 %value, 0xK400CB1DC000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_3 = call x86_fp80 @exp2l(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_4 = call x86_fp80 @sinhl(x86_fp80 %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp olt x86_fp80 %value, 0xKC00CB174000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ogt x86_fp80 %value, 0xK400CB174000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_4 = call x86_fp80 @sinhl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_5 = call x86_fp80 @expm1l(x86_fp80 %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ogt x86_fp80 %value, 0xK400CB170000000000000
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_5 = call x86_fp80 @expm1l(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
declare x86_fp80 @coshl(x86_fp80)
|
||||
declare x86_fp80 @expl(x86_fp80)
|
||||
declare x86_fp80 @exp10l(x86_fp80)
|
||||
declare x86_fp80 @exp2l(x86_fp80)
|
||||
declare x86_fp80 @sinhl(x86_fp80)
|
||||
declare x86_fp80 @expm1l(x86_fp80)
|
||||
|
||||
define void @test_domain_error(x86_fp80 %value) {
|
||||
entry:
|
||||
%call_00 = call x86_fp80 @acosl(x86_fp80 %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp ogt x86_fp80 %value, 0xK3FFF8000000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp olt x86_fp80 %value, 0xKBFFF8000000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_00 = call x86_fp80 @acosl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_01 = call x86_fp80 @asinl(x86_fp80 %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp ogt x86_fp80 %value, 0xK3FFF8000000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp olt x86_fp80 %value, 0xKBFFF8000000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_01 = call x86_fp80 @asinl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_02 = call x86_fp80 @cosl(x86_fp80 %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp oeq x86_fp80 %value, 0xKFFFF8000000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp oeq x86_fp80 %value, 0xK7FFF8000000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_02 = call x86_fp80 @cosl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_03 = call x86_fp80 @sinl(x86_fp80 %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp oeq x86_fp80 %value, 0xKFFFF8000000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp oeq x86_fp80 %value, 0xK7FFF8000000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_03 = call x86_fp80 @sinl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_04 = call x86_fp80 @acoshl(x86_fp80 %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp olt x86_fp80 %value, 0xK3FFF8000000000000000
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_04 = call x86_fp80 @acoshl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_05 = call x86_fp80 @sqrtl(x86_fp80 %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp olt x86_fp80 %value, 0xK00000000000000000000
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_05 = call x86_fp80 @sqrtl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_06 = call x86_fp80 @atanhl(x86_fp80 %value)
|
||||
; CHECK: [[COND1:%[0-9]+]] = fcmp oge x86_fp80 %value, 0xK3FFF8000000000000000
|
||||
; CHECK: [[COND2:%[0-9]+]] = fcmp ole x86_fp80 %value, 0xKBFFF8000000000000000
|
||||
; CHECK: [[COND:%[0-9]+]] = or i1 [[COND2]], [[COND1]]
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_06 = call x86_fp80 @atanhl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_07 = call x86_fp80 @logl(x86_fp80 %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole x86_fp80 %value, 0xK00000000000000000000
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_07 = call x86_fp80 @logl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_08 = call x86_fp80 @log10l(x86_fp80 %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole x86_fp80 %value, 0xK00000000000000000000
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_08 = call x86_fp80 @log10l(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_09 = call x86_fp80 @log2l(x86_fp80 %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole x86_fp80 %value, 0xK00000000000000000000
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_09 = call x86_fp80 @log2l(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_10 = call x86_fp80 @logbl(x86_fp80 %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole x86_fp80 %value, 0xK00000000000000000000
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_10 = call x86_fp80 @logbl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
%call_11 = call x86_fp80 @log1pl(x86_fp80 %value)
|
||||
; CHECK: [[COND:%[0-9]+]] = fcmp ole x86_fp80 %value, 0xKBFFF8000000000000000
|
||||
; CHECK: br i1 [[COND]], label %[[CALL_LABEL:cdce.call[0-9]*]], label %[[END_LABEL:cdce.end[0-9]*]], !prof ![[BRANCH_WEIGHT]]
|
||||
; CHECK: [[CALL_LABEL]]:
|
||||
; CHECK-NEXT: %call_11 = call x86_fp80 @log1pl(x86_fp80 %value)
|
||||
; CHECK-NEXT: br label %[[END_LABEL]]
|
||||
; CHECK: [[END_LABEL]]:
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
declare x86_fp80 @acosl(x86_fp80)
|
||||
declare x86_fp80 @asinl(x86_fp80)
|
||||
declare x86_fp80 @cosl(x86_fp80)
|
||||
declare x86_fp80 @sinl(x86_fp80)
|
||||
declare x86_fp80 @acoshl(x86_fp80)
|
||||
declare x86_fp80 @sqrtl(x86_fp80)
|
||||
declare x86_fp80 @atanhl(x86_fp80)
|
||||
declare x86_fp80 @logl(x86_fp80)
|
||||
declare x86_fp80 @log10l(x86_fp80)
|
||||
declare x86_fp80 @log2l(x86_fp80)
|
||||
declare x86_fp80 @logbl(x86_fp80)
|
||||
declare x86_fp80 @log1pl(x86_fp80)
|
||||
|
||||
; CHECK: ![[BRANCH_WEIGHT]] = !{!"branch_weights", i32 1, i32 2000}
|
188
external/llvm/test/Transforms/Util/lowerswitch.ll
vendored
188
external/llvm/test/Transforms/Util/lowerswitch.ll
vendored
@ -1,188 +0,0 @@
|
||||
; RUN: opt -lowerswitch -S < %s | FileCheck %s
|
||||
|
||||
; Test that we don't crash and have a different basic block for each incoming edge.
|
||||
define void @test0() {
|
||||
; CHECK-LABEL: @test0
|
||||
; CHECK: %merge = phi i64 [ 1, %BB3 ], [ 0, %NewDefault ], [ 0, %NodeBlock5 ], [ 0, %LeafBlock1 ]
|
||||
BB1:
|
||||
switch i32 undef, label %BB2 [
|
||||
i32 3, label %BB2
|
||||
i32 5, label %BB2
|
||||
i32 0, label %BB3
|
||||
i32 2, label %BB3
|
||||
i32 4, label %BB3
|
||||
]
|
||||
|
||||
BB2:
|
||||
%merge = phi i64 [ 1, %BB3 ], [ 0, %BB1 ], [ 0, %BB1 ], [ 0, %BB1 ]
|
||||
ret void
|
||||
|
||||
BB3:
|
||||
br label %BB2
|
||||
}
|
||||
|
||||
; Test switch cases that are merged into a single case during lowerswitch
|
||||
; (take 84 and 85 below) - check that the number of incoming phi values match
|
||||
; the number of branches.
|
||||
define void @test1() {
|
||||
; CHECK-LABEL: @test1
|
||||
entry:
|
||||
br label %bb1
|
||||
|
||||
bb1:
|
||||
switch i32 undef, label %bb1 [
|
||||
i32 84, label %bb3
|
||||
i32 85, label %bb3
|
||||
i32 86, label %bb2
|
||||
i32 78, label %exit
|
||||
i32 99, label %bb3
|
||||
]
|
||||
|
||||
bb2:
|
||||
br label %bb3
|
||||
|
||||
bb3:
|
||||
; CHECK-LABEL: bb3
|
||||
; CHECK: %tmp = phi i32 [ 1, %NodeBlock ], [ 0, %bb2 ], [ 1, %LeafBlock3 ]
|
||||
%tmp = phi i32 [ 1, %bb1 ], [ 0, %bb2 ], [ 1, %bb1 ], [ 1, %bb1 ]
|
||||
; CHECK-NEXT: %tmp2 = phi i32 [ 2, %NodeBlock ], [ 5, %bb2 ], [ 2, %LeafBlock3 ]
|
||||
%tmp2 = phi i32 [ 2, %bb1 ], [ 2, %bb1 ], [ 5, %bb2 ], [ 2, %bb1 ]
|
||||
br label %exit
|
||||
|
||||
exit:
|
||||
ret void
|
||||
}
|
||||
|
||||
; Test that we don't crash.
|
||||
define void @test2(i32 %mode) {
|
||||
; CHECK-LABEL: @test2
|
||||
br i1 undef, label %1, label %._crit_edge
|
||||
|
||||
; <label>:1 ; preds = %0
|
||||
switch i32 %mode, label %33 [
|
||||
i32 2, label %2
|
||||
i32 3, label %3
|
||||
i32 4, label %4
|
||||
i32 5, label %5
|
||||
i32 6, label %6
|
||||
i32 7, label %7
|
||||
i32 8, label %8
|
||||
i32 9, label %9
|
||||
i32 10, label %10
|
||||
i32 11, label %14
|
||||
i32 12, label %18
|
||||
i32 13, label %22
|
||||
i32 14, label %26
|
||||
i32 15, label %27
|
||||
i32 16, label %34
|
||||
i32 17, label %34
|
||||
i32 18, label %34
|
||||
i32 19, label %34
|
||||
i32 22, label %34
|
||||
i32 20, label %31
|
||||
i32 21, label %32
|
||||
]
|
||||
|
||||
; <label>:2 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:3 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:4 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:5 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:6 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:7 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:8 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:9 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:10 ; preds = %1
|
||||
br i1 undef, label %11, label %12
|
||||
|
||||
; <label>:11 ; preds = %10
|
||||
br label %13
|
||||
|
||||
; <label>:12 ; preds = %10
|
||||
br label %13
|
||||
|
||||
; <label>:13 ; preds = %12, %11
|
||||
br label %34
|
||||
|
||||
; <label>:14 ; preds = %1
|
||||
br i1 undef, label %15, label %16
|
||||
|
||||
; <label>:15 ; preds = %14
|
||||
br label %17
|
||||
|
||||
; <label>:16 ; preds = %14
|
||||
br label %17
|
||||
|
||||
; <label>:17 ; preds = %16, %15
|
||||
br label %34
|
||||
|
||||
; <label>:18 ; preds = %1
|
||||
br i1 undef, label %19, label %20
|
||||
|
||||
; <label>:19 ; preds = %18
|
||||
br label %21
|
||||
|
||||
; <label>:20 ; preds = %18
|
||||
br label %21
|
||||
|
||||
; <label>:21 ; preds = %20, %19
|
||||
br label %34
|
||||
|
||||
; <label>:22 ; preds = %1
|
||||
br i1 undef, label %23, label %24
|
||||
|
||||
; <label>:23 ; preds = %22
|
||||
br label %25
|
||||
|
||||
; <label>:24 ; preds = %22
|
||||
br label %25
|
||||
|
||||
; <label>:25 ; preds = %24, %23
|
||||
br label %34
|
||||
|
||||
; <label>:26 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:27 ; preds = %1
|
||||
br i1 undef, label %28, label %29
|
||||
|
||||
; <label>:28 ; preds = %27
|
||||
br label %30
|
||||
|
||||
; <label>:29 ; preds = %27
|
||||
br label %30
|
||||
|
||||
; <label>:30 ; preds = %29, %28
|
||||
br label %34
|
||||
|
||||
; <label>:31 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:32 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:33 ; preds = %1
|
||||
br label %34
|
||||
|
||||
; <label>:34 ; preds = %33, %32, %31, %30, %26, %25, %21, %17, %13, %9, %8, %7, %6, %5, %4, %3, %2, %1, %1, %1, %1, %1
|
||||
%o.0 = phi float [ undef, %33 ], [ undef, %32 ], [ undef, %31 ], [ undef, %30 ], [ undef, %26 ], [ undef, %25 ], [ undef, %21 ], [ undef, %17 ], [ undef, %13 ], [ undef, %9 ], [ undef, %8 ], [ undef, %7 ], [ undef, %6 ], [ undef, %5 ], [ undef, %4 ], [ undef, %3 ], [ undef, %2 ], [ undef, %1 ], [ undef, %1 ], [ undef, %1 ], [ undef, %1 ], [ undef, %1 ]
|
||||
br label %._crit_edge
|
||||
|
||||
._crit_edge: ; preds = %34, %0
|
||||
ret void
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
; RUN: opt -instcombine -instcombine-lower-dbg-declare=1 -S < %s | FileCheck %s
|
||||
; RUN: opt -instcombine -instcombine-lower-dbg-declare=0 -S < %s | FileCheck %s --check-prefix=DECLARE
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-linux-gnu"
|
||||
|
||||
%foo = type { i64, i32, i32 }
|
||||
|
||||
; Function Attrs: nounwind readnone
|
||||
declare void @llvm.dbg.declare(metadata, metadata, metadata) #0
|
||||
declare void @llvm.dbg.value(metadata, metadata, metadata) #0
|
||||
|
||||
; Function Attrs: sspreq
|
||||
define void @julia_fastshortest_6256() #1 {
|
||||
top:
|
||||
%cp = alloca %foo, align 8
|
||||
call void @llvm.dbg.declare(metadata %foo* %cp, metadata !1, metadata !16), !dbg !17
|
||||
br i1 undef, label %idxend, label %fail
|
||||
|
||||
fail: ; preds = %top
|
||||
unreachable
|
||||
|
||||
idxend: ; preds = %top
|
||||
; CHECK-NOT: call void @llvm.dbg.value(metadata %foo* %cp,
|
||||
%0 = load volatile %foo, %foo* %cp, align 8
|
||||
; CHECK: call void @llvm.dbg.value(metadata %foo %0,
|
||||
store volatile %foo %0, %foo* undef, align 8
|
||||
ret void
|
||||
}
|
||||
|
||||
; Keep the declare if we keep the alloca.
|
||||
; DECLARE-LABEL: define void @julia_fastshortest_6256()
|
||||
; DECLARE: %cp = alloca %foo, align 8
|
||||
; DECLARE: call void @llvm.dbg.declare(metadata %foo* %cp,
|
||||
|
||||
attributes #0 = { nounwind readnone }
|
||||
attributes #1 = { sspreq }
|
||||
|
||||
!llvm.module.flags = !{!0}
|
||||
!llvm.dbg.cu = !{!18}
|
||||
|
||||
!0 = !{i32 1, !"Debug Info Version", i32 3}
|
||||
!1 = !DILocalVariable(name: "cp", scope: !2, file: !3, line: 106, type: !12)
|
||||
!2 = distinct !DISubprogram(name: "fastshortest", linkageName: "julia_fastshortest_6256", scope: null, file: !3, type: !4, isLocal: false, isDefinition: true, isOptimized: true, unit: !18, variables: !11)
|
||||
!3 = !DIFile(filename: "grisu/fastshortest.jl", directory: ".")
|
||||
!4 = !DISubroutineType(types: !5)
|
||||
!5 = !{!6, !7}
|
||||
!6 = !DIBasicType(name: "Float64", size: 64, align: 64, encoding: DW_ATE_unsigned)
|
||||
!7 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !8, size: 64, align: 64)
|
||||
!8 = !DICompositeType(tag: DW_TAG_structure_type, name: "jl_value_t", file: !9, line: 71, align: 64, elements: !10)
|
||||
!9 = !DIFile(filename: "julia.h", directory: "")
|
||||
!10 = !{!7}
|
||||
!11 = !{}
|
||||
!12 = !DICompositeType(tag: DW_TAG_structure_type, name: "Float", size: 128, align: 64, elements: !13, runtimeLang: DW_LANG_Julia)
|
||||
!13 = !{!14, !15, !15}
|
||||
!14 = !DIBasicType(name: "UInt64", size: 64, align: 64, encoding: DW_ATE_unsigned)
|
||||
!15 = !DIBasicType(name: "Int32", size: 32, align: 32, encoding: DW_ATE_unsigned)
|
||||
!16 = !DIExpression()
|
||||
!17 = !DILocation(line: 106, scope: !2)
|
||||
!18 = distinct !DICompileUnit(language: DW_LANG_Julia, file: !3)
|
@ -1,83 +0,0 @@
|
||||
; Checks that llvm.dbg.declare -> llvm.dbg.value conversion utility
|
||||
; (here exposed through the SROA) pass, properly inserts bit_piece expressions
|
||||
; if it only describes part of the variable.
|
||||
; RUN: opt -S -sroa %s | FileCheck %s
|
||||
|
||||
; Built from:
|
||||
; struct foo { bool b; long i; };
|
||||
; void f(bool b, bool expr, foo g) {
|
||||
; }
|
||||
; And modifying the frag dbg.declare to use a fragmented DIExpression (with offset: 0, size: 4)
|
||||
; to test the dbg.declare+fragment case here.
|
||||
|
||||
; Expect two fragments:
|
||||
; * first starting at bit 0, 8 bits (for the bool)
|
||||
; * second starting at bit 32, 32 bits (for the long)
|
||||
; (this happens to create/demonstrate a gap from bits [7, 32))
|
||||
|
||||
; But also check that a complex expression is not used for a lone bool
|
||||
; parameter. It can reference the register it's in directly without masking off
|
||||
; high bits or anything
|
||||
|
||||
; CHECK: call void @llvm.dbg.value(metadata i8 %g.coerce0, metadata ![[VAR_STRUCT:[0-9]+]], metadata !DIExpression(DW_OP_LLVM_fragment, 0, 8))
|
||||
; CHECK: call void @llvm.dbg.value(metadata i64 %g.coerce1, metadata ![[VAR_STRUCT]], metadata !DIExpression(DW_OP_LLVM_fragment, 32, 64))
|
||||
; CHECK: call void @llvm.dbg.value(metadata i1 %b, metadata ![[VAR_BOOL:[0-9]+]], metadata !DIExpression())
|
||||
; CHECK: call void @llvm.dbg.value(metadata i1 %frag, metadata ![[VAR_FRAG:[0-9]+]], metadata !DIExpression(DW_OP_LLVM_fragment, 0, 1))
|
||||
|
||||
%struct.foo = type { i8, i64 }
|
||||
|
||||
; Function Attrs: noinline nounwind uwtable
|
||||
define void @_Z1fbb3foo(i1 zeroext %b, i1 zeroext %frag, i8 %g.coerce0, i64 %g.coerce1) #0 !dbg !6 {
|
||||
entry:
|
||||
%g = alloca %struct.foo, align 8
|
||||
%b.addr = alloca i8, align 1
|
||||
%frag.addr = alloca i8, align 1
|
||||
%0 = bitcast %struct.foo* %g to { i8, i64 }*
|
||||
%1 = getelementptr inbounds { i8, i64 }, { i8, i64 }* %0, i32 0, i32 0
|
||||
store i8 %g.coerce0, i8* %1, align 8
|
||||
%2 = getelementptr inbounds { i8, i64 }, { i8, i64 }* %0, i32 0, i32 1
|
||||
store i64 %g.coerce1, i64* %2, align 8
|
||||
%frombool = zext i1 %b to i8
|
||||
store i8 %frombool, i8* %b.addr, align 1
|
||||
call void @llvm.dbg.declare(metadata i8* %b.addr, metadata !15, metadata !16), !dbg !17
|
||||
%frombool1 = zext i1 %frag to i8
|
||||
store i8 %frombool1, i8* %frag.addr, align 1
|
||||
call void @llvm.dbg.declare(metadata i8* %frag.addr, metadata !18, metadata !23), !dbg !19
|
||||
call void @llvm.dbg.declare(metadata %struct.foo* %g, metadata !20, metadata !16), !dbg !21
|
||||
ret void, !dbg !22
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind readnone speculatable
|
||||
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
|
||||
|
||||
attributes #0 = { noinline nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||
attributes #1 = { nounwind readnone speculatable }
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.module.flags = !{!3, !4}
|
||||
!llvm.ident = !{!5}
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 5.0.0 (trunk 303077) (llvm/trunk 303098)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
|
||||
!1 = !DIFile(filename: "foo.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch")
|
||||
!2 = !{}
|
||||
!3 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!5 = !{!"clang version 5.0.0 (trunk 303077) (llvm/trunk 303098)"}
|
||||
!6 = distinct !DISubprogram(name: "f", linkageName: "_Z1fbb3foo", scope: !1, file: !1, line: 2, type: !7, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
|
||||
!7 = !DISubroutineType(types: !8)
|
||||
!8 = !{null, !9, !9, !10}
|
||||
!9 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean)
|
||||
!10 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo", file: !1, line: 1, size: 128, elements: !11, identifier: "_ZTS3foo")
|
||||
!11 = !{!12, !13}
|
||||
!12 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !10, file: !1, line: 1, baseType: !9, size: 8)
|
||||
!13 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !10, file: !1, line: 1, baseType: !14, size: 64, offset: 64)
|
||||
!14 = !DIBasicType(name: "long int", size: 64, encoding: DW_ATE_signed)
|
||||
!15 = !DILocalVariable(name: "b", arg: 1, scope: !6, file: !1, line: 2, type: !9)
|
||||
!16 = !DIExpression()
|
||||
!17 = !DILocation(line: 2, column: 13, scope: !6)
|
||||
!18 = !DILocalVariable(name: "frag", arg: 2, scope: !6, file: !1, line: 2, type: !9)
|
||||
!19 = !DILocation(line: 2, column: 21, scope: !6)
|
||||
!20 = !DILocalVariable(name: "g", arg: 3, scope: !6, file: !1, line: 2, type: !10)
|
||||
!21 = !DILocation(line: 2, column: 31, scope: !6)
|
||||
!22 = !DILocation(line: 3, column: 1, scope: !6)
|
||||
!23 = !DIExpression(DW_OP_LLVM_fragment, 0, 4)
|
@ -1,37 +0,0 @@
|
||||
; RUN: opt -instcombine -S %s | FileCheck %s
|
||||
|
||||
%foo = type { i8 }
|
||||
|
||||
; Function Attrs: nounwind uwtable
|
||||
define void @_ZN4llvm13ScaledNumbers10multiply64Emm() {
|
||||
entry:
|
||||
%getU = alloca %foo, align 1
|
||||
; This is supposed to make sure that the declare conversion, does not accidentally think the store OF
|
||||
; %getU is a store TO %getU. There are valid reasons to have an llvm.dbg.value here, but if the pass
|
||||
; is changed to emit such, a more specific check should be added to make sure that any llvm.dbg.value
|
||||
; is correct.
|
||||
; CHECK-NOT: @llvm.dbg.value(metadata %foo* %getU
|
||||
call void @llvm.dbg.declare(metadata %foo* %getU, metadata !3, metadata !6), !dbg !7
|
||||
store %foo* %getU, %foo** undef, align 8, !tbaa !8
|
||||
unreachable
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind readnone
|
||||
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
|
||||
|
||||
attributes #1 = { nounwind readnone }
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.module.flags = !{!2}
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.8.0 (https://github.com/llvm-mirror/clang 89dda3855cda574f355e6defa1d77bdae5053994) (llvm/trunk 257597)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
|
||||
!1 = !DIFile(filename: "none", directory: ".")
|
||||
!2 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!3 = !DILocalVariable(name: "getU", scope: !4, file: !1, line: 25, type: !5)
|
||||
!4 = distinct !DISubprogram(name: "multiply64", linkageName: "_ZN4llvm13ScaledNumbers10multiply64Emm", scope: null, file: !1, line: 22, isLocal: false, isDefinition: true, scopeLine: 23, flags: DIFlagPrototyped, isOptimized: true, unit: !0)
|
||||
!5 = !DICompositeType(tag: DW_TAG_class_type, scope: !4, file: !1, line: 25, size: 8, align: 8)
|
||||
!6 = !DIExpression()
|
||||
!7 = !DILocation(line: 25, column: 8, scope: !4)
|
||||
!8 = !{!10, !10, i64 0}
|
||||
!9 = !{i64 0}
|
||||
!10 = !{!"scalar type", !9}
|
@ -1,120 +0,0 @@
|
||||
; RUN: opt -S -strip-gc-relocates -instcombine < %s | FileCheck %s
|
||||
; test utility/debugging pass which removes gc.relocates, inserted by -rewrite-statepoints-for-gc
|
||||
declare void @use_obj32(i32 addrspace(1)*) "gc-leaf-function"
|
||||
|
||||
declare void @g()
|
||||
declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
|
||||
declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32, i32) #0
|
||||
declare void @do_safepoint()
|
||||
|
||||
declare i32 addrspace(1)* @new_instance() #1
|
||||
|
||||
|
||||
; Simple case: remove gc.relocate
|
||||
define i32 addrspace(1)* @test1(i32 addrspace(1)* %arg) gc "statepoint-example" {
|
||||
entry:
|
||||
; CHECK-LABEL: test1
|
||||
; CHECK: gc.statepoint
|
||||
; CHECK-NOT: gc.relocate
|
||||
; CHECK: ret i32 addrspace(1)* %arg
|
||||
%statepoint_token = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @g, i32 0, i32 0, i32 0, i32 1, i32 100, i32 addrspace(1)* %arg)
|
||||
%arg.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %statepoint_token, i32 8, i32 8) ; (%arg, %arg)
|
||||
%arg.relocated.casted = bitcast i8 addrspace(1)* %arg.relocated to i32 addrspace(1)*
|
||||
ret i32 addrspace(1)* %arg.relocated.casted
|
||||
}
|
||||
|
||||
; Remove gc.relocates in presence of nested relocates.
|
||||
define void @test2(i32 addrspace(1)* %base) gc "statepoint-example" {
|
||||
entry:
|
||||
; CHECK-LABEL: test2
|
||||
; CHECK: statepoint
|
||||
; CHECK-NOT: gc.relocate
|
||||
; CHECK: call void @use_obj32(i32 addrspace(1)* %ptr.gep1)
|
||||
; CHECK: call void @use_obj32(i32 addrspace(1)* %ptr.gep1)
|
||||
%ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
|
||||
%ptr.gep1 = getelementptr i32, i32 addrspace(1)* %ptr.gep, i32 15
|
||||
%statepoint_token = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* %ptr.gep1, i32 addrspace(1)* %base)
|
||||
%ptr.gep1.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %statepoint_token, i32 8, i32 7) ; (%base, %ptr.gep1)
|
||||
%ptr.gep1.relocated.casted = bitcast i8 addrspace(1)* %ptr.gep1.relocated to i32 addrspace(1)*
|
||||
%base.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %statepoint_token, i32 8, i32 8) ; (%base, %base)
|
||||
%base.relocated.casted = bitcast i8 addrspace(1)* %base.relocated to i32 addrspace(1)*
|
||||
call void @use_obj32(i32 addrspace(1)* %ptr.gep1.relocated.casted)
|
||||
%statepoint_token1 = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* %ptr.gep1.relocated.casted, i32 addrspace(1)* %base.relocated.casted)
|
||||
%ptr.gep1.relocated2 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %statepoint_token1, i32 8, i32 7) ; (%base.relocated.casted, %ptr.gep1.relocated.casted)
|
||||
%ptr.gep1.relocated2.casted = bitcast i8 addrspace(1)* %ptr.gep1.relocated2 to i32 addrspace(1)*
|
||||
%base.relocated3 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %statepoint_token1, i32 8, i32 8) ; (%base.relocated.casted, %base.relocated.casted)
|
||||
%base.relocated3.casted = bitcast i8 addrspace(1)* %base.relocated3 to i32 addrspace(1)*
|
||||
call void @use_obj32(i32 addrspace(1)* %ptr.gep1.relocated2.casted)
|
||||
ret void
|
||||
}
|
||||
|
||||
; landing pad gc.relocates removed by instcombine since it has no uses.
|
||||
define i32 addrspace(1)* @test3(i32 addrspace(1)* %arg) gc "statepoint-example" personality i32 8 {
|
||||
; CHECK-LABEL: test3(
|
||||
; CHECK: gc.statepoint
|
||||
; CHECK-LABEL: normal_dest:
|
||||
; CHECK-NOT: gc.relocate
|
||||
; CHECK: ret i32 addrspace(1)* %arg
|
||||
; CHECK-LABEL: unwind_dest:
|
||||
; CHECK-NOT: gc.relocate
|
||||
entry:
|
||||
%statepoint_token = invoke token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @g, i32 0, i32 0, i32 0, i32 1, i32 100, i32 addrspace(1)* %arg)
|
||||
to label %normal_dest unwind label %unwind_dest
|
||||
|
||||
normal_dest: ; preds = %entry
|
||||
%arg.relocated1 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %statepoint_token, i32 8, i32 8) ; (%arg, %arg)
|
||||
%arg.relocated1.casted = bitcast i8 addrspace(1)* %arg.relocated1 to i32 addrspace(1)*
|
||||
ret i32 addrspace(1)* %arg.relocated1.casted
|
||||
|
||||
unwind_dest: ; preds = %entry
|
||||
%lpad = landingpad token
|
||||
cleanup
|
||||
%arg.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %lpad, i32 8, i32 8) ; (%arg, %arg)
|
||||
%arg.relocated.casted = bitcast i8 addrspace(1)* %arg.relocated to i32 addrspace(1)*
|
||||
resume token undef
|
||||
}
|
||||
|
||||
; in presence of phi
|
||||
define void @test4(i1 %cond) gc "statepoint-example" {
|
||||
; CHECK-LABEL: test4
|
||||
entry:
|
||||
%base1 = call i32 addrspace(1)* @new_instance()
|
||||
%base2 = call i32 addrspace(1)* @new_instance()
|
||||
br i1 %cond, label %here, label %there
|
||||
|
||||
here: ; preds = %entry
|
||||
br label %merge
|
||||
|
||||
there: ; preds = %entry
|
||||
br label %merge
|
||||
|
||||
merge: ; preds = %there, %here
|
||||
; CHECK-LABEL: merge:
|
||||
; CHECK-NOT: gc.relocate
|
||||
; CHECK: %ptr.gep.remat = getelementptr i32, i32 addrspace(1)* %basephi.base
|
||||
%basephi.base = phi i32 addrspace(1)* [ %base1, %here ], [ %base2, %there ], !is_base_value !0
|
||||
%basephi = phi i32 addrspace(1)* [ %base1, %here ], [ %base2, %there ]
|
||||
%ptr.gep = getelementptr i32, i32 addrspace(1)* %basephi, i32 15
|
||||
%statepoint_token = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* %basephi.base)
|
||||
%basephi.base.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %statepoint_token, i32 7, i32 7) ; (%basephi.base, %basephi.base)
|
||||
%basephi.base.relocated.casted = bitcast i8 addrspace(1)* %basephi.base.relocated to i32 addrspace(1)*
|
||||
%ptr.gep.remat = getelementptr i32, i32 addrspace(1)* %basephi.base.relocated.casted, i32 15
|
||||
call void @use_obj32(i32 addrspace(1)* %ptr.gep.remat)
|
||||
ret void
|
||||
}
|
||||
|
||||
; The gc.relocate type is different from %arg, but removing the gc.relocate,
|
||||
; needs a bitcast to be added from i32 addrspace(1)* to i8 addrspace(1)*
|
||||
define i8 addrspace(1)* @test5(i32 addrspace(1)* %arg) gc "statepoint-example" {
|
||||
entry:
|
||||
; CHECK-LABEL: test5
|
||||
; CHECK: gc.statepoint
|
||||
; CHECK-NOT: gc.relocate
|
||||
%statepoint_token = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @g, i32 0, i32 0, i32 0, i32 1, i32 100, i32 addrspace(1)* %arg)
|
||||
%arg.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %statepoint_token, i32 8, i32 8) ; (%arg, %arg)
|
||||
ret i8 addrspace(1)* %arg.relocated
|
||||
}
|
||||
|
||||
attributes #0 = { nounwind readonly }
|
||||
attributes #1 = { nounwind "gc-leaf-function" }
|
||||
!0 = !{}
|
@ -1,94 +0,0 @@
|
||||
; RUN: opt -S -strip-nonlinetable-debuginfo %s -o %t.ll
|
||||
; RUN: cat %t.ll | FileCheck %s
|
||||
; RUN: cat %t.ll | FileCheck %s --check-prefix=CHECK-NEG
|
||||
;
|
||||
; This test provides coverage for setting the containing type of a DISubprogram.
|
||||
;
|
||||
; Generated an reduced from:
|
||||
; struct A {
|
||||
; virtual ~A();
|
||||
; };
|
||||
; struct B : A {};
|
||||
; B b;
|
||||
|
||||
source_filename = "t.cpp"
|
||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-apple-macosx10.12.0"
|
||||
|
||||
%struct.B = type { %struct.A }
|
||||
%struct.A = type { i32 (...)** }
|
||||
|
||||
; CHECK: @b = global
|
||||
; CHECK-NOT: !dbg
|
||||
@b = global %struct.B zeroinitializer, align 8, !dbg !0
|
||||
|
||||
declare void @_ZN1BC2Ev(%struct.B*) unnamed_addr
|
||||
|
||||
; Function Attrs: nounwind readnone
|
||||
declare void @llvm.dbg.declare(metadata, metadata, metadata) #0
|
||||
; CHECK: define
|
||||
|
||||
; Function Attrs: inlinehint nounwind ssp uwtable
|
||||
define linkonce_odr void @_ZN1BC1Ev(%struct.B* %this) unnamed_addr #1 align 2 !dbg !25 {
|
||||
entry:
|
||||
%this.addr = alloca %struct.B*, align 8
|
||||
store %struct.B* %this, %struct.B** %this.addr, align 8
|
||||
; CHECK-NOT: @llvm.dbg.declare
|
||||
call void @llvm.dbg.declare(metadata %struct.B** %this.addr, metadata !30, metadata !32), !dbg !33
|
||||
%this1 = load %struct.B*, %struct.B** %this.addr, align 8
|
||||
call void @_ZN1BC2Ev(%struct.B* %this1) #2, !dbg !34
|
||||
ret void, !dbg !34
|
||||
; CHECK: call void @_ZN1BC2Ev(%struct.B* %this1){{.*}} !dbg !
|
||||
}
|
||||
|
||||
attributes #0 = { nounwind readnone }
|
||||
attributes #1 = { inlinehint nounwind ssp uwtable }
|
||||
attributes #2 = { nounwind }
|
||||
|
||||
!llvm.dbg.cu = !{!2}
|
||||
!llvm.module.flags = !{!21, !22, !23}
|
||||
!llvm.ident = !{!24}
|
||||
|
||||
; CHECK-NEG-NOT: !DI{{Basic|Composite|Derived}}Type
|
||||
|
||||
!0 = distinct !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
|
||||
!1 = !DIGlobalVariable(name: "b", scope: !2, file: !3, line: 5, type: !6, isLocal: false, isDefinition: true)
|
||||
!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 4.0.0 (trunk 282583) (llvm/trunk 282611)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5)
|
||||
!3 = !DIFile(filename: "t.cpp", directory: "/")
|
||||
!4 = !{}
|
||||
!5 = !{!0}
|
||||
!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "B", file: !3, line: 4, size: 64, align: 64, elements: !7, vtableHolder: !9, identifier: "_ZTS1B")
|
||||
!7 = !{!8}
|
||||
!8 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !6, baseType: !9)
|
||||
!9 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "A", file: !3, line: 1, size: 64, align: 64, elements: !10, vtableHolder: !9, identifier: "_ZTS1A")
|
||||
!10 = !{!11, !17}
|
||||
!11 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$A", scope: !3, file: !3, baseType: !12, size: 64, flags: DIFlagArtificial)
|
||||
!12 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !13, size: 64)
|
||||
!13 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "__vtbl_ptr_type", baseType: !14, size: 64)
|
||||
!14 = !DISubroutineType(types: !15)
|
||||
!15 = !{!16}
|
||||
!16 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
|
||||
!17 = !DISubprogram(name: "~A", scope: !9, file: !3, line: 2, type: !18, isLocal: false, isDefinition: false, scopeLine: 2, containingType: !9, virtuality: DW_VIRTUALITY_virtual, virtualIndex: 0, flags: DIFlagPrototyped, isOptimized: false)
|
||||
!18 = !DISubroutineType(types: !19)
|
||||
!19 = !{null, !20}
|
||||
!20 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !9, size: 64, align: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
|
||||
!21 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!22 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!23 = !{i32 1, !"PIC Level", i32 2}
|
||||
!24 = !{!"clang version 4.0.0 (trunk 282583) (llvm/trunk 282611)"}
|
||||
; Only referenced by the type system.
|
||||
; CHECK-NEG-NOT: !DISubprogram(name: "~A"
|
||||
!25 = distinct !DISubprogram(name: "B", linkageName: "_ZN1BC1Ev", scope: !6, file: !3, line: 4, type: !26, isLocal: false, isDefinition: true, scopeLine: 4, flags: DIFlagArtificial | DIFlagPrototyped, isOptimized: false, unit: !2, declaration: !29, variables: !4)
|
||||
!26 = !DISubroutineType(types: !27)
|
||||
!27 = !{null, !28}
|
||||
!28 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !6, size: 64, align: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
|
||||
!29 = !DISubprogram(name: "B", scope: !6, type: !26, isLocal: false, isDefinition: false, flags: DIFlagArtificial | DIFlagPrototyped, isOptimized: false)
|
||||
!30 = !DILocalVariable(name: "this", arg: 1, scope: !25, type: !31, flags: DIFlagArtificial | DIFlagObjectPointer)
|
||||
!31 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !6, size: 64, align: 64)
|
||||
!32 = !DIExpression()
|
||||
!33 = !DILocation(line: 0, scope: !25)
|
||||
!34 = !DILocation(line: 4, column: 8, scope: !25)
|
||||
|
||||
; CHECK: !DISubprogram(name: "B", scope: ![[FILE:.*]], file: ![[FILE]],
|
||||
; CHECK-NOT: containingType:
|
||||
; CHECK-NEG-NOT: !DISubprogram(name: "B", {{.*}}, isDefinition: false
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user