blob: f8a93f93ec690ef68decd6e5c505539558529402 [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -ipsccp -S | FileCheck %s
declare void @use(i1)
define void @f1(i32 %a, i32 %b) {
; CHECK-LABEL: @f1(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[A_255:%.*]] = and i32 [[A:%.*]], 255
; CHECK-NEXT: [[A_2:%.*]] = add i32 [[A_255]], 20
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]
; CHECK-NEXT: br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
; CHECK: true:
; CHECK-NEXT: [[C_2:%.*]] = icmp eq i32 [[B]], 0
; CHECK-NEXT: call void @use(i1 [[C_2]])
; CHECK-NEXT: [[C_3:%.*]] = icmp eq i32 [[B]], 20
; CHECK-NEXT: call void @use(i1 [[C_3]])
; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[B]], 21
; CHECK-NEXT: call void @use(i1 [[C_4]])
; CHECK-NEXT: ret void
; CHECK: false:
; CHECK-NEXT: ret void
;
entry:
%a.255 = and i32 %a, 255
%a.2 = add i32 %a.255, 20
%c.1 = icmp ugt i32 %b, %a.2
br i1 %c.1, label %true, label %false
true:
%c.2 = icmp eq i32 %b, 0
call void @use(i1 %c.2)
%c.3 = icmp eq i32 %b, 20
call void @use(i1 %c.3)
%c.4 = icmp eq i32 %b, 21
call void @use(i1 %c.4)
ret void
false:
ret void
}
define void @f2(i8* %a) {
; CHECK-LABEL: @f2(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8* [[A:%.*]], null
; CHECK-NEXT: br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
; CHECK: true:
; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: ret void
; CHECK: false:
; CHECK-NEXT: ret void
;
entry:
%c.1 = icmp eq i8* %a, null
br i1 %c.1, label %true, label %false
true:
%c.2 = icmp eq i8*%a, null
call void @use(i1 %c.2)
ret void
false:
ret void
}
define i8* @f3(i8* %a, i8* %b, i1 %c) {
; CHECK-LABEL: @f3(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8* [[A:%.*]], null
; CHECK-NEXT: br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
; CHECK: true:
; CHECK-NEXT: br i1 [[C:%.*]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]
; CHECK: true.2:
; CHECK-NEXT: br label [[EXIT_2:%.*]]
; CHECK: false.2:
; CHECK-NEXT: br label [[EXIT_2]]
; CHECK: exit.2:
; CHECK-NEXT: [[P:%.*]] = phi i8* [ null, [[TRUE_2]] ], [ [[B:%.*]], [[FALSE_2]] ]
; CHECK-NEXT: ret i8* [[P]]
; CHECK: false:
; CHECK-NEXT: ret i8* null
;
entry:
%c.1 = icmp eq i8* %a, null
br i1 %c.1, label %true, label %false
true:
br i1 %c, label %true.2, label %false.2
true.2:
br label %exit.2
false.2:
br label %exit.2
exit.2:
%p = phi i8* [ %a, %true.2 ], [ %b, %false.2 ]
ret i8* %p
false:
ret i8* null
}
define i32 @f5(i64 %sz) {
; CHECK-LABEL: @f5(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 4088, [[SZ:%.*]]
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
; CHECK: cond.true:
; CHECK-NEXT: [[DIV:%.*]] = udiv i64 4088, [[SZ]]
; CHECK-NEXT: br label [[COND_END]]
; CHECK: cond.end:
; CHECK-NEXT: [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[COND]] to i32
; CHECK-NEXT: ret i32 [[CONV]]
;
entry:
%cmp = icmp ugt i64 4088, %sz
br i1 %cmp, label %cond.true, label %cond.end
cond.true: ; preds = %entry
%div = udiv i64 4088, %sz
br label %cond.end
cond.end: ; preds = %entry, %cond.true
%cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]
%conv = trunc i64 %cond to i32
ret i32 %conv
}
define void @f6(i32 %b) {
; CHECK-LABEL: @f6(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i32 [[B:%.*]], 20
; CHECK-NEXT: br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
; CHECK: true:
; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: ret void
; CHECK: false:
; CHECK-NEXT: ret void
;
entry:
%a = add i32 10, 10
%c.1 = icmp ugt i32 %b, %a
br i1 %c.1, label %true, label %false
true:
%c.2 = icmp eq i32 %a, 20
call void @use(i1 %c.2)
ret void
false:
ret void
}
define void @loop.1() {
entry:
br label %for.cond
for.cond: ; preds = %for.cond.cleanup13, %if.then
%i.0 = phi i32 [ 0, %entry ], [ %inc27, %for.cond.cleanup13 ]
%cmp9 = icmp sle i32 %i.0, 3
br i1 %cmp9, label %for.body, label %for.cond.cleanup
for.cond.cleanup: ; preds = %for.cond
ret void
for.body: ; preds = %for.cond
br label %for.cond11
for.cond11: ; preds = %arrayctor.cont21, %for.body
br label %for.cond.cleanup13
for.cond.cleanup13: ; preds = %for.cond11
%inc27 = add nsw i32 %i.0, 1
br label %for.cond
}
define void @loop() {
; CHECK-LABEL: @loop(
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[FOR_COND:%.*]]
; CHECK: for.cond:
; CHECK-NEXT: [[I_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC27:%.*]], [[FOR_COND_CLEANUP13:%.*]] ]
; CHECK-NEXT: [[CMP9:%.*]] = icmp sle i32 [[I_0]], 3
; CHECK-NEXT: br i1 [[CMP9]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]
; CHECK: for.cond.cleanup:
; CHECK-NEXT: ret void
; CHECK: for.body:
; CHECK-NEXT: br label [[FOR_COND11:%.*]]
; CHECK: for.cond11:
; CHECK-NEXT: [[J_0:%.*]] = phi i32 [ 0, [[FOR_BODY]] ], [ [[INC:%.*]], [[FOR_BODY14:%.*]] ]
; CHECK-NEXT: [[CMP12:%.*]] = icmp slt i32 [[J_0]], 2
; CHECK-NEXT: br i1 [[CMP12]], label [[FOR_BODY14]], label [[FOR_COND_CLEANUP13]]
; CHECK: for.cond.cleanup13:
; CHECK-NEXT: [[INC27]] = add nsw i32 [[I_0]], 1
; CHECK-NEXT: br label [[FOR_COND]]
; CHECK: for.body14:
; CHECK-NEXT: [[INC]] = add nsw i32 [[J_0]], 1
; CHECK-NEXT: br label [[FOR_COND11]]
;
entry:
br label %for.cond
for.cond: ; preds = %for.cond.cleanup13, %if.then
%i.0 = phi i32 [ 0, %entry ], [ %inc27, %for.cond.cleanup13 ]
%cmp9 = icmp sle i32 %i.0, 3
br i1 %cmp9, label %for.body, label %for.cond.cleanup
for.cond.cleanup: ; preds = %for.cond
ret void
for.body: ; preds = %for.cond
br label %for.cond11
for.cond11: ; preds = %arrayctor.cont21, %for.body
%j.0 = phi i32 [ 0, %for.body ], [ %inc, %for.body14 ]
%cmp12 = icmp slt i32 %j.0, 2
br i1 %cmp12, label %for.body14, label %for.cond.cleanup13
for.cond.cleanup13: ; preds = %for.cond11
%inc27 = add nsw i32 %i.0, 1
br label %for.cond
for.body14:
%inc = add nsw i32 %j.0, 1
br label %for.cond11
}
define i32 @foo(i64 %sz) {
; CHECK-LABEL: @foo(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 4088, [[SZ:%.*]]
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
; CHECK: cond.true:
; CHECK-NEXT: [[DIV:%.*]] = udiv i64 4088, [[SZ]]
; CHECK-NEXT: br label [[COND_END]]
; CHECK: cond.end:
; CHECK-NEXT: [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[COND]] to i32
; CHECK-NEXT: ret i32 [[CONV]]
;
entry:
%cmp = icmp ugt i64 4088, %sz
br i1 %cmp, label %cond.true, label %cond.end
cond.true: ; preds = %entry
%div = udiv i64 4088, %sz
br label %cond.end
cond.end: ; preds = %entry, %cond.true
%cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]
%conv = trunc i64 %cond to i32
ret i32 %conv
}
define i32 @bar(i64 %sz) {
; CHECK-LABEL: @bar(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[SZ:%.*]], 4088
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
; CHECK: cond.true:
; CHECK-NEXT: [[DIV:%.*]] = udiv i64 4088, [[SZ]]
; CHECK-NEXT: br label [[COND_END]]
; CHECK: cond.end:
; CHECK-NEXT: [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[COND]] to i32
; CHECK-NEXT: ret i32 [[CONV]]
;
entry:
%cmp = icmp ugt i64 %sz, 4088
br i1 %cmp, label %cond.true, label %cond.end
cond.true: ; preds = %entry
%div = udiv i64 4088, %sz
br label %cond.end
cond.end: ; preds = %entry, %cond.true
%cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]
%conv = trunc i64 %cond to i32
ret i32 %conv
}