168 changes: 131 additions & 37 deletions llvm/test/Transforms/NewGVN/edge.ll
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=newgvn -S < %s | FileCheck %s

define i32 @f1(i32 %x) {
; CHECK-LABEL: define i32 @f1(
; CHECK-LABEL: define i32 @f1(
; CHECK-SAME: i32 [[X:%.*]]) {
; CHECK-NEXT: bb0:
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 0
; CHECK-NEXT: br i1 [[CMP]], label [[BB2:%.*]], label [[BB1:%.*]]
; CHECK: bb1:
; CHECK-NEXT: br label [[BB2]]
; CHECK: bb2:
; CHECK-NEXT: ret i32 [[X]]
;
bb0:
%cmp = icmp eq i32 %x, 0
br i1 %cmp, label %bb2, label %bb1
Expand All @@ -11,12 +21,19 @@ bb2:
%cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
%foo = add i32 %cond, %x
ret i32 %foo
; CHECK: bb2:
; CHECK: ret i32 %x
}

define i32 @f2(i32 %x) {
; CHECK-LABEL: define i32 @f2(
; CHECK-LABEL: define i32 @f2(
; CHECK-SAME: i32 [[X:%.*]]) {
; CHECK-NEXT: bb0:
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X]], 0
; CHECK-NEXT: br i1 [[CMP]], label [[BB1:%.*]], label [[BB2:%.*]]
; CHECK: bb1:
; CHECK-NEXT: br label [[BB2]]
; CHECK: bb2:
; CHECK-NEXT: ret i32 [[X]]
;
bb0:
%cmp = icmp ne i32 %x, 0
br i1 %cmp, label %bb1, label %bb2
Expand All @@ -26,12 +43,20 @@ bb2:
%cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
%foo = add i32 %cond, %x
ret i32 %foo
; CHECK: bb2:
; CHECK: ret i32 %x
}

define i32 @f3(i32 %x) {
; CHECK-LABEL: define i32 @f3(
; CHECK-LABEL: define i32 @f3(
; CHECK-SAME: i32 [[X:%.*]]) {
; CHECK-NEXT: bb0:
; 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: ret i32 [[X]]
;
bb0:
switch i32 %x, label %bb1 [ i32 0, label %bb2]
bb1:
Expand All @@ -40,13 +65,21 @@ bb2:
%cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
%foo = add i32 %cond, %x
ret i32 %foo
; CHECK: bb2:
; CHECK: ret i32 %x
}

declare void @g(i1)
define void @f4(ptr %x) {
; CHECK-LABEL: define void @f4(
; CHECK-SAME: ptr [[X:%.*]]) {
; CHECK-NEXT: bb0:
; CHECK-NEXT: [[Y:%.*]] = icmp eq ptr null, [[X]]
; CHECK-NEXT: br i1 [[Y]], label [[BB2:%.*]], label [[BB1:%.*]]
; CHECK: bb1:
; CHECK-NEXT: br label [[BB2]]
; CHECK: bb2:
; CHECK-NEXT: call void @g(i1 [[Y]])
; CHECK-NEXT: ret void
;
bb0:
%y = icmp eq ptr null, %x
br i1 %y, label %bb2, label %bb1
Expand All @@ -55,11 +88,22 @@ bb1:
bb2:
%zed = icmp eq ptr null, %x
call void @g(i1 %zed)
; CHECK: call void @g(i1 %y)
ret void
}

define double @fcmp_oeq_not_zero(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_oeq_not_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 2.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[RETURN:%.*]]
; CHECK: if:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], 2.000000e+00
; 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
Expand All @@ -72,11 +116,21 @@ return:
%retval = phi double [ %div, %if ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_oeq_not_zero(
; CHECK: %div = fdiv double %x, 2.0
}

define double @fcmp_une_not_zero(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_une_not_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y]], 2.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label [[RETURN:%.*]], label [[ELSE:%.*]]
; CHECK: else:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], 2.000000e+00
; 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
Expand All @@ -89,14 +143,24 @@ return:
%retval = phi double [ %div, %else ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_une_not_zero(
; CHECK: %div = fdiv double %x, 2.0
}

; PR22376 - We can't propagate zero constants because -0.0
; PR22376 - We can't propagate zero constants because -0.0
; compares equal to 0.0. If %y is -0.0 in this test case,
; we would produce the wrong sign on the infinity return value.
define double @fcmp_oeq_zero(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_oeq_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], 0.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[RETURN:%.*]]
; CHECK: if:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Y]]
; 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
Expand All @@ -109,11 +173,21 @@ return:
%retval = phi double [ %div, %if ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_oeq_zero(
; CHECK: %div = fdiv double %x, %y
}

define double @fcmp_une_zero(double %x, double %y) {
; CHECK-LABEL: define double @fcmp_une_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y]], -0.000000e+00
; CHECK-NEXT: br i1 [[CMP]], label [[RETURN:%.*]], label [[ELSE:%.*]]
; CHECK: else:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Y]]
; 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
Expand All @@ -126,45 +200,65 @@ return:
%retval = phi double [ %div, %else ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_une_zero(
; CHECK: %div = fdiv double %x, %y
}

; We also cannot propagate a value if it's not a constant.
; This is because the value could be 0.0 or -0.0.

define double @fcmp_oeq_maybe_zero(double %x, double %y, double %z1, double %z2) {
; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]], double [[Z1:%.*]], double [[Z2:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[Z:%.*]] = fadd double [[Z1]], [[Z2]]
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y]], [[Z]]
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[RETURN:%.*]]
; CHECK: if:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Z]]
; 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
%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
%div = fdiv double %x, %z
br label %return

return:
%retval = phi double [ %div, %if ], [ %x, %entry ]
ret double %retval
%retval = phi double [ %div, %if ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
; CHECK: %div = fdiv double %x, %z
}

define double @fcmp_une_maybe_zero(double %x, double %y, double %z1, double %z2) {
; CHECK-LABEL: define double @fcmp_une_maybe_zero(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]], double [[Z1:%.*]], double [[Z2:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[Z:%.*]] = fadd double [[Z1]], [[Z2]]
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y]], [[Z]]
; CHECK-NEXT: br i1 [[CMP]], label [[RETURN:%.*]], label [[ELSE:%.*]]
; CHECK: else:
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X]], [[Z]]
; 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
%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
%div = fdiv double %x, %z
br label %return

return:
%retval = phi double [ %div, %else ], [ %x, %entry ]
ret double %retval
%retval = phi double [ %div, %else ], [ %x, %entry ]
ret double %retval

; CHECK-LABEL: define double @fcmp_une_maybe_zero(
; CHECK: %div = fdiv double %x, %z
}
11 changes: 9 additions & 2 deletions llvm/test/Transforms/NewGVN/eliminate-callsite-inline.ll
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=inline,newgvn -S < %s | FileCheck %s

; CHECK-LABEL: @f2()
; CHECK-NEXT: ret void

define void @f2() {
; CHECK-LABEL: define void @f2() {
; CHECK-NEXT: ret void
;
call void @f1()
call void @f1()
ret void
}

define internal void @f1() #1 {
; CHECK-LABEL: define internal void @f1(
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: ret void
;
entry:
ret void
}
Expand Down
14 changes: 7 additions & 7 deletions llvm/test/Transforms/NewGVN/equivalent-phi.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,22 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
define i32 @bar(i32 %arg, i32 %arg1, i32 %arg2) #0 {
; CHECK-LABEL: @bar(
; CHECK-NEXT: bb:
; CHECK-NEXT: br label %bb3
; CHECK-NEXT: br label [[BB3:%.*]]
; CHECK: bb3:
; CHECK-NEXT: [[TMP:%.*]] = phi i32 [ %arg, %bb ], [ [[TMP:%.*]]15, %bb17 ]
; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ %arg2, %bb ], [ [[TMP18:%.*]], %bb17 ]
; CHECK-NEXT: [[TMP6:%.*]] = phi i32 [ 0, %bb ], [ [[TMP14:%.*]], %bb17 ]
; CHECK-NEXT: [[TMP:%.*]] = phi i32 [ [[ARG:%.*]], [[BB:%.*]] ], [ [[TMP15:%.*]], [[BB17:%.*]] ]
; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[ARG2:%.*]], [[BB]] ], [ [[TMP18:%.*]], [[BB17]] ]
; CHECK-NEXT: [[TMP6:%.*]] = phi i32 [ 0, [[BB]] ], [ [[TMP14:%.*]], [[BB17]] ]
; CHECK-NEXT: [[TMP7:%.*]] = sext i32 [[TMP]] to i64
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1024 x i32], ptr @global, i64 0, i64 [[TMP7]]
; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP8]], align 4
; CHECK-NEXT: [[TMP10:%.*]] = add nsw i32 [[TMP6]], [[TMP9]]
; CHECK-NEXT: [[TMP14]] = add nsw i32 [[TMP10]], [[TMP9]]
; CHECK-NEXT: [[TMP15:%.*]] = add nsw i32 [[TMP]], %arg1
; CHECK-NEXT: br label %bb17
; CHECK-NEXT: [[TMP15]] = add nsw i32 [[TMP]], [[ARG1:%.*]]
; CHECK-NEXT: br label [[BB17]]
; CHECK: bb17:
; CHECK-NEXT: [[TMP18]] = add i32 [[TMP4]], -1
; CHECK-NEXT: [[TMP19:%.*]] = icmp ne i32 [[TMP4]], 0
; CHECK-NEXT: br i1 [[TMP19]], label %bb3, label %bb20
; CHECK-NEXT: br i1 [[TMP19]], label [[BB3]], label [[BB20:%.*]]
; CHECK: bb20:
; CHECK-NEXT: ret i32 [[TMP14]]
;
Expand Down
14 changes: 11 additions & 3 deletions llvm/test/Transforms/NewGVN/fold-const-expr.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; GVN failed to do constant expression folding and expanded
; them unfolded in many places, producing exponentially large const
; expressions. As a result, the compilation never fisished.
Expand All @@ -6,6 +7,16 @@
; RUN: opt -passes=newgvn -S < %s | FileCheck %s
%2 = type { i32, i32, i32, i32, i32 }
define i32 @_Z16vector3util_mainv(i32 %x, i32 %y) {
; CHECK-LABEL: define i32 @_Z16vector3util_mainv(
; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
; CHECK-NEXT: [[TMP1:%.*]] = alloca [[TMP0:%.*]], align 4
; CHECK-NEXT: [[TMP114:%.*]] = getelementptr inbounds [[TMP0]], ptr [[TMP1]], i64 0, i32 1
; CHECK-NEXT: store <4 x i32> <i32 234567891, i32 345678912, i32 456789123, i32 0>, ptr [[TMP114]], align 4
; CHECK-NEXT: store i32 310393545, ptr [[TMP114]], align 4
; CHECK-NEXT: store i32 -383584258, ptr [[TMP114]], align 4
; CHECK-NEXT: store i32 -57163022, ptr [[TMP114]], align 4
; CHECK-NEXT: ret i32 0
;
%tmp1 = alloca %2, align 4
%tmp114 = getelementptr inbounds %2, ptr %tmp1, i64 0, i32 1
store <4 x i32> <i32 234567891, i32 345678912, i32 456789123, i32 0>, ptr %tmp114, align 4
Expand Down Expand Up @@ -36,7 +47,6 @@ define i32 @_Z16vector3util_mainv(i32 %x, i32 %y) {
%tmp1739 = shl i32 %tmp1738, 22
%tmp1740 = xor i32 %tmp1739, %tmp1738
store i32 %tmp1740, ptr %tmp1683, align 4
; CHECK: store i32 310393545, ptr %tmp114, align 4
%tmp1756 = getelementptr inbounds %2, ptr %tmp1, i64 0, i32 1
%tmp1761 = load i32, ptr %tmp1756, align 4
%tmp1766 = shl i32 %tmp1761, 5
Expand Down Expand Up @@ -64,7 +74,6 @@ define i32 @_Z16vector3util_mainv(i32 %x, i32 %y) {
%tmp1812 = shl i32 %tmp1811, 22
%tmp1813 = xor i32 %tmp1812, %tmp1811
store i32 %tmp1813, ptr %tmp1756, align 4
; CHECK: store i32 -383584258, ptr %tmp114, align 4
%tmp2645 = getelementptr inbounds %2, ptr %tmp1, i64 0, i32 1
%tmp2650 = load i32, ptr %tmp2645, align 4
%tmp2655 = shl i32 %tmp2650, 5
Expand Down Expand Up @@ -92,6 +101,5 @@ define i32 @_Z16vector3util_mainv(i32 %x, i32 %y) {
%tmp2701 = shl i32 %tmp2700, 22
%tmp2702 = xor i32 %tmp2701, %tmp2700
store i32 %tmp2702, ptr %tmp2645, align 4
; CHECK: store i32 -57163022, ptr %tmp114, align 4
ret i32 0
}
53 changes: 35 additions & 18 deletions llvm/test/Transforms/NewGVN/fpmath.ll
Original file line number Diff line number Diff line change
@@ -1,58 +1,75 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=newgvn -S < %s | FileCheck %s

define double @test1(double %x, double %y) {
; CHECK: @test1(double %x, double %y)
; CHECK: %add1 = fadd double %x, %y
; CHECK-NOT: fpmath
; CHECK: %foo = fadd double %add1, %add1
; CHECK-LABEL: define double @test1(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[X]], [[Y]]
; CHECK-NEXT: [[FOO:%.*]] = fadd double [[ADD1]], [[ADD1]]
; CHECK-NEXT: ret double [[FOO]]
;
%add1 = fadd double %x, %y, !fpmath !0
%add2 = fadd double %x, %y
%foo = fadd double %add1, %add2
ret double %foo
}

define double @test2(double %x, double %y) {
; CHECK: @test2(double %x, double %y)
; CHECK: %add1 = fadd double %x, %y, !fpmath ![[MD0:[0-9]+]]
; CHECK: %foo = fadd double %add1, %add1
; CHECK-LABEL: define double @test2(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[X]], [[Y]], !fpmath [[META0:![0-9]+]]
; CHECK-NEXT: [[FOO:%.*]] = fadd double [[ADD1]], [[ADD1]]
; CHECK-NEXT: ret double [[FOO]]
;
%add1 = fadd double %x, %y, !fpmath !0
%add2 = fadd double %x, %y, !fpmath !0
%foo = fadd double %add1, %add2
ret double %foo
}

define double @test3(double %x, double %y) {
; CHECK: @test3(double %x, double %y)
; CHECK: %add1 = fadd double %x, %y, !fpmath ![[MD1:[0-9]+]]
; CHECK: %foo = fadd double %add1, %add1
; CHECK-LABEL: define double @test3(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[X]], [[Y]], !fpmath [[META1:![0-9]+]]
; CHECK-NEXT: [[FOO:%.*]] = fadd double [[ADD1]], [[ADD1]]
; CHECK-NEXT: ret double [[FOO]]
;
%add1 = fadd double %x, %y, !fpmath !1
%add2 = fadd double %x, %y, !fpmath !0
%foo = fadd double %add1, %add2
ret double %foo
}

define double @test4(double %x, double %y) {
; CHECK: @test4(double %x, double %y)
; CHECK: %add1 = fadd double %x, %y, !fpmath ![[MD1]]
; CHECK: %foo = fadd double %add1, %add1
; CHECK-LABEL: define double @test4(
; CHECK-SAME: double [[X:%.*]], double [[Y:%.*]]) {
; CHECK-NEXT: [[ADD1:%.*]] = fadd double [[X]], [[Y]], !fpmath [[META1]]
; CHECK-NEXT: [[FOO:%.*]] = fadd double [[ADD1]], [[ADD1]]
; CHECK-NEXT: ret double [[FOO]]
;
%add1 = fadd double %x, %y, !fpmath !0
%add2 = fadd double %x, %y, !fpmath !1
%foo = fadd double %add1, %add2
ret double %foo
}

define double @test5(double %x) {
; CHECK: @test5(double %x)
; CHECK: %neg1 = fneg double %x, !fpmath ![[MD1]]
; CHECK: %foo = fadd double %neg1, %neg1
; CHECK-LABEL: define double @test5(
; CHECK-SAME: double [[X:%.*]]) {
; CHECK-NEXT: [[NEG1:%.*]] = fneg double [[X]], !fpmath [[META1]]
; CHECK-NEXT: [[FOO:%.*]] = fadd double [[NEG1]], [[NEG1]]
; CHECK-NEXT: ret double [[FOO]]
;
%neg1 = fneg double %x, !fpmath !0
%neg2 = fneg double %x, !fpmath !1
%foo = fadd double %neg1, %neg2
ret double %foo
}

; CHECK: ![[MD0]] = !{float 5.000000e+00}
; CHECK: ![[MD1]] = !{float 2.500000e+00}

!0 = !{ float 5.0 }
!1 = !{ float 2.5 }
;.
; CHECK: [[META0]] = !{float 5.000000e+00}
; CHECK: [[META1]] = !{float 2.500000e+00}
;.
30 changes: 24 additions & 6 deletions llvm/test/Transforms/NewGVN/funclet.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=newgvn -S < %s | FileCheck %s
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
target triple = "i686-pc-windows-msvc"
Expand All @@ -8,13 +9,35 @@ target triple = "i686-pc-windows-msvc"
@"_TI1?AUA@@" = external constant %eh.ThrowInfo

define i8 @f() personality ptr @__CxxFrameHandler3 {
; CHECK-LABEL: define i8 @f() personality ptr @__CxxFrameHandler3 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[B:%.*]] = alloca i8, align 1
; CHECK-NEXT: [[C:%.*]] = alloca i8, align 1
; CHECK-NEXT: store i8 42, ptr [[B]], align 1
; CHECK-NEXT: store i8 13, ptr [[C]], align 1
; CHECK-NEXT: invoke void @_CxxThrowException(ptr [[B]], ptr nonnull @"_TI1?AUA@@")
; CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CATCH_DISPATCH:%.*]]
; CHECK: catch.dispatch:
; CHECK-NEXT: [[CS1:%.*]] = catchswitch within none [label %catch] unwind to caller
; CHECK: catch:
; CHECK-NEXT: [[CATCHPAD:%.*]] = catchpad within [[CS1]] [ptr null, i32 64, ptr null]
; CHECK-NEXT: store i8 5, ptr [[B]], align 1
; CHECK-NEXT: catchret from [[CATCHPAD]] to label [[TRY_CONT:%.*]]
; CHECK: try.cont:
; CHECK-NEXT: [[LOAD_B:%.*]] = load i8, ptr [[B]], align 1
; CHECK-NEXT: [[LOAD_C:%.*]] = load i8, ptr [[C]], align 1
; CHECK-NEXT: [[ADD:%.*]] = add i8 [[LOAD_B]], [[LOAD_C]]
; CHECK-NEXT: ret i8 [[ADD]]
; CHECK: unreachable:
; CHECK-NEXT: unreachable
;
entry:
%b = alloca i8
%c = alloca i8
store i8 42, ptr %b
store i8 13, ptr %c
invoke void @_CxxThrowException(ptr %b, ptr nonnull @"_TI1?AUA@@")
to label %unreachable unwind label %catch.dispatch
to label %unreachable unwind label %catch.dispatch

catch.dispatch: ; preds = %entry
%cs1 = catchswitch within none [label %catch] unwind to caller
Expand All @@ -33,11 +56,6 @@ try.cont: ; preds = %catch
unreachable: ; preds = %entry
unreachable
}
; CHECK-LABEL: define i8 @f(
; CHECK: %[[load_b:.*]] = load i8, ptr %b
; CHECK-NEXT: %[[load_c:.*]] = load i8, ptr %c
; CHECK-NEXT: %[[add:.*]] = add i8 %[[load_b]], %[[load_c]]
; CHECK-NEXT: ret i8 %[[add]]

declare i32 @__CxxFrameHandler3(...)

Expand Down
37 changes: 23 additions & 14 deletions llvm/test/Transforms/NewGVN/int_sideeffect.ll
Original file line number Diff line number Diff line change
@@ -1,27 +1,36 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -S < %s -passes=newgvn | FileCheck %s

declare void @llvm.sideeffect()

; Store-to-load forwarding across a @llvm.sideeffect.

; CHECK-LABEL: s2l
; CHECK-NOT: load
define float @s2l(ptr %p) {
store float 0.0, ptr %p
call void @llvm.sideeffect()
%t = load float, ptr %p
ret float %t
; CHECK-LABEL: define float @s2l(
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT: store float 0.000000e+00, ptr [[P]], align 4
; CHECK-NEXT: call void @llvm.sideeffect()
; CHECK-NEXT: ret float 0.000000e+00
;
store float 0.0, ptr %p
call void @llvm.sideeffect()
%t = load float, ptr %p
ret float %t
}

; Redundant load elimination across a @llvm.sideeffect.

; CHECK-LABEL: rle
; CHECK: load
; CHECK-NOT: load
define float @rle(ptr %p) {
%r = load float, ptr %p
call void @llvm.sideeffect()
%s = load float, ptr %p
%t = fadd float %r, %s
ret float %t
; CHECK-LABEL: define float @rle(
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT: [[R:%.*]] = load float, ptr [[P]], align 4
; CHECK-NEXT: call void @llvm.sideeffect()
; CHECK-NEXT: [[T:%.*]] = fadd float [[R]], [[R]]
; CHECK-NEXT: ret float [[T]]
;
%r = load float, ptr %p
call void @llvm.sideeffect()
%s = load float, ptr %p
%t = fadd float %r, %s
ret float %t
}
521 changes: 345 additions & 176 deletions llvm/test/Transforms/NewGVN/invariant.group.ll

Large diffs are not rendered by default.

41 changes: 27 additions & 14 deletions llvm/test/Transforms/NewGVN/invariant.start.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; Test to make sure llvm.invariant.start calls are not treated as clobbers.
; RUN: opt < %s -passes=newgvn -S | FileCheck %s

Expand All @@ -7,10 +8,12 @@ declare void @llvm.invariant.end.p0(ptr, i64, ptr nocapture) nounwind

; We forward store to the load across the invariant.start intrinsic
define i8 @forward_store() {
; CHECK-LABEL: @forward_store
; CHECK: call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
; CHECK-NOT: load
; CHECK: ret i8 0
; CHECK-LABEL: define i8 @forward_store() {
; CHECK-NEXT: [[A:%.*]] = alloca i8, align 1
; CHECK-NEXT: store i8 0, ptr [[A]], align 1
; CHECK-NEXT: [[I:%.*]] = call ptr @llvm.invariant.start.p0(i64 1, ptr [[A]])
; CHECK-NEXT: ret i8 0
;
%a = alloca i8
store i8 0, ptr %a
%i = call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
Expand All @@ -23,10 +26,18 @@ declare i8 @dummy(ptr nocapture) nounwind readonly
; We forward store to the load in the non-local analysis case,
; i.e. invariant.start is in another basic block.
define i8 @forward_store_nonlocal(i1 %cond) {
; CHECK-LABEL: forward_store_nonlocal
; CHECK: call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
; CHECK: ret i8 0
; CHECK: ret i8 %val
; CHECK-LABEL: define i8 @forward_store_nonlocal(
; CHECK-SAME: i1 [[COND:%.*]]) {
; CHECK-NEXT: [[A:%.*]] = alloca i8, align 1
; CHECK-NEXT: store i8 0, ptr [[A]], align 1
; CHECK-NEXT: [[I:%.*]] = call ptr @llvm.invariant.start.p0(i64 1, ptr [[A]])
; CHECK-NEXT: br i1 [[COND]], label [[LOADBLOCK:%.*]], label [[EXIT:%.*]]
; CHECK: loadblock:
; CHECK-NEXT: ret i8 0
; CHECK: exit:
; CHECK-NEXT: [[VAL:%.*]] = call i8 @dummy(ptr [[A]])
; CHECK-NEXT: ret i8 [[VAL]]
;
%a = alloca i8
store i8 0, ptr %a
%i = call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
Expand All @@ -43,12 +54,14 @@ exit:

; We should not value forward %foo to the invariant.end corresponding to %bar.
define i8 @forward_store1() {
; CHECK-LABEL: forward_store1
; CHECK: %foo = call ptr @llvm.invariant.start.p0
; CHECK-NOT: load
; CHECK: %bar = call ptr @llvm.invariant.start.p0
; CHECK: call void @llvm.invariant.end.p0(ptr %bar, i64 1, ptr %a)
; CHECK: ret i8 0
; CHECK-LABEL: define i8 @forward_store1() {
; CHECK-NEXT: [[A:%.*]] = alloca i8, align 1
; CHECK-NEXT: store i8 0, ptr [[A]], align 1
; CHECK-NEXT: [[FOO:%.*]] = call ptr @llvm.invariant.start.p0(i64 1, ptr [[A]])
; CHECK-NEXT: [[BAR:%.*]] = call ptr @llvm.invariant.start.p0(i64 1, ptr [[A]])
; CHECK-NEXT: call void @llvm.invariant.end.p0(ptr [[BAR]], i64 1, ptr [[A]])
; CHECK-NEXT: ret i8 0
;
%a = alloca i8
store i8 0, ptr %a
%foo = call ptr @llvm.invariant.start.p0(i64 1, ptr %a)
Expand Down
13 changes: 10 additions & 3 deletions llvm/test/Transforms/NewGVN/lifetime-simple.ll
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt < %s -passes=newgvn -S | FileCheck %s

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"
target triple = "i386-apple-darwin7"

define i8 @test(ptr %P) nounwind {
; CHECK: lifetime.start
; CHECK-NOT: load
; CHECK: lifetime.end
; CHECK-LABEL: define i8 @test(
; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 32, ptr [[P]])
; CHECK-NEXT: store i8 1, ptr [[P]], align 1
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 32, ptr [[P]])
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[P]], align 1
; CHECK-NEXT: ret i8 [[TMP0]]
;
entry:
call void @llvm.lifetime.start.p0(i64 32, ptr %P)
%0 = load i8, ptr %P
Expand Down
8 changes: 4 additions & 4 deletions llvm/test/Transforms/NewGVN/load-constant-mem.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ define i32 @test(ptr %p, i32 %i) nounwind {
; CHECK-LABEL: @test(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[P:%.*]] = getelementptr [4 x i32], ptr @G, i32 0, i32 [[I:%.*]]
; CHECK-NEXT: store i8 4, ptr [[P:%.*]]
; CHECK-NEXT: store i8 4, ptr [[P1:%.*]], align 1
; CHECK-NEXT: ret i32 0
;
entry:
%P = getelementptr [4 x i32], ptr @G, i32 0, i32 %i
%A = load i32, ptr %P
%p.i = getelementptr [4 x i32], ptr @G, i32 0, i32 %i
%A = load i32, ptr %p.i
store i8 4, ptr %p
%B = load i32, ptr %P
%B = load i32, ptr %p.i
%C = sub i32 %A, %B
ret i32 %C
}
Expand Down
14 changes: 12 additions & 2 deletions llvm/test/Transforms/NewGVN/load-from-unreachable-predecessor.ll
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=newgvn -S < %s | FileCheck %s

; Check that an unreachable predecessor to a PHI node doesn't cause a crash.
; PR21625.

define i32 @f(ptr %f) {
; CHECK: bb0:
; CHECK-LABEL: define i32 @f(
; CHECK-SAME: ptr [[F:%.*]]) {
; CHECK-NEXT: bb0:
; CHECK-NEXT: br label [[BB2:%.*]]
; CHECK: bb1:
; CHECK-NEXT: store i8 poison, ptr null, align 1
; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB2]]
; CHECK: bb2:
; CHECK-NEXT: [[STOREMERGE:%.*]] = load i32, ptr null, align 4
; CHECK-NEXT: ret i32 [[STOREMERGE]]
;
; Load should be removed, since it's ignored.
; CHECK-NEXT: br label
bb0:
%bar = load ptr, ptr %f
br label %bb2
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Transforms/NewGVN/loadforward.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
;; Test that we forward the first store to the second load
define i16 @bazinga() {
; CHECK-LABEL: @bazinga(
; CHECK-NEXT: [[_TMP10:%.*]] = load i16, ptr getelementptr inbounds (%rec11, ptr @str, i64 0, i32 1)
; CHECK-NEXT: store i16 [[_TMP10]], ptr @str
; CHECK-NEXT: [[_TMP10:%.*]] = load i16, ptr getelementptr inbounds ([[REC11:%.*]], ptr @str, i64 0, i32 1), align 2
; CHECK-NEXT: store i16 [[_TMP10]], ptr @str, align 2
; CHECK-NEXT: [[_TMP15:%.*]] = icmp eq i16 [[_TMP10]], 3
; CHECK-NEXT: [[_TMP16:%.*]] = select i1 [[_TMP15]], i16 1, i16 0
; CHECK-NEXT: br label [[BB1:%.*]]
Expand Down
43 changes: 34 additions & 9 deletions llvm/test/Transforms/NewGVN/malloc-load-removal.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -S -passes=newgvn < %s | FileCheck %s
; PR13694

Expand All @@ -7,6 +8,17 @@ target triple = "x86_64-apple-macosx10.8.0"
declare ptr @malloc(i64) nounwind allockind("alloc,uninitialized") allocsize(0) "alloc-family"="malloc"

define noalias ptr @test1() nounwind uwtable ssp {
; CHECK-LABEL: define noalias ptr @test1(
; CHECK-SAME: ) #[[ATTR1:[0-9]+]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @malloc(i64 100) #[[ATTR2:[0-9]+]]
; CHECK-NEXT: br i1 undef, label [[IF_END:%.*]], label [[IF_THEN:%.*]]
; CHECK: if.then:
; CHECK-NEXT: store i8 0, ptr [[CALL]], align 1
; CHECK-NEXT: br label [[IF_END]]
; CHECK: if.end:
; CHECK-NEXT: ret ptr [[CALL]]
;
entry:
%call = tail call ptr @malloc(i64 100) nounwind
%0 = load i8, ptr %call, align 1
Expand All @@ -20,14 +32,22 @@ if.then: ; preds = %entry
if.end: ; preds = %if.then, %entry
ret ptr %call

; CHECK-LABEL: @test1(
; CHECK-NOT: load
; CHECK-NOT: icmp
}

declare ptr @_Znwm(i64) nounwind

define noalias ptr @test2() nounwind uwtable ssp {
; CHECK-LABEL: define noalias ptr @test2(
; CHECK-SAME: ) #[[ATTR1]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @_Znwm(i64 100) #[[ATTR2]]
; CHECK-NEXT: br i1 undef, label [[IF_END:%.*]], label [[IF_THEN:%.*]]
; CHECK: if.then:
; CHECK-NEXT: store i8 0, ptr [[CALL]], align 1
; CHECK-NEXT: br label [[IF_END]]
; CHECK: if.end:
; CHECK-NEXT: ret ptr [[CALL]]
;
entry:
%call = tail call ptr @_Znwm(i64 100) nounwind
%0 = load i8, ptr %call, align 1
Expand All @@ -41,14 +61,22 @@ if.then: ; preds = %entry
if.end: ; preds = %if.then, %entry
ret ptr %call

; CHECK-LABEL: @test2(
; CHECK-NOT: load
; CHECK-NOT: icmp
}

declare ptr @aligned_alloc(i64 allocalign, i64) nounwind allockind("alloc,uninitialized,aligned") allocsize(1) "alloc-family"="malloc"

define noalias ptr @test3() nounwind uwtable ssp {
; CHECK-LABEL: define noalias ptr @test3(
; CHECK-SAME: ) #[[ATTR1]] {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @aligned_alloc(i64 256, i64 32) #[[ATTR2]]
; CHECK-NEXT: br i1 undef, label [[IF_END:%.*]], label [[IF_THEN:%.*]]
; CHECK: if.then:
; CHECK-NEXT: store i8 0, ptr [[CALL]], align 1
; CHECK-NEXT: br label [[IF_END]]
; CHECK: if.end:
; CHECK-NEXT: ret ptr [[CALL]]
;
entry:
%call = tail call ptr @aligned_alloc(i64 256, i64 32) nounwind
%0 = load i8, ptr %call, align 32
Expand All @@ -62,7 +90,4 @@ if.then: ; preds = %entry
if.end: ; preds = %if.then, %entry
ret ptr %call

; CHECK-LABEL: @test3(
; CHECK-NOT: load
; CHECK-NOT: icmp
}
134 changes: 133 additions & 1 deletion llvm/test/Transforms/NewGVN/memory-handling.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
;; This test is really dependent on propagating a lot of memory info around, but in the end, not
;; screwing up a single add.
; RUN: opt < %s -passes=newgvn -S | FileCheck %s
Expand All @@ -20,6 +21,121 @@ declare ptr @__ctype_b_loc() local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define void @BuildMask(ptr nocapture readonly) local_unnamed_addr #0 {
; CHECK-LABEL: define void @BuildMask(
; CHECK-SAME: ptr nocapture readonly [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr align 16 @alPhrase, i8 0, i64 416, i1 false)
; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr align 16 @aqMainMask, i8 0, i64 16, i1 false)
; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr align 16 @aqMainSign, i8 0, i64 16, i1 false)
; CHECK-NEXT: br label [[DOTSINK_SPLIT:%.*]]
; CHECK: .sink.split:
; CHECK-NEXT: [[DOT0:%.*]] = phi ptr [ [[TMP0]], [[TMP1:%.*]] ], [ [[TMP3:%.*]], [[TMP14:%.*]] ]
; CHECK-NEXT: [[DOTSINK:%.*]] = phi i32 [ 0, [[TMP1]] ], [ [[TMP22:%.*]], [[TMP14]] ]
; CHECK-NEXT: store i32 [[DOTSINK]], ptr @cchPhraseLength, align 4, !tbaa [[TBAA1:![0-9]+]]
; CHECK-NEXT: br label [[TMP2:%.*]]
; CHECK: 2:
; CHECK-NEXT: [[DOT1:%.*]] = phi ptr [ [[DOT0]], [[DOTSINK_SPLIT]] ], [ [[TMP3]], [[TMP6:%.*]] ]
; CHECK-NEXT: [[TMP3]] = getelementptr inbounds i8, ptr [[DOT1]], i64 1
; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[DOT1]], align 1
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 0
; CHECK-NEXT: br i1 [[TMP5]], label [[DOTPREHEADER_PREHEADER:%.*]], label [[TMP6]]
; CHECK: .preheader.preheader:
; CHECK-NEXT: br label [[DOTPREHEADER:%.*]]
; CHECK: 6:
; CHECK-NEXT: [[TMP7:%.*]] = tail call ptr @__ctype_b_loc() #[[ATTR4:[0-9]+]]
; CHECK-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8, !tbaa [[TBAA5:![0-9]+]]
; CHECK-NEXT: [[TMP9:%.*]] = sext i8 [[TMP4]] to i64
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i16, ptr [[TMP8]], i64 [[TMP9]]
; CHECK-NEXT: [[TMP11:%.*]] = load i16, ptr [[TMP10]], align 2, !tbaa [[TBAA7:![0-9]+]]
; CHECK-NEXT: [[TMP12:%.*]] = and i16 [[TMP11]], 1024
; CHECK-NEXT: [[TMP13:%.*]] = icmp eq i16 [[TMP12]], 0
; CHECK-NEXT: br i1 [[TMP13]], label [[TMP2]], label [[TMP14]]
; CHECK: 14:
; CHECK-NEXT: [[TMP15:%.*]] = sext i8 [[TMP4]] to i32
; CHECK-NEXT: [[TMP16:%.*]] = tail call i32 @tolower(i32 [[TMP15]]) #[[ATTR5:[0-9]+]]
; CHECK-NEXT: [[TMP17:%.*]] = add nsw i32 [[TMP16]], -97
; CHECK-NEXT: [[TMP18:%.*]] = sext i32 [[TMP17]] to i64
; CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds [26 x %struct.Letter], ptr @alPhrase, i64 0, i64 [[TMP18]], i32 0
; CHECK-NEXT: [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 16, !tbaa [[TBAA9:![0-9]+]]
; CHECK-NEXT: [[TMP21:%.*]] = add i32 [[TMP20]], 1
; CHECK-NEXT: store i32 [[TMP21]], ptr [[TMP19]], align 16, !tbaa [[TBAA9]]
; CHECK-NEXT: [[TMP22]] = add nsw i32 [[DOTSINK]], 1
; CHECK-NEXT: br label [[DOTSINK_SPLIT]]
; CHECK: .preheader:
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[DOTPREHEADER_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[TMP57:%.*]] ]
; CHECK-NEXT: [[DOT04961:%.*]] = phi i32 [ [[DOT2:%.*]], [[TMP57]] ], [ 0, [[DOTPREHEADER_PREHEADER]] ]
; CHECK-NEXT: [[DOT05160:%.*]] = phi i32 [ [[DOT253:%.*]], [[TMP57]] ], [ 0, [[DOTPREHEADER_PREHEADER]] ]
; CHECK-NEXT: [[TMP23:%.*]] = getelementptr inbounds [26 x %struct.Letter], ptr @alPhrase, i64 0, i64 [[INDVARS_IV]], i32 0
; CHECK-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 16, !tbaa [[TBAA9]]
; CHECK-NEXT: [[TMP25:%.*]] = icmp eq i32 [[TMP24]], 0
; CHECK-NEXT: [[TMP26:%.*]] = getelementptr inbounds [26 x i32], ptr @auGlobalFrequency, i64 0, i64 [[INDVARS_IV]]
; CHECK-NEXT: br i1 [[TMP25]], label [[TMP27:%.*]], label [[TMP28:%.*]]
; CHECK: 27:
; CHECK-NEXT: store i32 -1, ptr [[TMP26]], align 4, !tbaa [[TBAA1]]
; CHECK-NEXT: br label [[TMP57]]
; CHECK: 28:
; CHECK-NEXT: store i32 0, ptr [[TMP26]], align 4, !tbaa [[TBAA1]]
; CHECK-NEXT: [[TMP29:%.*]] = zext i32 [[TMP24]] to i64
; CHECK-NEXT: br i1 false, label [[DOT_CRIT_EDGE:%.*]], label [[DOTLR_PH_PREHEADER:%.*]]
; CHECK: .lr.ph.preheader:
; CHECK-NEXT: br label [[DOTLR_PH:%.*]]
; CHECK: .lr.ph:
; CHECK-NEXT: [[DOT04658:%.*]] = phi i64 [ [[TMP31:%.*]], [[DOTLR_PH]] ], [ 1, [[DOTLR_PH_PREHEADER]] ]
; CHECK-NEXT: [[DOT04857:%.*]] = phi i32 [ [[TMP30:%.*]], [[DOTLR_PH]] ], [ 1, [[DOTLR_PH_PREHEADER]] ]
; CHECK-NEXT: [[TMP30]] = add nuw nsw i32 [[DOT04857]], 1
; CHECK-NEXT: [[TMP31]] = shl i64 [[DOT04658]], 1
; CHECK-NEXT: [[TMP32:%.*]] = icmp ult i64 [[TMP29]], [[TMP31]]
; CHECK-NEXT: br i1 [[TMP32]], label [[DOT_CRIT_EDGE_LOOPEXIT:%.*]], label [[DOTLR_PH]]
; CHECK: ._crit_edge.loopexit:
; CHECK-NEXT: br label [[DOT_CRIT_EDGE]]
; CHECK: ._crit_edge:
; CHECK-NEXT: [[DOT048_LCSSA:%.*]] = phi i32 [ poison, [[TMP28]] ], [ [[TMP30]], [[DOT_CRIT_EDGE_LOOPEXIT]] ]
; CHECK-NEXT: [[DOT046_LCSSA:%.*]] = phi i64 [ poison, [[TMP28]] ], [ [[TMP31]], [[DOT_CRIT_EDGE_LOOPEXIT]] ]
; CHECK-NEXT: [[TMP33:%.*]] = add nsw i32 [[DOT048_LCSSA]], [[DOT04961]]
; CHECK-NEXT: [[TMP34:%.*]] = icmp ugt i32 [[TMP33]], 64
; CHECK-NEXT: br i1 [[TMP34]], label [[TMP35:%.*]], label [[TMP39:%.*]]
; CHECK: 35:
; CHECK-NEXT: [[TMP36:%.*]] = add i32 [[DOT05160]], 1
; CHECK-NEXT: [[TMP37:%.*]] = icmp ugt i32 [[TMP36]], 1
; CHECK-NEXT: br i1 [[TMP37]], label [[TMP38:%.*]], label [[TMP39]]
; CHECK: 38:
; CHECK-NEXT: tail call void @Fatal(ptr @.str.7, i32 0)
; CHECK-NEXT: br label [[TMP39]]
; CHECK: 39:
; CHECK-NEXT: [[DOT152:%.*]] = phi i32 [ [[DOT05160]], [[DOT_CRIT_EDGE]] ], [ [[TMP36]], [[TMP38]] ], [ [[TMP36]], [[TMP35]] ]
; CHECK-NEXT: [[DOT150:%.*]] = phi i32 [ [[DOT04961]], [[DOT_CRIT_EDGE]] ], [ 0, [[TMP38]] ], [ 0, [[TMP35]] ]
; CHECK-NEXT: [[TMP40:%.*]] = add i64 [[DOT046_LCSSA]], 4294967295
; CHECK-NEXT: [[TMP41:%.*]] = trunc i64 [[TMP40]] to i32
; CHECK-NEXT: [[TMP42:%.*]] = getelementptr inbounds [26 x %struct.Letter], ptr @alPhrase, i64 0, i64 [[INDVARS_IV]], i32 2
; CHECK-NEXT: store i32 [[TMP41]], ptr [[TMP42]], align 8, !tbaa [[TBAA11:![0-9]+]]
; CHECK-NEXT: [[TMP43:%.*]] = zext i32 [[DOT150]] to i64
; CHECK-NEXT: [[DOT046_:%.*]] = shl i64 [[DOT046_LCSSA]], [[TMP43]]
; CHECK-NEXT: [[TMP44:%.*]] = zext i32 [[DOT152]] to i64
; CHECK-NEXT: [[TMP45:%.*]] = getelementptr inbounds [2 x i64], ptr @aqMainSign, i64 0, i64 [[TMP44]]
; CHECK-NEXT: [[TMP46:%.*]] = load i64, ptr [[TMP45]], align 8, !tbaa [[TBAA12:![0-9]+]]
; CHECK-NEXT: [[TMP47:%.*]] = or i64 [[TMP46]], [[DOT046_]]
; CHECK-NEXT: store i64 [[TMP47]], ptr [[TMP45]], align 8, !tbaa [[TBAA12]]
; CHECK-NEXT: [[TMP48:%.*]] = load i32, ptr [[TMP23]], align 16, !tbaa [[TBAA9]]
; CHECK-NEXT: [[TMP49:%.*]] = zext i32 [[TMP48]] to i64
; CHECK-NEXT: [[TMP50:%.*]] = shl i64 [[TMP49]], [[TMP43]]
; CHECK-NEXT: [[TMP51:%.*]] = getelementptr inbounds [2 x i64], ptr @aqMainMask, i64 0, i64 [[TMP44]]
; CHECK-NEXT: [[TMP52:%.*]] = load i64, ptr [[TMP51]], align 8, !tbaa [[TBAA12]]
; CHECK-NEXT: [[TMP53:%.*]] = or i64 [[TMP50]], [[TMP52]]
; CHECK-NEXT: store i64 [[TMP53]], ptr [[TMP51]], align 8, !tbaa [[TBAA12]]
; CHECK-NEXT: [[TMP54:%.*]] = getelementptr inbounds [26 x %struct.Letter], ptr @alPhrase, i64 0, i64 [[INDVARS_IV]], i32 1
; CHECK-NEXT: store i32 [[DOT150]], ptr [[TMP54]], align 4, !tbaa [[TBAA14:![0-9]+]]
; CHECK-NEXT: [[TMP55:%.*]] = getelementptr inbounds [26 x %struct.Letter], ptr @alPhrase, i64 0, i64 [[INDVARS_IV]], i32 3
; CHECK-NEXT: store i32 [[DOT152]], ptr [[TMP55]], align 4, !tbaa [[TBAA15:![0-9]+]]
; CHECK-NEXT: [[TMP56:%.*]] = add nsw i32 [[DOT150]], [[DOT048_LCSSA]]
; CHECK-NEXT: br label [[TMP57]]
; CHECK: 57:
; CHECK-NEXT: [[DOT253]] = phi i32 [ [[DOT05160]], [[TMP27]] ], [ [[DOT152]], [[TMP39]] ]
; CHECK-NEXT: [[DOT2]] = phi i32 [ [[DOT04961]], [[TMP27]] ], [ [[TMP56]], [[TMP39]] ]
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], 26
; CHECK-NEXT: br i1 [[EXITCOND]], label [[DOTPREHEADER]], label [[TMP58:%.*]]
; CHECK: 58:
; CHECK-NEXT: ret void
;
tail call void @llvm.memset.p0.i64(ptr align 16 @alPhrase, i8 0, i64 416, i1 false)
tail call void @llvm.memset.p0.i64(ptr align 16 @aqMainMask, i8 0, i64 16, i1 false)
tail call void @llvm.memset.p0.i64(ptr align 16 @aqMainSign, i8 0, i64 16, i1 false)
Expand Down Expand Up @@ -113,7 +229,6 @@ define void @BuildMask(ptr nocapture readonly) local_unnamed_addr #0 {
; If we screw up the revisitation of the users of store of %sink above
; we will end up propagating and simplifying this to 1 in the final output
; because we keep an optimistic assumption we should not.
; CHECK: add i32 %.05160, 1
%37 = add i32 %.05160, 1
%38 = icmp ugt i32 %37, 1
br i1 %38, label %39, label %40
Expand Down Expand Up @@ -193,3 +308,20 @@ attributes #5 = { nounwind readonly }
!14 = !{!"long", !3, i64 0}
!15 = !{!11, !2, i64 4}
!16 = !{!11, !2, i64 12}
;.
; CHECK: [[TBAA1]] = !{[[META2:![0-9]+]], [[META2]], i64 0}
; CHECK: [[META2]] = !{!"int", [[META3:![0-9]+]], i64 0}
; CHECK: [[META3]] = !{!"omnipotent char", [[META4:![0-9]+]], i64 0}
; CHECK: [[META4]] = !{!"Simple C/C++ TBAA"}
; CHECK: [[TBAA5]] = !{[[META6:![0-9]+]], [[META6]], i64 0}
; CHECK: [[META6]] = !{!"any pointer", [[META3]], i64 0}
; CHECK: [[TBAA7]] = !{[[META8:![0-9]+]], [[META8]], i64 0}
; CHECK: [[META8]] = !{!"short", [[META3]], i64 0}
; CHECK: [[TBAA9]] = !{[[META10:![0-9]+]], [[META2]], i64 0}
; CHECK: [[META10]] = !{!"", [[META2]], i64 0, [[META2]], i64 4, [[META2]], i64 8, [[META2]], i64 12}
; CHECK: [[TBAA11]] = !{[[META10]], [[META2]], i64 8}
; CHECK: [[TBAA12]] = !{[[META13:![0-9]+]], [[META13]], i64 0}
; CHECK: [[META13]] = !{!"long", [[META3]], i64 0}
; CHECK: [[TBAA14]] = !{[[META10]], [[META2]], i64 4}
; CHECK: [[TBAA15]] = !{[[META10]], [[META2]], i64 12}
;.
2 changes: 1 addition & 1 deletion llvm/test/Transforms/NewGVN/metadata-nonnull.ll
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ define ptr @test7(ptr %v0) {
; CHECK-LABEL: define ptr @test7
; CHECK-SAME: (ptr [[V0:%.*]]) {
; CHECK-NEXT: top:
; CHECK-NEXT: [[V1:%.*]] = load ptr, ptr [[V0]], align 8, !nonnull !0
; CHECK-NEXT: [[V1:%.*]] = load ptr, ptr [[V0]], align 8, !nonnull [[META0:![0-9]+]]
; CHECK-NEXT: call void @use2(ptr [[V1]])
; CHECK-NEXT: br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
; CHECK: bb1:
Expand Down
24 changes: 12 additions & 12 deletions llvm/test/Transforms/NewGVN/metadata-simplify.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ define i1 @test1(ptr %arg, i1 %arg2) {
; CHECK-LABEL: @test1(
; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
; CHECK: bb1:
; CHECK-NEXT: [[LOAD1:%.*]] = load ptr, ptr [[ARG:%.*]], !nonnull !0
; CHECK-NEXT: [[LOAD1:%.*]] = load ptr, ptr [[ARG:%.*]], align 8, !nonnull [[META0:![0-9]+]]
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq ptr [[LOAD1]], null
; CHECK-NEXT: ret i1 [[CMP1]]
; CHECK: bb2:
; CHECK-NEXT: [[LOAD2:%.*]] = load ptr, ptr [[ARG]]
; CHECK-NEXT: [[LOAD2:%.*]] = load ptr, ptr [[ARG]], align 8
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq ptr [[LOAD2]], null
; CHECK-NEXT: ret i1 [[CMP2]]
;
Expand All @@ -34,11 +34,11 @@ define i1 @test2(ptr %arg, i1 %arg2) {
; CHECK-LABEL: @test2(
; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
; CHECK: bb1:
; CHECK-NEXT: [[LOAD1:%.*]] = load ptr, ptr [[ARG:%.*]]
; CHECK-NEXT: [[LOAD1:%.*]] = load ptr, ptr [[ARG:%.*]], align 8
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq ptr [[LOAD1]], null
; CHECK-NEXT: ret i1 [[CMP1]]
; CHECK: bb2:
; CHECK-NEXT: [[LOAD2:%.*]] = load ptr, ptr [[ARG]], !nonnull !0
; CHECK-NEXT: [[LOAD2:%.*]] = load ptr, ptr [[ARG]], align 8, !nonnull [[META0]]
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq ptr [[LOAD2]], null
; CHECK-NEXT: ret i1 [[CMP2]]
;
Expand All @@ -60,11 +60,11 @@ define i1 @test3(ptr %ptr, i1 %arg2) {
; CHECK-LABEL: @test3(
; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
; CHECK: bb1:
; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], !range !1
; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !range [[RNG1:![0-9]+]]
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[LOAD1]], 999
; CHECK-NEXT: ret i1 [[CMP1]]
; CHECK: bb2:
; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]]
; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[LOAD2]], 999
; CHECK-NEXT: ret i1 [[CMP2]]
;
Expand All @@ -85,11 +85,11 @@ define i1 @test4(ptr %ptr, i1 %arg2) {
; CHECK-LABEL: @test4(
; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
; CHECK: bb1:
; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]]
; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[LOAD1]], 999
; CHECK-NEXT: ret i1 [[CMP1]]
; CHECK: bb2:
; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]], !range !1
; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4, !range [[RNG1]]
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[LOAD2]], 999
; CHECK-NEXT: ret i1 [[CMP2]]
;
Expand All @@ -110,11 +110,11 @@ define i1 @test5(ptr %ptr, i1 %arg2) {
; CHECK-LABEL: @test5(
; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
; CHECK: bb1:
; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], !range !1
; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !range [[RNG1]]
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 999
; CHECK-NEXT: ret i1 [[CMP1]]
; CHECK: bb2:
; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]]
; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[LOAD2]], 999
; CHECK-NEXT: ret i1 [[CMP2]]
;
Expand All @@ -135,11 +135,11 @@ define i1 @test6(ptr %ptr, i1 %arg2) {
; CHECK-LABEL: @test6(
; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
; CHECK: bb1:
; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]]
; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 999
; CHECK-NEXT: ret i1 [[CMP1]]
; CHECK: bb2:
; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]], !range !1
; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4, !range [[RNG1]]
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[LOAD2]], 999
; CHECK-NEXT: ret i1 [[CMP2]]
;
Expand Down
38 changes: 26 additions & 12 deletions llvm/test/Transforms/NewGVN/noalias.ll
Original file line number Diff line number Diff line change
@@ -1,38 +1,45 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=newgvn -S < %s | FileCheck %s

define i32 @test1(ptr %p, ptr %q) {
; CHECK-LABEL: @test1(ptr %p, ptr %q)
; CHECK: load i32, ptr %p
; CHECK-NOT: noalias
; CHECK: %c = add i32 %a, %a
; CHECK-LABEL: define i32 @test1(
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
; CHECK-NEXT: ret i32 [[C]]
;
%a = load i32, ptr %p, !noalias !3
%b = load i32, ptr %p
%c = add i32 %a, %b
ret i32 %c
}

define i32 @test2(ptr %p, ptr %q) {
; CHECK-LABEL: @test2(ptr %p, ptr %q)
; CHECK: load i32, ptr %p, align 4, !alias.scope ![[SCOPE1:[0-9]+]]
; CHECK: %c = add i32 %a, %a
; CHECK-LABEL: define i32 @test2(
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !alias.scope [[META0:![0-9]+]]
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
; CHECK-NEXT: ret i32 [[C]]
;
%a = load i32, ptr %p, !alias.scope !3
%b = load i32, ptr %p, !alias.scope !3
%c = add i32 %a, %b
ret i32 %c
}

define i32 @test3(ptr %p, ptr %q) {
; CHECK-LABEL: @test3(ptr %p, ptr %q)
; CHECK: load i32, ptr %p, align 4, !alias.scope ![[SCOPE2:[0-9]+]]
; CHECK: %c = add i32 %a, %a
; CHECK-LABEL: define i32 @test3(
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !alias.scope [[META3:![0-9]+]]
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
; CHECK-NEXT: ret i32 [[C]]
;
%a = load i32, ptr %p, !alias.scope !4
%b = load i32, ptr %p, !alias.scope !5
%c = add i32 %a, %b
ret i32 %c
}

; CHECK: ![[SCOPE1]] = !{!{{[0-9]+}}}
; CHECK: ![[SCOPE2]] = !{!{{[0-9]+}}, !{{[0-9]+}}}
declare i32 @foo(ptr) readonly

!0 = distinct !{!0, !2, !"callee0: %a"}
Expand All @@ -42,3 +49,10 @@ declare i32 @foo(ptr) readonly
!3 = !{!0}
!4 = !{!1}
!5 = !{!0, !1}
;.
; CHECK: [[META0]] = !{[[META1:![0-9]+]]}
; CHECK: [[META1]] = distinct !{[[META1]], [[META2:![0-9]+]], !"callee0: %a"}
; CHECK: [[META2]] = distinct !{[[META2]], !"callee0"}
; CHECK: [[META3]] = !{[[META4:![0-9]+]], [[META1]]}
; CHECK: [[META4]] = distinct !{[[META4]], [[META2]], !"callee0: %b"}
;.
16 changes: 15 additions & 1 deletion llvm/test/Transforms/NewGVN/nomemlocation.ll
Original file line number Diff line number Diff line change
@@ -1,8 +1,22 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt < %s -S -p='newgvn' | FileCheck %s
; MemorySSA should be able to handle a clobber query with an empty MemoryLocation.

; CHECK: @userread
define ptr @userread(ptr %p) {
; CHECK-LABEL: define ptr @userread(
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: loop:
; CHECK-NEXT: [[POS:%.*]] = phi i64 [ 1, [[ENTRY:%.*]] ], [ [[DIFF:%.*]], [[LOOP]] ]
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[POS]]
; CHECK-NEXT: [[LD:%.*]] = load ptr, ptr [[GEP]], align 8
; CHECK-NEXT: [[READVAL:%.*]] = call i64 @fread(ptr noundef nonnull [[GEP]], i64 noundef 1, i64 noundef [[POS]], ptr noundef [[LD]])
; CHECK-NEXT: [[READVALISPOS:%.*]] = icmp eq i64 [[READVAL]], [[POS]]
; CHECK-NEXT: call void @llvm.assume(i1 [[READVALISPOS]])
; CHECK-NEXT: [[DIFF]] = sub i64 0, [[POS]]
; CHECK-NEXT: br label [[LOOP]]
;
entry:
br label %loop

Expand Down
42 changes: 30 additions & 12 deletions llvm/test/Transforms/NewGVN/non-integral-pointers.ll
Original file line number Diff line number Diff line change
@@ -1,37 +1,55 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=newgvn -S < %s | FileCheck %s

target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:4"
target triple = "x86_64-unknown-linux-gnu"

define void @f0(i1 %alwaysFalse, i64 %val, ptr %loc) {
; CHECK-LABEL: @f0(
; CHECK-NOT: inttoptr
; CHECK-NOT: ptrtoint
entry:
; CHECK-LABEL: define void @f0(
; CHECK-SAME: i1 [[ALWAYSFALSE:%.*]], i64 [[VAL:%.*]], ptr [[LOC:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: store i64 [[VAL]], ptr [[LOC]], align 8
; CHECK-NEXT: br i1 [[ALWAYSFALSE]], label [[NEVERTAKEN:%.*]], label [[ALWAYSTAKEN:%.*]]
; CHECK: neverTaken:
; CHECK-NEXT: [[PTR:%.*]] = load ptr addrspace(4), ptr [[LOC]], align 8
; CHECK-NEXT: store i8 5, ptr addrspace(4) [[PTR]], align 1
; CHECK-NEXT: ret void
; CHECK: alwaysTaken:
; CHECK-NEXT: ret void
;
entry:
store i64 %val, ptr %loc
br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken

neverTaken:
neverTaken:
%ptr = load ptr addrspace(4), ptr %loc
store i8 5, ptr addrspace(4) %ptr
ret void

alwaysTaken:
alwaysTaken:
ret void
}

define i64 @f1(i1 %alwaysFalse, ptr addrspace(4) %val, ptr %loc) {
; CHECK-LABEL: @f1(
; CHECK-NOT: inttoptr
; CHECK-NOT: ptrtoint
entry:
; CHECK-LABEL: define i64 @f1(
; CHECK-SAME: i1 [[ALWAYSFALSE:%.*]], ptr addrspace(4) [[VAL:%.*]], ptr [[LOC:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: store ptr addrspace(4) [[VAL]], ptr [[LOC]], align 8
; CHECK-NEXT: br i1 [[ALWAYSFALSE]], label [[NEVERTAKEN:%.*]], label [[ALWAYSTAKEN:%.*]]
; CHECK: neverTaken:
; CHECK-NEXT: [[INT:%.*]] = load i64, ptr [[LOC]], align 8
; CHECK-NEXT: ret i64 [[INT]]
; CHECK: alwaysTaken:
; CHECK-NEXT: ret i64 42
;
entry:
store ptr addrspace(4) %val, ptr %loc
br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken

neverTaken:
neverTaken:
%int = load i64, ptr %loc
ret i64 %int

alwaysTaken:
alwaysTaken:
ret i64 42
}
24 changes: 15 additions & 9 deletions llvm/test/Transforms/NewGVN/null-aliases-nothing.ll
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt < %s -passes=newgvn -S | FileCheck %s

%t = type { i32 }
declare void @test1f(ptr)

define void @test1(ptr noalias %stuff ) {
%before = load i32, ptr %stuff
; CHECK-LABEL: define void @test1(
; CHECK-SAME: ptr noalias [[STUFF:%.*]]) {
; CHECK-NEXT: [[BEFORE:%.*]] = load i32, ptr [[STUFF]], align 4
; CHECK-NEXT: call void @test1f(ptr null)
; CHECK-NEXT: [[SUM:%.*]] = add i32 [[BEFORE]], [[BEFORE]]
; CHECK-NEXT: store i32 [[SUM]], ptr [[STUFF]], align 4
; CHECK-NEXT: ret void
;
%before = load i32, ptr %stuff

call void @test1f(ptr null)
call void @test1f(ptr null)

%after = load i32, ptr %stuff ; <--- This should be a dead load
%sum = add i32 %before, %after
%after = load i32, ptr %stuff ; <--- This should be a dead load
%sum = add i32 %before, %after

store i32 %sum, ptr %stuff
ret void
; CHECK: load
; CHECK-NOT: load
; CHECK: ret void
store i32 %sum, ptr %stuff
ret void
}
4 changes: 2 additions & 2 deletions llvm/test/Transforms/NewGVN/phi-edge-handling.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ define i16 @hoge() {
; CHECK-LABEL: @hoge(
; CHECK-NEXT: bb:
; CHECK-NEXT: switch i8 undef, label [[BB7:%.*]] [
; CHECK-NEXT: i8 0, label [[BB1:%.*]]
; CHECK-NEXT: i8 12, label [[BB2:%.*]]
; CHECK-NEXT: i8 0, label [[BB1:%.*]]
; CHECK-NEXT: i8 12, label [[BB2:%.*]]
; CHECK-NEXT: ]
; CHECK: bb1:
; CHECK-NEXT: br label [[BB6:%.*]]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@ define void @pr42422(i1 %c.1, i1 %c.2) {
; CHECK: bb16:
; CHECK-NEXT: [[TMP17:%.*]] = phi i32 [ poison, [[BB15]] ], [ 1, [[BB14]] ], [ 9, [[BB7]] ]
; CHECK-NEXT: switch i32 [[TMP17]], label [[BB19]] [
; CHECK-NEXT: i32 0, label [[BB6]]
; CHECK-NEXT: i32 9, label [[BB18:%.*]]
; CHECK-NEXT: i32 0, label [[BB6]]
; CHECK-NEXT: i32 9, label [[BB18:%.*]]
; CHECK-NEXT: ]
; CHECK: bb18:
; CHECK-NEXT: br label [[BB19]]
Expand Down
18 changes: 13 additions & 5 deletions llvm/test/Transforms/NewGVN/phi-translate-partial-alias.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=newgvn -S < %s | FileCheck %s

target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-f128:128:128-n8:16:32:64"
Expand All @@ -6,12 +7,19 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
; not actually redundant around the loop backedge, despite appearances
; if phi-translation is ignored.

; CHECK: define void @test0(ptr %begin)
; CHECK: loop:
; CHECK: %l0 = load i8, ptr %phi
; CHECK: call void @bar(i8 %l0)
; CHECK: %l1 = load i8, ptr %phi
define void @test0(ptr %begin) {
; CHECK-LABEL: define void @test0(
; CHECK-SAME: ptr [[BEGIN:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: loop:
; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[BEGIN]], [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]
; CHECK-NEXT: [[L0:%.*]] = load i8, ptr [[PHI]], align 1
; CHECK-NEXT: call void @bar(i8 [[L0]])
; CHECK-NEXT: [[L1:%.*]] = load i8, ptr [[PHI]], align 1
; CHECK-NEXT: [[NEXT]] = getelementptr inbounds i8, ptr [[PHI]], i8 [[L1]]
; CHECK-NEXT: br label [[LOOP]]
;
entry:
br label %loop

Expand Down
9 changes: 7 additions & 2 deletions llvm/test/Transforms/NewGVN/pr17732.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=newgvn -S -o - < %s | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
Expand All @@ -12,6 +13,12 @@ target triple = "x86_64-unknown-linux-gnu"
@vector_with_zeroinit = common global %struct.with_vector zeroinitializer, align 4

define i32 @main() {
; CHECK-LABEL: define i32 @main() {
; CHECK-NEXT: entry:
; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 4 @array_with_zeroinit, ptr align 4 @main.obj_with_array, i64 12, i1 false)
; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 4 @vector_with_zeroinit, ptr align 4 @main.obj_with_vector, i64 12, i1 false)
; CHECK-NEXT: ret i32 1
;
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr align 4 @array_with_zeroinit, ptr align 4 @main.obj_with_array, i64 12, i1 false)
%0 = load i8, ptr getelementptr inbounds (%struct.with_array, ptr @array_with_zeroinit, i64 0, i32 2), align 4
Expand All @@ -22,8 +29,6 @@ entry:
%conv1 = sext i8 %1 to i32
%and = and i32 %conv0, %conv1
ret i32 %and
; CHECK-LABEL: define i32 @main(
; CHECK: ret i32 1
}

declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture readonly, i64, i1)
1 change: 1 addition & 0 deletions llvm/test/Transforms/NewGVN/pr17852.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt < %s -passes=newgvn
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
%struct.S0 = type { [2 x i8], [2 x i8], [4 x i8], [2 x i8], i32, i32, i32, i32 }
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Transforms/NewGVN/pr24397.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=newgvn -disable-output < %s

target triple = "x86_64-unknown-linux-gnu"
Expand Down
9 changes: 8 additions & 1 deletion llvm/test/Transforms/NewGVN/pr24426.ll
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt < %s -passes=memcpyopt,mldst-motion,newgvn -S | FileCheck %s

declare void @check(i8)

declare void @write(ptr %res)

define void @test1() {
; CHECK-LABEL: define void @test1() {
; CHECK-NEXT: [[TMP1:%.*]] = alloca [10 x i8], align 1
; CHECK-NEXT: call void @write(ptr [[TMP1]])
; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
; CHECK-NEXT: call void @check(i8 [[TMP2]])
; CHECK-NEXT: ret void
;
%1 = alloca [10 x i8]
call void @write(ptr %1)
%2 = load i8, ptr %1

; CHECK-NOT: undef
call void @check(i8 %2)

ret void
Expand Down
83 changes: 70 additions & 13 deletions llvm/test/Transforms/NewGVN/pr25440.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
;RUN: opt -passes=newgvn -S < %s | FileCheck %s

target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n8:16:32-S64"
Expand All @@ -10,19 +11,51 @@ target triple = "thumbv7--linux-gnueabi"

; Function Attrs: nounwind
define fastcc void @foo(ptr nocapture readonly %x) {
;CHECK-LABEL: foo
; CHECK-LABEL: define fastcc void @foo(
; CHECK-SAME: ptr nocapture readonly [[X:%.*]]) {
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[BB0:%.*]]
; CHECK: bb0:
; CHECK-NEXT: [[X_TR:%.*]] = phi ptr [ [[X]], [[ENTRY:%.*]] ], [ null, [[LAND_LHS_TRUE:%.*]] ]
; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[X_TR]], align 4
; CHECK-NEXT: [[CONV:%.*]] = zext i16 [[TMP0]] to i32
; CHECK-NEXT: switch i32 [[CONV]], label [[IF_END_50:%.*]] [
; CHECK-NEXT: i32 43, label [[CLEANUP:%.*]]
; CHECK-NEXT: i32 52, label [[IF_THEN_5:%.*]]
; CHECK-NEXT: ]
; CHECK: if.then.5:
; CHECK-NEXT: br i1 undef, label [[LAND_LHS_TRUE]], label [[IF_THEN_26:%.*]]
; CHECK: land.lhs.true:
; CHECK-NEXT: br i1 undef, label [[CLEANUP]], label [[BB0]]
; CHECK: if.then.26:
; CHECK-NEXT: br i1 undef, label [[COND_END:%.*]], label [[COND_FALSE:%.*]]
; CHECK: cond.false:
; CHECK-NEXT: [[MODE:%.*]] = getelementptr inbounds [[STRUCT_A:%.*]], ptr [[X_TR]], i32 0, i32 1
; CHECK-NEXT: [[BF_LOAD:%.*]] = load i16, ptr [[MODE]], align 2
; CHECK-NEXT: br label [[COND_END]]
; CHECK: cond.end:
; CHECK-NEXT: br i1 undef, label [[IF_THEN_44:%.*]], label [[CLEANUP]]
; CHECK: if.then.44:
; CHECK-NEXT: unreachable
; CHECK: if.end.50:
; CHECK-NEXT: [[ARRAYIDX52:%.*]] = getelementptr inbounds [0 x i32], ptr @length, i32 0, i32 [[CONV]]
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX52]], align 4
; CHECK-NEXT: br i1 undef, label [[FOR_BODY_57:%.*]], label [[CLEANUP]]
; CHECK: for.body.57:
; CHECK-NEXT: unreachable
; CHECK: cleanup:
; CHECK-NEXT: ret void
;
entry:
br label %bb0

bb0: ; preds = %land.lhs.true, %entry
;CHECK: bb0:
%x.tr = phi ptr [ %x, %entry ], [ null, %land.lhs.true ]
%0 = load i16, ptr %x.tr, align 4
; CHECK: load i16, ptr
%conv = zext i16 %0 to i32
switch i32 %conv, label %if.end.50 [
i32 43, label %cleanup
i32 52, label %if.then.5
i32 43, label %cleanup
i32 52, label %if.then.5
]

if.then.5: ; preds = %bb0
Expand All @@ -36,8 +69,6 @@ if.then.26: ; preds = %if.then.5
br i1 undef, label %cond.end, label %cond.false

cond.false: ; preds = %if.then.26
; CHECK: cond.false:
; CHECK: load i16
%mode = getelementptr inbounds %struct.a, ptr %x.tr.lcssa163, i32 0, i32 1
%bf.load = load i16, ptr %mode, align 2
%bf.shl = shl i16 %bf.load, 8
Expand All @@ -50,7 +81,6 @@ if.then.44: ; preds = %cond.end
unreachable

if.end.50: ; preds = %bb0
;%CHECK: if.end.50:
%conv.lcssa = phi i32 [ %conv, %bb0 ]
%arrayidx52 = getelementptr inbounds [0 x i32], ptr @length, i32 0, i32 %conv.lcssa
%1 = load i32, ptr %arrayidx52, align 4
Expand All @@ -68,7 +98,34 @@ cleanup: ; preds = %if.end.50, %cond.en
@dfg_text = external global ptr, align 4

define void @dfg_lex() {
;CHECK-LABEL: dfg_lex
; CHECK-LABEL: define void @dfg_lex() {
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[WHILE_BODYTHREAD_PRE_SPLIT:%.*]]
; CHECK: while.bodythread-pre-split:
; CHECK-NEXT: br i1 undef, label [[IF_THEN_14:%.*]], label [[IF_END_15:%.*]]
; CHECK: if.then.14:
; CHECK-NEXT: [[V1:%.*]] = load i32, ptr @dfg_text, align 4
; CHECK-NEXT: br label [[IF_END_15]]
; CHECK: if.end.15:
; CHECK-NEXT: [[V2:%.*]] = load ptr, ptr @yy_c_buf_p, align 4
; CHECK-NEXT: br label [[WHILE_COND_16:%.*]]
; CHECK: while.cond.16:
; CHECK-NEXT: br i1 undef, label [[WHILE_COND_16]], label [[WHILE_END:%.*]]
; CHECK: while.end:
; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[V2]], i32 undef
; CHECK-NEXT: store ptr [[ADD_PTR]], ptr @dfg_text, align 4
; CHECK-NEXT: [[SUB_PTR_RHS_CAST25:%.*]] = ptrtoint ptr [[ADD_PTR]] to i32
; CHECK-NEXT: switch i32 undef, label [[SW_DEFAULT:%.*]] [
; CHECK-NEXT: i32 65, label [[WHILE_BODYTHREAD_PRE_SPLIT]]
; CHECK-NEXT: i32 3, label [[RETURN:%.*]]
; CHECK-NEXT: i32 57, label [[WHILE_BODYTHREAD_PRE_SPLIT]]
; CHECK-NEXT: i32 60, label [[IF_THEN_14]]
; CHECK-NEXT: ]
; CHECK: sw.default:
; CHECK-NEXT: unreachable
; CHECK: return:
; CHECK-NEXT: ret void
;
entry:
br label %while.bodythread-pre-split

Expand All @@ -93,10 +150,10 @@ while.end: ; preds = %while.cond.16
%sub.ptr.rhs.cast25 = ptrtoint ptr %add.ptr to i32
%sub.ptr.sub26 = sub i32 0, %sub.ptr.rhs.cast25
switch i32 undef, label %sw.default [
i32 65, label %while.bodythread-pre-split
i32 3, label %return
i32 57, label %while.bodythread-pre-split
i32 60, label %if.then.14
i32 65, label %while.bodythread-pre-split
i32 3, label %return
i32 57, label %while.bodythread-pre-split
i32 60, label %if.then.14
]

sw.default: ; preds = %while.end
Expand Down
9 changes: 6 additions & 3 deletions llvm/test/Transforms/NewGVN/pr28562.ll
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -S -passes=newgvn < %s | FileCheck %s
define ptr @test1(ptr %a) {
; CHECK-LABEL: define ptr @test1(
; CHECK-SAME: ptr [[A:%.*]]) {
; CHECK-NEXT: [[X2:%.*]] = getelementptr i32, ptr [[A]], i32 10
; CHECK-NEXT: ret ptr [[X2]]
;
%x1 = getelementptr inbounds i32, ptr %a, i32 10
%x2 = getelementptr i32, ptr %a, i32 10
ret ptr %x2
; CHECK-LABEL: @test1(
; CHECK: %[[x:.*]] = getelementptr i32, ptr %a, i32 10
; CHECK: ret ptr %[[x]]
}
6 changes: 4 additions & 2 deletions llvm/test/Transforms/NewGVN/pr31472.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ target triple = "x86_64-apple-macosx10.12.0"
define i32 @main() personality ptr @__gxx_personality_v0{
; CHECK-LABEL: @main(
; CHECK-NEXT: [[TMP1:%.*]] = invoke i32 @foo()
; CHECK-NEXT: to label %good unwind label %bad
; CHECK-NEXT: to label [[GOOD:%.*]] unwind label [[BAD:%.*]]
; CHECK: good:
; CHECK-NEXT: ret i32 5
; CHECK: bad:
; CHECK-NEXT: [[TMP2:%.*]] = landingpad { ptr, i32
; CHECK-NEXT: [[TMP2:%.*]] = landingpad { ptr, i32 }
; CHECK-NEXT: cleanup
; CHECK-NEXT: resume { ptr, i32 } [[TMP2]]
;
%1 = invoke i32 @foo()
to label %good unwind label %bad
Expand Down
24 changes: 12 additions & 12 deletions llvm/test/Transforms/NewGVN/pr31483.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,36 +10,36 @@ define signext i32 @ham(ptr %arg, ptr %arg1) #0 {
; CHECK-LABEL: @ham(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[TMP:%.*]] = alloca ptr, align 8
; CHECK-NEXT: store ptr %arg1, ptr [[TMP]], align 8
; CHECK-NEXT: br label %bb2
; CHECK-NEXT: store ptr [[ARG1:%.*]], ptr [[TMP]], align 8
; CHECK-NEXT: br label [[BB2:%.*]]
; CHECK: bb2:
; CHECK-NEXT: [[TMP3:%.*]] = phi ptr [ %arg, %bb ], [ %tmp7, %bb22 ]
; CHECK-NEXT: [[TMP3:%.*]] = phi ptr [ [[ARG:%.*]], [[BB:%.*]] ], [ [[TMP7:%.*]], [[BB22:%.*]] ]
; CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 1
; CHECK-NEXT: [[TMP5:%.*]] = icmp ne i8 [[TMP4]], 0
; CHECK-NEXT: br i1 [[TMP5]], label %bb6, label %bb23
; CHECK-NEXT: br i1 [[TMP5]], label [[BB6:%.*]], label [[BB23:%.*]]
; CHECK: bb6:
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i8, ptr [[TMP3]], i32 1
; CHECK-NEXT: [[TMP7]] = getelementptr inbounds i8, ptr [[TMP3]], i32 1
; CHECK-NEXT: [[TMP9:%.*]] = zext i8 [[TMP4]] to i32
; CHECK-NEXT: switch i32 [[TMP9]], label %bb22 [
; CHECK-NEXT: i32 115, label %bb10
; CHECK-NEXT: i32 105, label %bb16
; CHECK-NEXT: i32 99, label %bb16
; CHECK-NEXT: switch i32 [[TMP9]], label [[BB22]] [
; CHECK-NEXT: i32 115, label [[BB10:%.*]]
; CHECK-NEXT: i32 105, label [[BB16:%.*]]
; CHECK-NEXT: i32 99, label [[BB16]]
; CHECK-NEXT: ]
; CHECK: bb10:
; CHECK-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP]], align 8
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr [[TMP11]], i64 8
; CHECK-NEXT: store ptr [[TMP12]], ptr [[TMP]], align 8
; CHECK-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP11]], align 8
; CHECK-NEXT: [[TMP15:%.*]] = call signext i32 (ptr, ...) @zot(ptr @global, ptr [[TMP14]])
; CHECK-NEXT: br label %bb22
; CHECK-NEXT: br label [[BB22]]
; CHECK: bb16:
; CHECK-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP]], align 8
; CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds i8, ptr [[TMP17]], i64 8
; CHECK-NEXT: store ptr [[TMP18]], ptr [[TMP]], align 8
; CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds i8, ptr [[TMP17]], i64 4
; CHECK-NEXT: br label %bb22
; CHECK-NEXT: br label [[BB22]]
; CHECK: bb22:
; CHECK-NEXT: br label %bb2
; CHECK-NEXT: br label [[BB2]]
; CHECK: bb23:
; CHECK-NEXT: call void @llvm.va_end(ptr [[TMP]])
; CHECK-NEXT: ret i32 undef
Expand Down
10 changes: 5 additions & 5 deletions llvm/test/Transforms/NewGVN/pr31491.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
define internal i32 @pr31491() {
; CHECK-LABEL: @pr31491(
; CHECK-NEXT: bb5:
; CHECK-NEXT: br label %bb7
; CHECK-NEXT: br label [[BB7:%.*]]
; CHECK: bb7:
; CHECK-NEXT: [[TMP:%.*]] = phi ptr [ [[TMP:%.*]]11, %bb10 ], [ undef, %bb5 ]
; CHECK-NEXT: br label %bb10
; CHECK-NEXT: [[TMP:%.*]] = phi ptr [ [[TMP11:%.*]], [[BB10:%.*]] ], [ undef, [[BB5:%.*]] ]
; CHECK-NEXT: br label [[BB10]]
; CHECK: bb10:
; CHECK-NEXT: [[TMP11:%.*]] = tail call ptr @patatino(ptr [[TMP]])
; CHECK-NEXT: br label %bb7
; CHECK-NEXT: [[TMP11]] = tail call ptr @patatino(ptr [[TMP]])
; CHECK-NEXT: br label [[BB7]]
;
bb5:
br label %bb7
Expand Down
32 changes: 16 additions & 16 deletions llvm/test/Transforms/NewGVN/pr31501.ll
Original file line number Diff line number Diff line change
Expand Up @@ -52,30 +52,30 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
define weak_odr hidden ptr @quux(ptr %arg, ptr %arg1) local_unnamed_addr #0 align 2 {
; CHECK-LABEL: @quux(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds %struct.barney, ptr %arg, i64 0, i32 3, i32 0, i32 0, i32 0
; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8, !tbaa !2
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds %struct.barney, ptr %arg, i64 0, i32 3, i32 0, i32 0, i32 0, i32 0, i32 1
; CHECK-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP4]], align 8, !tbaa !7
; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds [[STRUCT_BARNEY:%.*]], ptr [[ARG:%.*]], i64 0, i32 3, i32 0, i32 0, i32 0
; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[TMP]], align 8, !tbaa [[TBAA2:![0-9]+]]
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_BARNEY]], ptr [[ARG]], i64 0, i32 3, i32 0, i32 0, i32 0, i32 0, i32 1
; CHECK-NEXT: [[TMP6:%.*]] = load ptr, ptr [[TMP4]], align 8, !tbaa [[TBAA7:![0-9]+]]
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq ptr [[TMP3]], [[TMP6]]
; CHECK-NEXT: br i1 [[TMP7]], label %bb21, label %bb8
; CHECK-NEXT: br i1 [[TMP7]], label [[BB21:%.*]], label [[BB8:%.*]]
; CHECK: bb8:
; CHECK-NEXT: br label %bb11
; CHECK-NEXT: br label [[BB11:%.*]]
; CHECK: bb9:
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq ptr [[TMP18:%.*]], [[TMP6]]
; CHECK-NEXT: br i1 [[TMP10]], label %bb19, label %bb11
; CHECK-NEXT: br i1 [[TMP10]], label [[BB19:%.*]], label [[BB11]]
; CHECK: bb11:
; CHECK-NEXT: [[TMP12:%.*]] = phi ptr [ [[TMP17:%.*]], %bb9 ], [ undef, %bb8 ]
; CHECK-NEXT: [[TMP13:%.*]] = phi ptr [ [[TMP18]], %bb9 ], [ [[TMP3]], %bb8 ]
; CHECK-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP13]], align 8, !tbaa !8
; CHECK-NEXT: [[TMP16:%.*]] = icmp eq ptr [[TMP15]], %arg1
; CHECK-NEXT: [[TMP12:%.*]] = phi ptr [ [[TMP17:%.*]], [[BB9:%.*]] ], [ undef, [[BB8]] ]
; CHECK-NEXT: [[TMP13:%.*]] = phi ptr [ [[TMP18]], [[BB9]] ], [ [[TMP3]], [[BB8]] ]
; CHECK-NEXT: [[TMP15:%.*]] = load ptr, ptr [[TMP13]], align 8, !tbaa [[TBAA8:![0-9]+]]
; CHECK-NEXT: [[TMP16:%.*]] = icmp eq ptr [[TMP15]], [[ARG1:%.*]]
; CHECK-NEXT: [[TMP17]] = select i1 [[TMP16]], ptr [[TMP13]], ptr [[TMP12]]
; CHECK-NEXT: [[TMP18]] = getelementptr inbounds %struct.foo, ptr [[TMP13]], i64 1
; CHECK-NEXT: br i1 [[TMP16]], label %bb19, label %bb9
; CHECK-NEXT: [[TMP18]] = getelementptr inbounds [[STRUCT_FOO:%.*]], ptr [[TMP13]], i64 1
; CHECK-NEXT: br i1 [[TMP16]], label [[BB19]], label [[BB9]]
; CHECK: bb19:
; CHECK-NEXT: [[TMP20:%.*]] = phi ptr [ null, %bb9 ], [ [[TMP17]], %bb11 ]
; CHECK-NEXT: br label %bb21
; CHECK-NEXT: [[TMP20:%.*]] = phi ptr [ null, [[BB9]] ], [ [[TMP17]], [[BB11]] ]
; CHECK-NEXT: br label [[BB21]]
; CHECK: bb21:
; CHECK-NEXT: [[TMP22:%.*]] = phi ptr [ null, %bb ], [ [[TMP20]], %bb19 ]
; CHECK-NEXT: [[TMP22:%.*]] = phi ptr [ null, [[BB:%.*]] ], [ [[TMP20]], [[BB19]] ]
; CHECK-NEXT: ret ptr [[TMP22]]
;
bb:
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/NewGVN/pr31573.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ define void @patatino(ptr %blah) {
; CHECK: while.cond:
; CHECK-NEXT: [[MEH:%.*]] = phi ptr [ [[BLAH:%.*]], [[ENTRY:%.*]] ], [ null, [[WHILE_BODY:%.*]] ]
; CHECK-NEXT: switch i32 undef, label [[WHILE_BODY]] [
; CHECK-NEXT: i32 666, label [[WHILE_END:%.*]]
; CHECK-NEXT: i32 666, label [[WHILE_END:%.*]]
; CHECK-NEXT: ]
; CHECK: while.body:
; CHECK-NEXT: br label [[WHILE_COND]]
Expand Down
10 changes: 5 additions & 5 deletions llvm/test/Transforms/NewGVN/pr31594.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ define i1 @patatino(ptr %blah, i32 %choice) {
; CHECK: while.cond:
; CHECK-NEXT: [[FOO:%.*]] = phi ptr [ [[BLAH:%.*]], [[ENTRY:%.*]] ], [ null, [[WHILE_BODY:%.*]] ]
; CHECK-NEXT: switch i32 [[CHOICE:%.*]], label [[WHILE_BODY]] [
; CHECK-NEXT: i32 -1, label [[WHILE_END:%.*]]
; CHECK-NEXT: i32 40, label [[LAND_END:%.*]]
; CHECK-NEXT: i32 -1, label [[WHILE_END:%.*]]
; CHECK-NEXT: i32 40, label [[LAND_END:%.*]]
; CHECK-NEXT: ]
; CHECK: land.end:
; CHECK-NEXT: br label [[WHILE_END]]
Expand Down Expand Up @@ -66,21 +66,21 @@ define void @foo(ptr %arg) {
; CHECK: bb2:
; CHECK-NEXT: br label [[BB1]]
; CHECK: bb3:
; CHECK-NEXT: store i8 0, ptr [[TMP]], align 1, !g !0
; CHECK-NEXT: store i8 0, ptr [[TMP]], align 1, !g [[META0:![0-9]+]]
; CHECK-NEXT: br label [[BB4:%.*]]
; CHECK: bb4:
; CHECK-NEXT: br label [[BB6:%.*]]
; CHECK: bb6:
; CHECK-NEXT: br i1 undef, label [[BB9:%.*]], label [[BB7:%.*]]
; CHECK: bb7:
; CHECK-NEXT: switch i8 0, label [[BB6]] [
; CHECK-NEXT: i8 6, label [[BB8:%.*]]
; CHECK-NEXT: i8 6, label [[BB8:%.*]]
; CHECK-NEXT: ]
; CHECK: bb8:
; CHECK-NEXT: store i8 poison, ptr null, align 1
; CHECK-NEXT: br label [[BB4]]
; CHECK: bb9:
; CHECK-NEXT: store i8 0, ptr [[ARG]], align 1, !g !0
; CHECK-NEXT: store i8 0, ptr [[ARG]], align 1, !g [[META0]]
; CHECK-NEXT: unreachable
;
bb:
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/Transforms/NewGVN/pr31613.ll
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ declare void @c.d.p(i64, ptr)
define void @e(i32 %a0, i32 %a1, ptr %p2) {
; CHECK-LABEL: @e(
; CHECK-NEXT: [[F:%.*]] = alloca i32, align 4
; CHECK-NEXT: store i32 [[A0:%.*]], ptr [[F]], align 4, !g !0
; CHECK-NEXT: store i32 [[A0:%.*]], ptr [[F]], align 4, !g [[META0:![0-9]+]]
; CHECK-NEXT: br label [[H:%.*]]
; CHECK: h:
; CHECK-NEXT: call void @c.d.p(i64 8, ptr undef)
Expand All @@ -88,10 +88,10 @@ define void @e(i32 %a0, i32 %a1, ptr %p2) {
; CHECK-NEXT: br label [[R]]
; CHECK: r:
; CHECK-NEXT: switch i32 undef, label [[N:%.*]] [
; CHECK-NEXT: i32 0, label [[S:%.*]]
; CHECK-NEXT: i32 0, label [[S:%.*]]
; CHECK-NEXT: ]
; CHECK: s:
; CHECK-NEXT: store i32 [[A1:%.*]], ptr [[F]], align 4, !g !0
; CHECK-NEXT: store i32 [[A1:%.*]], ptr [[F]], align 4, !g [[META0]]
; CHECK-NEXT: br label [[H]]
; CHECK: n:
; CHECK-NEXT: ret void
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/NewGVN/pr31682.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
define void @bar() {
; CHECK-LABEL: @bar(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[TMP:%.*]] = load ptr, ptr @global
; CHECK-NEXT: [[TMP:%.*]] = load ptr, ptr @global, align 8
; CHECK-NEXT: br label [[BB2:%.*]]
; CHECK: bb2:
; CHECK-NEXT: br i1 undef, label [[BB2]], label [[BB7:%.*]]
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/NewGVN/pr31758.ll
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ define void @tinkywinky() {
; CHECK: bb90:
; CHECK-NEXT: br label [[BB90]]
; CHECK: bb138:
; CHECK-NEXT: store i8 poison, ptr null
; CHECK-NEXT: store i8 poison, ptr null, align 1
; CHECK-NEXT: br label [[BB138:%.*]]
;
bb:
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/NewGVN/pr32607.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ define hidden void @foo() {
; CHECK: if:
; CHECK-NEXT: br i1 false, label [[L50:%.*]], label [[IF]]
; CHECK: L50:
; CHECK-NEXT: store i8 poison, ptr null
; CHECK-NEXT: store i8 poison, ptr null, align 1
; CHECK-NEXT: ret void
;
top:
Expand Down
8 changes: 4 additions & 4 deletions llvm/test/Transforms/NewGVN/pr32836.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@
@b = external global %struct.anon
define void @tinkywinky(i1 %patatino) {
; CHECK-LABEL: @tinkywinky(
; CHECK-NEXT: store i32 8, ptr null
; CHECK-NEXT: store i32 8, ptr null, align 4
; CHECK-NEXT: br i1 [[PATATINO:%.*]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
; CHECK: if.then:
; CHECK-NEXT: br label [[L:%.*]]
; CHECK: L:
; CHECK-NEXT: br label [[IF_END]]
; CHECK: if.end:
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr null
; CHECK-NEXT: [[BF_LOAD1:%.*]] = load i32, ptr @b
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr null, align 4
; CHECK-NEXT: [[BF_LOAD1:%.*]] = load i32, ptr @b, align 4
; CHECK-NEXT: [[BF_VALUE:%.*]] = and i32 [[TMP1]], 536870911
; CHECK-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD1]], -536870912
; CHECK-NEXT: [[BF_SET:%.*]] = or i32 [[BF_CLEAR]], [[BF_VALUE]]
; CHECK-NEXT: store i32 [[BF_SET]], ptr @b
; CHECK-NEXT: store i32 [[BF_SET]], ptr @b, align 4
; CHECK-NEXT: br label [[LOR_END:%.*]]
; CHECK: lor.end:
; CHECK-NEXT: br label [[L]]
Expand Down
8 changes: 4 additions & 4 deletions llvm/test/Transforms/NewGVN/pr32838.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ define void @fn1(i64 noundef %arg) {
; CHECK: if.then:
; CHECK-NEXT: br i1 false, label [[FIRSTPHIBLOCK:%.*]], label [[TEMP:%.*]]
; CHECK: firstphiblock:
; CHECK-NEXT: br i1 undef, label %for.cond17thread-pre-split, label [[SECONDPHIBLOCK:%.*]]
; CHECK-NEXT: br i1 undef, label [[FOR_COND17THREAD_PRE_SPLIT:%.*]], label [[SECONDPHIBLOCK:%.*]]
; CHECK: secondphiblock:
; CHECK-NEXT: [[SECONDPHI:%.*]] = phi i64 [ [[THIRDPHI:%.*]], [[THIRDPHIBLOCK:%.*]] ], [ undef, [[FIRSTPHIBLOCK]] ]
; CHECK-NEXT: br i1 undef, label [[FIRSTPHIBLOCK]], label [[THIRDPHIBLOCK]]
Expand Down Expand Up @@ -55,7 +55,7 @@ define void @fn2(i64 noundef %arg) {
; CHECK-NEXT: br i1 false, label [[FIRSTPHIBLOCK:%.*]], label [[TEMP:%.*]]
; CHECK: firstphiblock:
; CHECK-NEXT: [[FIRSTPHI:%.*]] = phi i64 [ poison, [[IF_THEN]] ], [ [[SECONDPHI:%.*]], [[SECONDPHIBLOCK:%.*]] ]
; CHECK-NEXT: br i1 undef, label %for.cond17thread-pre-split, label [[SECONDPHIBLOCK]]
; CHECK-NEXT: br i1 undef, label [[FOR_COND17THREAD_PRE_SPLIT:%.*]], label [[SECONDPHIBLOCK]]
; CHECK: secondphiblock:
; CHECK-NEXT: [[SECONDPHI]] = phi i64 [ [[THIRDPHI:%.*]], [[THIRDPHIBLOCK:%.*]] ], [ [[FIRSTPHI]], [[FIRSTPHIBLOCK]] ]
; CHECK-NEXT: br i1 undef, label [[FIRSTPHIBLOCK]], label [[THIRDPHIBLOCK]]
Expand All @@ -65,7 +65,7 @@ define void @fn2(i64 noundef %arg) {
; CHECK: for.cond17thread-pre-split:
; CHECK-NEXT: br label [[COND_TRUE]]
; CHECK: cond.true:
; CHECK-NEXT: [[FOURTHPHI:%.*]] = phi i64 [ [[ARG:%.*]], [[ENTRY:%.*]] ], [ [[FIRSTPHI]], %for.cond17thread-pre-split ]
; CHECK-NEXT: [[FOURTHPHI:%.*]] = phi i64 [ [[ARG:%.*]], [[ENTRY:%.*]] ], [ [[FIRSTPHI]], [[FOR_COND17THREAD_PRE_SPLIT]] ]
; CHECK-NEXT: [[DIV]] = sdiv i64 [[FOURTHPHI]], 4
; CHECK-NEXT: br label [[THIRDPHIBLOCK]]
; CHECK: temp:
Expand Down Expand Up @@ -105,7 +105,7 @@ define void @fn3() {
; CHECK-NEXT: [[F_0:%.*]] = phi ptr [ @b, [[ENTRY:%.*]] ], [ @a, [[L1_LOOPEXIT:%.*]] ]
; CHECK-NEXT: br label [[FOR_COND:%.*]]
; CHECK: for.cond.loopexit:
; CHECK-NEXT: store i8 poison, ptr null
; CHECK-NEXT: store i8 poison, ptr null, align 1
; CHECK-NEXT: br label [[FOR_COND]]
; CHECK: for.cond:
; CHECK-NEXT: br i1 undef, label [[FOR_END14:%.*]], label [[FOR_COND1_PREHEADER:%.*]]
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/NewGVN/pr32845.ll
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ define void @tinkywinky() {
; CHECK-NEXT: [[F_0:%.*]] = phi ptr [ @b, [[ENTRY:%.*]] ], [ @a, [[L1_LOOPEXIT:%.*]] ]
; CHECK-NEXT: br label [[FOR_COND:%.*]]
; CHECK: for.cond.loopexit:
; CHECK-NEXT: store i8 poison, ptr null
; CHECK-NEXT: store i8 poison, ptr null, align 1
; CHECK-NEXT: br label [[FOR_COND]]
; CHECK: for.cond:
; CHECK-NEXT: br i1 undef, label [[FOR_END14:%.*]], label [[FOR_COND1_PREHEADER:%.*]]
Expand Down
16 changes: 15 additions & 1 deletion llvm/test/Transforms/NewGVN/pr32852.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; Make sure GVN doesn't incorrectly think the branch terminating
; bb2 has a constant condition.
; RUN: opt -S -passes=newgvn %s | FileCheck %s
Expand All @@ -6,13 +7,26 @@
@patatino = private unnamed_addr constant [3 x i8] c"0\0A\00"

define void @tinkywinky() {
; CHECK-LABEL: define void @tinkywinky() {
; CHECK-NEXT: bb:
; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr @a, align 4
; CHECK-NEXT: [[TMP1:%.*]] = icmp sge i32 [[TMP]], 0
; CHECK-NEXT: br i1 [[TMP1]], label [[BB2:%.*]], label [[BB7:%.*]]
; CHECK: bb2:
; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i32 [[TMP]], 0
; CHECK-NEXT: br i1 [[TMP4]], label [[BB5:%.*]], label [[BB7]]
; CHECK: bb5:
; CHECK-NEXT: [[TMP6:%.*]] = call i32 (ptr, ...) @printf(ptr @patatino)
; CHECK-NEXT: br label [[BB7]]
; CHECK: bb7:
; CHECK-NEXT: ret void
;
bb:
%tmp = load i32, ptr @a
%tmp1 = icmp sge i32 %tmp, 0
br i1 %tmp1, label %bb2, label %bb7
bb2:
%tmp4 = icmp sgt i32 %tmp, 0
; CHECK: br i1 %tmp4, label %bb5, label %bb7
br i1 %tmp4, label %bb5, label %bb7
bb5:
%tmp6 = call i32 (ptr, ...) @printf(ptr @patatino)
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/NewGVN/pr32897.ll
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ define void @tinkywinky(ptr %b) {
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[BODY:%.*]]
; CHECK: body:
; CHECK-NEXT: store i64 undef, ptr [[B:%.*]]
; CHECK-NEXT: store i64 undef, ptr [[B:%.*]], align 4
; CHECK-NEXT: br i1 undef, label [[BODY]], label [[END:%.*]]
; CHECK: end:
; CHECK-NEXT: br label [[BODY]]
Expand Down
62 changes: 32 additions & 30 deletions llvm/test/Transforms/NewGVN/pr32934.ll
Original file line number Diff line number Diff line change
@@ -1,39 +1,41 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -S -passes=newgvn %s | FileCheck %s

; CHECK: define void @tinkywinky() {
; CHECK-NEXT: entry:
; CHECK-NEXT: %d = alloca i32, align 4
; CHECK-NEXT: store i32 0, ptr null, align 4
; CHECK-NEXT: br label %for.cond
; CHECK: for.cond: ; preds = %if.end, %entry
; CHECK-NEXT: %0 = load i32, ptr null, align 4
; CHECK-NEXT: %cmp = icmp slt i32 %0, 1
; CHECK-NEXT: br i1 %cmp, label %for.body, label %while.cond
; CHECK: for.body: ; preds = %for.cond
; CHECK-NEXT: %1 = load i32, ptr @a, align 4
; CHECK-NEXT: store i32 %1, ptr %d, align 4
; CHECK-NEXT: br label %L
; CHECK: L: ; preds = %if.then, %for.body
; CHECK-NEXT: %tobool = icmp ne i32 %1, 0
; CHECK-NEXT: br i1 %tobool, label %if.then, label %if.end
; CHECK: if.then: ; preds = %L
; CHECK-NEXT: call void (ptr, ...) @printf(ptr @patatino)
; CHECK-NEXT: br label %L
; CHECK: if.end: ; preds = %L
; CHECK-NEXT: br label %for.cond
; CHECK: while.cond: ; preds = %while.body, %for.cond
; CHECK-NEXT: br i1 undef, label %while.body, label %while.end
; CHECK: while.body: ; preds = %while.cond
; CHECK-NEXT: call void (ptr, ...) @printf(ptr @patatino)
; CHECK-NEXT: br label %while.cond
; CHECK: while.end:
; CHECK-NEXT: %2 = load i32, ptr @a, align 4
; CHECK-NEXT: store i32 %2, ptr undef, align 4
; CHECK-NEXT: ret void

@a = external global i32, align 4
@patatino = external unnamed_addr constant [2 x i8], align 1
define void @tinkywinky() {
; CHECK-LABEL: define void @tinkywinky() {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[D:%.*]] = alloca i32, align 4
; CHECK-NEXT: store i32 0, ptr null, align 4
; CHECK-NEXT: br label [[FOR_COND:%.*]]
; CHECK: for.cond:
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr null, align 4
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 1
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[WHILE_COND:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
; CHECK-NEXT: store i32 [[TMP1]], ptr [[D]], align 4
; CHECK-NEXT: br label [[L:%.*]]
; CHECK: L:
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP1]], 0
; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
; CHECK: if.then:
; CHECK-NEXT: call void (ptr, ...) @printf(ptr @patatino)
; CHECK-NEXT: br label [[L]]
; CHECK: if.end:
; CHECK-NEXT: br label [[FOR_COND]]
; CHECK: while.cond:
; CHECK-NEXT: br i1 undef, label [[WHILE_BODY:%.*]], label [[WHILE_END:%.*]]
; CHECK: while.body:
; CHECK-NEXT: call void (ptr, ...) @printf(ptr @patatino)
; CHECK-NEXT: br label [[WHILE_COND]]
; CHECK: while.end:
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr @a, align 4
; CHECK-NEXT: store i32 [[TMP2]], ptr undef, align 4
; CHECK-NEXT: ret void
;
entry:
%d = alloca i32, align 4
store i32 0, ptr null, align 4
Expand Down
21 changes: 20 additions & 1 deletion llvm/test/Transforms/NewGVN/pr32945.ll
Original file line number Diff line number Diff line change
@@ -1,9 +1,28 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -S -passes=newgvn %s | FileCheck %s
; CHECK-NOT: call i32 @llvm.ssa.copy

@d = external global i32
@e = external global i32
define void @tinkywinky() {
; CHECK-LABEL: define void @tinkywinky() {
; CHECK-NEXT: br i1 true, label [[LOR_LHS_FALSE:%.*]], label [[COND_TRUE:%.*]]
; CHECK: lor.lhs.false:
; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr @d, align 4
; CHECK-NEXT: [[PATATINO:%.*]] = load i32, ptr null, align 4
; CHECK-NEXT: [[OR:%.*]] = or i32 [[TMP]], [[PATATINO]]
; CHECK-NEXT: store i32 [[OR]], ptr @d, align 4
; CHECK-NEXT: br label [[COND_TRUE]]
; CHECK: cond.true:
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @e, align 4
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr @d, align 4
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP1]], [[TMP2]]
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE6:%.*]], label [[COND_FALSE:%.*]]
; CHECK: cond.true6:
; CHECK-NEXT: [[CMP7:%.*]] = icmp slt i32 [[TMP1]], 0
; CHECK-NEXT: br i1 [[CMP7]], label [[COND_FALSE]], label [[COND_FALSE]]
; CHECK: cond.false:
; CHECK-NEXT: ret void
;
br i1 true, label %lor.lhs.false, label %cond.true
lor.lhs.false:
%tmp = load i32, ptr @d, align 4
Expand Down
30 changes: 26 additions & 4 deletions llvm/test/Transforms/NewGVN/pr32952.ll
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; PR32952: Don't erroneously consider congruent two phi nodes which
; have the same arguments but different incoming edges.
; RUN: opt -passes=newgvn -S %s | FileCheck %s
Expand All @@ -6,6 +7,31 @@
@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1

define i32 @tinkywinky() {
; CHECK-LABEL: define i32 @tinkywinky() {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @a, align 2
; CHECK-NEXT: [[CONV:%.*]] = sext i16 [[TMP0]] to i32
; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[CONV]], -1
; CHECK-NEXT: [[CONV1:%.*]] = trunc i32 [[NEG]] to i16
; CHECK-NEXT: [[CONV3:%.*]] = zext i16 [[CONV1]] to i32
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[CONV]], [[CONV3]]
; CHECK-NEXT: br i1 [[CMP]], label [[TINKY:%.*]], label [[WINKY:%.*]]
; CHECK: tinky:
; CHECK-NEXT: store i16 2, ptr @a, align 2
; CHECK-NEXT: br label [[PATATINO:%.*]]
; CHECK: winky:
; CHECK-NEXT: br label [[PATATINO]]
; CHECK: patatino:
; CHECK-NEXT: [[MEH:%.*]] = phi i16 [ [[TMP0]], [[WINKY]] ], [ [[CONV1]], [[TINKY]] ]
; CHECK-NEXT: [[BANANA:%.*]] = phi i16 [ [[TMP0]], [[TINKY]] ], [ [[CONV1]], [[WINKY]] ]
; CHECK-NEXT: br label [[END:%.*]]
; CHECK: end:
; CHECK-NEXT: [[PROMOTED:%.*]] = zext i16 [[BANANA]] to i32
; CHECK-NEXT: [[OTHER:%.*]] = zext i16 [[MEH]] to i32
; CHECK-NEXT: [[FIRST:%.*]] = tail call i32 (ptr, ...) @printf(ptr @.str, i32 [[PROMOTED]])
; CHECK-NEXT: [[SECOND:%.*]] = tail call i32 (ptr, ...) @printf(ptr @.str, i32 [[OTHER]])
; CHECK-NEXT: ret i32 0
;
entry:
%0 = load i16, ptr @a, align 2
%conv = sext i16 %0 to i32
Expand All @@ -23,15 +49,11 @@ winky:
br label %patatino

patatino:
; CHECK: %meh = phi i16 [ %0, %winky ], [ %conv1, %tinky ]
; CHECK: %banana = phi i16 [ %0, %tinky ], [ %conv1, %winky ]
%meh = phi i16 [ %0, %winky ], [ %conv1, %tinky ]
%banana = phi i16 [ %0, %tinky ], [ %conv1, %winky ]
br label %end

end:
; CHECK: %promoted = zext i16 %banana to i32
; CHECK: %other = zext i16 %meh to i32
%promoted = zext i16 %banana to i32
%other = zext i16 %meh to i32
%first = tail call i32 (ptr, ...) @printf(ptr @.str, i32 %promoted)
Expand Down
47 changes: 24 additions & 23 deletions llvm/test/Transforms/NewGVN/pr33014.ll
Original file line number Diff line number Diff line change
@@ -1,33 +1,34 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; Make sure we don't end up in an infinite recursion in singleReachablePHIPath().
; RUN: opt < %s -passes=newgvn -S | FileCheck %s

@c = external global i64, align 8

; CHECK-LABEL: define void @tinkywinky() {
; CHECK: entry:
; CHECK-NEXT: br i1 undef, label %l2, label %if.then
; CHECK: if.then: ; preds = %entry
; CHECK-NEXT: br label %for.body
; CHECK: ph: ; preds = %back, %ontrue
; CHECK-NEXT: br label %for.body
; CHECK: for.body: ; preds = %ph, %if.then
; CHECK-NEXT: br i1 undef, label %ontrue, label %onfalse
; CHECK: onfalse: ; preds = %for.body
; CHECK-NEXT: %patatino = load i64, ptr @c
; CHECK-NEXT: ret void
; CHECK: ontrue: ; preds = %for.body
; CHECK-NEXT: %dipsy = load i64, ptr @c
; CHECK-NEXT: br label %ph
; CHECK: back: ; preds = %l2
; CHECK-NEXT: store i8 poison, ptr null
; CHECK-NEXT: br label %ph
; CHECK: end: ; preds = %l2
; CHECK-NEXT: ret void
; CHECK: l2: ; preds = %entry
; CHECK-NEXT: br i1 false, label %back, label %end
; CHECK-NEXT: }

define void @tinkywinky() {
; CHECK-LABEL: define void @tinkywinky() {
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 undef, label [[L2:%.*]], label [[IF_THEN:%.*]]
; CHECK: if.then:
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
; CHECK: ph:
; CHECK-NEXT: br label [[FOR_BODY]]
; CHECK: for.body:
; CHECK-NEXT: br i1 undef, label [[ONTRUE:%.*]], label [[ONFALSE:%.*]]
; CHECK: onfalse:
; CHECK-NEXT: [[PATATINO:%.*]] = load i64, ptr @c, align 4
; CHECK-NEXT: ret void
; CHECK: ontrue:
; CHECK-NEXT: [[DIPSY:%.*]] = load i64, ptr @c, align 4
; CHECK-NEXT: br label [[PH:%.*]]
; CHECK: back:
; CHECK-NEXT: store i8 poison, ptr null, align 1
; CHECK-NEXT: br label [[PH]]
; CHECK: end:
; CHECK-NEXT: ret void
; CHECK: l2:
; CHECK-NEXT: br i1 false, label [[BACK:%.*]], label [[END:%.*]]
;
entry:
br i1 undef, label %l2, label %if.then
if.then:
Expand Down
47 changes: 24 additions & 23 deletions llvm/test/Transforms/NewGVN/pr33086.ll
Original file line number Diff line number Diff line change
@@ -1,31 +1,32 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -passes=newgvn -S %s | FileCheck %s
; REQUIRES: asserts

; CHECK-LABEL: define void @tinkywinky() {
; CHECK: entry:
; CHECK-NEXT: br i1 undef, label %for.cond18, label %for.cond.preheader
; CHECK: for.cond.preheader:
; CHECK-NEXT: br label %for.cond2thread-pre-split
; CHECK: for.cond2thread-pre-split:
; CHECK-NEXT: %conv24 = phi i32 [ 0, %for.cond.preheader ], [ %conv, %for.inc.split ]
; CHECK-NEXT: br label %for.inc.split
; CHECK: for.inc.split:
; CHECK-NEXT: %add = shl nsw i32 %conv24, 16
; CHECK-NEXT: %sext23 = add i32 %add, 65536
; CHECK-NEXT: %conv = ashr exact i32 %sext23, 16
; CHECK-NEXT: %cmp = icmp slt i32 %sext23, 3604480
; CHECK-NEXT: br i1 %cmp, label %for.cond2thread-pre-split, label %l1.loopexit
; CHECK: l1.loopexit:
; CHECK-NEXT: br label %l1
; CHECK: l1:
; CHECK-NEXT: %0 = load i16, ptr null, align 2
; CHECK-NEXT: %g.0.g.0..pr = load i16, ptr null, align 2
; CHECK-NEXT: ret void
; CHECK: for.cond18:
; CHECK-NEXT: br label %l1
; CHECK-NEXT: }

define void @tinkywinky() {
; CHECK-LABEL: define void @tinkywinky() {
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 undef, label [[FOR_COND18:%.*]], label [[FOR_COND_PREHEADER:%.*]]
; CHECK: for.cond.preheader:
; CHECK-NEXT: br label [[FOR_COND2THREAD_PRE_SPLIT:%.*]]
; CHECK: for.cond2thread-pre-split:
; CHECK-NEXT: [[CONV24:%.*]] = phi i32 [ 0, [[FOR_COND_PREHEADER]] ], [ [[CONV:%.*]], [[FOR_INC_SPLIT:%.*]] ]
; CHECK-NEXT: br label [[FOR_INC_SPLIT]]
; CHECK: for.inc.split:
; CHECK-NEXT: [[ADD:%.*]] = shl nsw i32 [[CONV24]], 16
; CHECK-NEXT: [[SEXT23:%.*]] = add i32 [[ADD]], 65536
; CHECK-NEXT: [[CONV]] = ashr exact i32 [[SEXT23]], 16
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[SEXT23]], 3604480
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_COND2THREAD_PRE_SPLIT]], label [[L1_LOOPEXIT:%.*]]
; CHECK: l1.loopexit:
; CHECK-NEXT: br label [[L1:%.*]]
; CHECK: l1:
; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr null, align 2
; CHECK-NEXT: [[G_0_G_0__PR:%.*]] = load i16, ptr null, align 2
; CHECK-NEXT: ret void
; CHECK: for.cond18:
; CHECK-NEXT: br label [[L1]]
;
entry:
br i1 undef, label %for.cond18, label %for.cond.preheader

Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/NewGVN/pr33116.ll
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ define void @b() {
; CHECK: c:
; CHECK-NEXT: br i1 undef, label [[IF_G:%.*]], label [[IF_E]]
; CHECK: if.g:
; CHECK-NEXT: store i32 undef, ptr @a
; CHECK-NEXT: store i32 undef, ptr @a, align 4
; CHECK-NEXT: br label [[WHILE_D]]
; CHECK: if.e:
; CHECK-NEXT: br label [[F]]
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/Transforms/NewGVN/pr33187.ll
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ define void @fn1() local_unnamed_addr #0 {
; CHECK: while.body12:
; CHECK-NEXT: br i1 undef, label [[IF_END18]], label [[L]]
; CHECK: L.loopexit:
; CHECK-NEXT: store i8 poison, ptr null
; CHECK-NEXT: store i8 poison, ptr null, align 1
; CHECK-NEXT: br label [[L]]
; CHECK: L:
; CHECK-NEXT: [[H_125]] = phi i32 [ [[H_127]], [[WHILE_BODY12]] ], [ poison, [[L_LOOPEXIT]] ]
Expand Down Expand Up @@ -114,13 +114,13 @@ attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="fals
define void @a() {
; CHECK-LABEL: @a(
; CHECK-NEXT: b:
; CHECK-NEXT: store ptr null, ptr null
; CHECK-NEXT: store ptr null, ptr null, align 8
; CHECK-NEXT: br label [[D:%.*]]
; CHECK: d:
; CHECK-NEXT: [[I:%.*]] = phi ptr [ null, [[B:%.*]] ], [ [[E:%.*]], [[F:%.*]] ]
; CHECK-NEXT: br i1 undef, label [[F]], label [[G:%.*]]
; CHECK: g:
; CHECK-NEXT: store ptr [[I]], ptr null
; CHECK-NEXT: store ptr [[I]], ptr null, align 8
; CHECK-NEXT: unreachable
; CHECK: f:
; CHECK-NEXT: [[E]] = getelementptr i8, ptr [[I]], i64 1
Expand Down
57 changes: 29 additions & 28 deletions llvm/test/Transforms/NewGVN/pr33196.ll
Original file line number Diff line number Diff line change
@@ -1,40 +1,41 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt -S -passes=newgvn %s | FileCheck %s

; CHECK: define i32 @main() {
; CHECK-NEXT: entry:
; CHECK-NEXT: %tmp = load i32, ptr @d, align 4
; CHECK-NEXT: %tmp1 = load i32, ptr @c, align 4
; CHECK-NEXT: %tobool = icmp eq i32 %tmp1, -1
; CHECK-NEXT: br i1 %tobool, label %if.end, label %if.then
; CHECK: if.then:
; CHECK-NEXT: br label %L
; CHECK: L:
; CHECK-NEXT: %e.0 = phi i32 [ 0, %if.then ], [ %e.1, %if.then4 ]
; CHECK-NEXT: br label %if.end
; CHECK: if.end:
; CHECK-NEXT: %e.1 = phi i32 [ %e.0, %L ], [ %tmp, %entry ]
; CHECK-NEXT: store i32 %e.1, ptr @a, align 4
; CHECK-NEXT: %tmp2 = load i32, ptr @b, align 4
; CHECK-NEXT: store i32 0, ptr @b, align 4
; CHECK-NEXT: %sext = shl i32 %tmp2, 16
; CHECK-NEXT: %conv1 = ashr exact i32 %sext, 16
; CHECK-NEXT: %add = add nsw i32 %conv1, %tmp1
; CHECK-NEXT: %add2 = add nsw i32 %add, %e.1
; CHECK-NEXT: store i32 %add2, ptr @a, align 4
; CHECK-NEXT: %tobool3 = icmp eq i32 %add2, 0
; CHECK-NEXT: br i1 %tobool3, label %if.end5, label %if.then4
; CHECK: if.then4:
; CHECK-NEXT: br label %L
; CHECK: if.end5:
; CHECK-NEXT: ret i32 0
; CHECK-NEXT: }

@d = global i32 1, align 4
@c = common global i32 0, align 4
@a = common global i32 0, align 4
@b = common global i32 0, align 4

define i32 @main() {
; CHECK-LABEL: define i32 @main() {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[TMP:%.*]] = load i32, ptr @d, align 4
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @c, align 4
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[TMP1]], -1
; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
; CHECK: if.then:
; CHECK-NEXT: br label [[L:%.*]]
; CHECK: L:
; CHECK-NEXT: [[E_0:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[E_1:%.*]], [[IF_THEN4:%.*]] ]
; CHECK-NEXT: br label [[IF_END]]
; CHECK: if.end:
; CHECK-NEXT: [[E_1]] = phi i32 [ [[E_0]], [[L]] ], [ [[TMP]], [[ENTRY:%.*]] ]
; CHECK-NEXT: store i32 [[E_1]], ptr @a, align 4
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr @b, align 4
; CHECK-NEXT: store i32 0, ptr @b, align 4
; CHECK-NEXT: [[SEXT:%.*]] = shl i32 [[TMP2]], 16
; CHECK-NEXT: [[CONV1:%.*]] = ashr exact i32 [[SEXT]], 16
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV1]], [[TMP1]]
; CHECK-NEXT: [[ADD2:%.*]] = add nsw i32 [[ADD]], [[E_1]]
; CHECK-NEXT: store i32 [[ADD2]], ptr @a, align 4
; CHECK-NEXT: [[TOBOOL3:%.*]] = icmp eq i32 [[ADD2]], 0
; CHECK-NEXT: br i1 [[TOBOOL3]], label [[IF_END5:%.*]], label [[IF_THEN4]]
; CHECK: if.then4:
; CHECK-NEXT: br label [[L]]
; CHECK: if.end5:
; CHECK-NEXT: ret i32 0
;
entry:
%tmp = load i32, ptr @d, align 4
%tmp1 = load i32, ptr @c, align 4
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/Transforms/NewGVN/pr33204.ll
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ define void @hoge(i32 %arg) {
; CHECK-NEXT: [[TMP:%.*]] = phi i32 [ 0, [[BB1:%.*]] ], [ [[ARG:%.*]], [[BB:%.*]] ]
; CHECK-NEXT: br label [[BB6:%.*]]
; CHECK: bb3:
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr @global, align 4, !h !0
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr @global, align 4, !h [[META0:![0-9]+]]
; CHECK-NEXT: unreachable
; CHECK: bb6:
; CHECK-NEXT: store i32 [[TMP]], ptr @global.1, align 4, !h !0
; CHECK-NEXT: store i32 [[TMP]], ptr @global.1, align 4, !h [[META0]]
; CHECK-NEXT: br i1 undef, label [[BB7:%.*]], label [[BB1]]
; CHECK: bb7:
; CHECK-NEXT: br i1 undef, label [[BB10:%.*]], label [[BB8:%.*]]
Expand All @@ -33,7 +33,7 @@ define void @hoge(i32 %arg) {
; CHECK-NEXT: store i8 poison, ptr null, align 1
; CHECK-NEXT: br label [[BB3]]
; CHECK: bb10:
; CHECK-NEXT: store i32 0, ptr @global, align 4, !h !0
; CHECK-NEXT: store i32 0, ptr @global, align 4, !h [[META0]]
; CHECK-NEXT: br label [[BB7]]
;
bb:
Expand Down
30 changes: 15 additions & 15 deletions llvm/test/Transforms/NewGVN/pr33305.ll
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@ target triple = "x86_64-apple-macosx10.12.0"
define i32 @main() local_unnamed_addr #0 {
; CHECK-LABEL: @main(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[DOTPR_I:%.*]] = load i32, ptr @c, align 4, !tbaa !3
; CHECK-NEXT: [[DOTPR_I:%.*]] = load i32, ptr @c, align 4, !tbaa [[TBAA3:![0-9]+]]
; CHECK-NEXT: [[CMP13_I:%.*]] = icmp slt i32 [[DOTPR_I]], 1
; CHECK-NEXT: br i1 [[CMP13_I]], label [[FOR_COND1_PREHEADER_LR_PH_I:%.*]], label [[ENTRY_FOR_END9_I_CRIT_EDGE:%.*]]
; CHECK: entry.for.end9.i_crit_edge:
; CHECK-NEXT: [[DOTPRE:%.*]] = load i32, ptr @h, align 4, !tbaa !3
; CHECK-NEXT: [[DOTPRE:%.*]] = load i32, ptr @h, align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: br label [[FOR_END9_I:%.*]]
; CHECK: for.cond1.preheader.lr.ph.i:
; CHECK-NEXT: [[G_PROMOTED14_I:%.*]] = load i32, ptr @g, align 4, !tbaa !3
; CHECK-NEXT: [[G_PROMOTED14_I:%.*]] = load i32, ptr @g, align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: br label [[FOR_COND1_PREHEADER_I:%.*]]
; CHECK: for.cond1.preheader.i:
; CHECK-NEXT: [[INC816_I:%.*]] = phi i32 [ [[DOTPR_I]], [[FOR_COND1_PREHEADER_LR_PH_I]] ], [ [[INC8_I:%.*]], [[FOR_INC7_I:%.*]] ]
Expand All @@ -42,9 +42,9 @@ define i32 @main() local_unnamed_addr #0 {
; CHECK: lor.rhs.i:
; CHECK-NEXT: [[LNOT_I:%.*]] = xor i1 [[TOBOOL_I]], true
; CHECK-NEXT: [[LNOT_EXT_I:%.*]] = zext i1 [[LNOT_I]] to i32
; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr @e, align 4, !tbaa !3
; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr @e, align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: [[XOR_I:%.*]] = xor i32 [[TMP3]], [[LNOT_EXT_I]]
; CHECK-NEXT: store i32 [[XOR_I]], ptr @e, align 4, !tbaa !3
; CHECK-NEXT: store i32 [[XOR_I]], ptr @e, align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: br label [[LOR_END_I]]
; CHECK: lor.end.i:
; CHECK-NEXT: [[INC_I]] = add nuw nsw i32 [[INC12_I]], 1
Expand All @@ -55,28 +55,28 @@ define i32 @main() local_unnamed_addr #0 {
; CHECK-NEXT: [[CMP_I:%.*]] = icmp slt i32 [[INC816_I]], 0
; CHECK-NEXT: br i1 [[CMP_I]], label [[FOR_COND1_PREHEADER_I]], label [[FOR_COND_FOR_END9_CRIT_EDGE_I:%.*]]
; CHECK: for.cond.for.end9_crit_edge.i:
; CHECK-NEXT: store i32 0, ptr @g, align 4, !tbaa !3
; CHECK-NEXT: store i32 2, ptr @h, align 4, !tbaa !3
; CHECK-NEXT: store i32 [[INC8_I]], ptr @c, align 4, !tbaa !3
; CHECK-NEXT: store i32 0, ptr @g, align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: store i32 2, ptr @h, align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: store i32 [[INC8_I]], ptr @c, align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: br label [[FOR_END9_I]]
; CHECK: for.end9.i:
; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[DOTPRE]], [[ENTRY_FOR_END9_I_CRIT_EDGE]] ], [ 2, [[FOR_COND_FOR_END9_CRIT_EDGE_I]] ]
; CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr @b, align 8, !tbaa !7
; CHECK-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4, !tbaa !3
; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr @e, align 4, !tbaa !3
; CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr @b, align 8, !tbaa [[TBAA7:![0-9]+]]
; CHECK-NEXT: store i32 [[TMP4]], ptr [[TMP5]], align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr @e, align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: [[CMP10_I:%.*]] = icmp slt i32 [[TMP6]], -1
; CHECK-NEXT: br i1 [[CMP10_I]], label [[IF_THEN_I:%.*]], label [[FN1_EXIT:%.*]]
; CHECK: if.then.i:
; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr @f, align 4, !tbaa !3
; CHECK-NEXT: store i32 [[TMP7]], ptr [[TMP5]], align 4, !tbaa !3
; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr @f, align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: store i32 [[TMP7]], ptr [[TMP5]], align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: br label [[FN1_EXIT]]
; CHECK: fn1.exit:
; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr @a, align 4, !tbaa !3
; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr @a, align 4, !tbaa [[TBAA3]]
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[TMP8]], 0
; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[PUTS2:%.*]] = tail call i32 @puts(ptr @str.2)
; CHECK-NEXT: tail call void @abort()
; CHECK-NEXT: tail call void @abort() #[[ATTR3:[0-9]+]]
; CHECK-NEXT: unreachable
; CHECK: if.end:
; CHECK-NEXT: [[PUTS:%.*]] = tail call i32 @puts(ptr @str)
Expand Down
Loading