diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.funcattrs.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.funcattrs.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.funcattrs.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.funcattrs.expected @@ -9,7 +9,7 @@ ; CHECK: Function Attrs: nofree norecurse nosync nounwind optsize ssp willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: (ptr nofree readnone [[S:%.*]]) #[[ATTR0:[0-9]+]] { -; CHECK-NEXT: entry: +; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], ptr [[S]], i64 1, i32 2, i32 1, i64 5, i64 13 ; CHECK-NEXT: ret ptr [[ARRAYIDX]] ; diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.plain.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.plain.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.plain.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.plain.expected @@ -8,7 +8,7 @@ define ptr @foo(ptr %s) nounwind uwtable readnone optsize ssp { ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: (ptr nofree readnone [[S:%.*]]) #[[ATTR0:[0-9]+]] { -; CHECK-NEXT: entry: +; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], ptr [[S]], i64 1, i32 2, i32 1, i64 5, i64 13 ; CHECK-NEXT: ret ptr [[ARRAYIDX]] ; diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.expected @@ -38,38 +38,38 @@ ; CHECK-LABEL: @foo( ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; CHECK-NEXT: tail call void @_Z10sideeffectv() -; CHECK-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; CHECK: codeRepl: +; CHECK-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; CHECK: [[CODEREPL]]: ; CHECK-NEXT: call void @foo.cold.1() #[[ATTR2:[0-9]+]] ; CHECK-NEXT: ret void -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret void ; ; ; CHECK-LABEL: @bar( ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; CHECK-NEXT: tail call void @_Z10sideeffectv() -; CHECK-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; CHECK: codeRepl: +; CHECK-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; CHECK: [[CODEREPL]]: ; CHECK-NEXT: call void @bar.cold.1() #[[ATTR2]] ; CHECK-NEXT: ret void -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret void ; ; ; CHECK-LABEL: @foo.cold.1( -; CHECK-NEXT: newFuncRoot: -; CHECK-NEXT: br label [[SINK:%.*]] -; CHECK: sink: +; CHECK-NEXT: [[NEWFUNCROOT:.*]]: +; CHECK-NEXT: br label %[[SINK:.*]] +; CHECK: [[SINK]]: ; CHECK-NEXT: tail call void @_Z10sideeffectv() ; CHECK-NEXT: call void @llvm.trap() ; CHECK-NEXT: unreachable ; ; ; CHECK-LABEL: @bar.cold.1( -; CHECK-NEXT: newFuncRoot: -; CHECK-NEXT: br label [[SINK:%.*]] -; CHECK: sink: +; CHECK-NEXT: [[NEWFUNCROOT:.*]]: +; CHECK-NEXT: br label %[[SINK:.*]] +; CHECK: [[SINK]]: ; CHECK-NEXT: tail call void @_Z10sideeffectv() ; CHECK-NEXT: call void @llvm.trap() ; CHECK-NEXT: unreachable diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.generated.globals.expected @@ -41,38 +41,38 @@ ; CHECK-LABEL: @foo( ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; CHECK-NEXT: tail call void @_Z10sideeffectv() -; CHECK-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; CHECK: codeRepl: +; CHECK-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; CHECK: [[CODEREPL]]: ; CHECK-NEXT: call void @foo.cold.1() #[[ATTR2:[0-9]+]] ; CHECK-NEXT: ret void -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret void ; ; ; CHECK-LABEL: @bar( ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; CHECK-NEXT: tail call void @_Z10sideeffectv() -; CHECK-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; CHECK: codeRepl: +; CHECK-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; CHECK: [[CODEREPL]]: ; CHECK-NEXT: call void @bar.cold.1() #[[ATTR2]] ; CHECK-NEXT: ret void -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret void ; ; ; CHECK-LABEL: @foo.cold.1( -; CHECK-NEXT: newFuncRoot: -; CHECK-NEXT: br label [[SINK:%.*]] -; CHECK: sink: +; CHECK-NEXT: [[NEWFUNCROOT:.*]]: +; CHECK-NEXT: br label %[[SINK:.*]] +; CHECK: [[SINK]]: ; CHECK-NEXT: tail call void @_Z10sideeffectv() ; CHECK-NEXT: call void @llvm.trap() ; CHECK-NEXT: unreachable ; ; ; CHECK-LABEL: @bar.cold.1( -; CHECK-NEXT: newFuncRoot: -; CHECK-NEXT: br label [[SINK:%.*]] -; CHECK: sink: +; CHECK-NEXT: [[NEWFUNCROOT:.*]]: +; CHECK-NEXT: br label %[[SINK:.*]] +; CHECK: [[SINK]]: ; CHECK-NEXT: tail call void @_Z10sideeffectv() ; CHECK-NEXT: call void @llvm.trap() ; CHECK-NEXT: unreachable diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.expected @@ -9,11 +9,11 @@ ; CHECK-LABEL: @foo( ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; CHECK-NEXT: tail call void @_Z10sideeffectv() -; CHECK-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; CHECK: codeRepl: +; CHECK-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; CHECK: [[CODEREPL]]: ; CHECK-NEXT: call void @foo.cold.1() #[[ATTR2:[0-9]+]] ; CHECK-NEXT: ret void -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret void ; %2 = icmp eq i32 %0, 0 @@ -33,11 +33,11 @@ ; CHECK-LABEL: @bar( ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; CHECK-NEXT: tail call void @_Z10sideeffectv() -; CHECK-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; CHECK: codeRepl: +; CHECK-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; CHECK: [[CODEREPL]]: ; CHECK-NEXT: call void @bar.cold.1() #[[ATTR2]] ; CHECK-NEXT: ret void -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret void ; %2 = icmp eq i32 %0, 0 diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs.ll.nogenerated.globals.expected @@ -12,11 +12,11 @@ ; CHECK-LABEL: @foo( ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; CHECK-NEXT: tail call void @_Z10sideeffectv() -; CHECK-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; CHECK: codeRepl: +; CHECK-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; CHECK: [[CODEREPL]]: ; CHECK-NEXT: call void @foo.cold.1() #[[ATTR2:[0-9]+]] ; CHECK-NEXT: ret void -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret void ; %2 = icmp eq i32 %0, 0 @@ -36,11 +36,11 @@ ; CHECK-LABEL: @bar( ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; CHECK-NEXT: tail call void @_Z10sideeffectv() -; CHECK-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; CHECK: codeRepl: +; CHECK-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; CHECK: [[CODEREPL]]: ; CHECK-NEXT: call void @bar.cold.1() #[[ATTR2]] ; CHECK-NEXT: ret void -; CHECK: exit: +; CHECK: [[EXIT]]: ; CHECK-NEXT: ret void ; %2 = icmp eq i32 %0, 0 diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.expected @@ -39,38 +39,38 @@ ; REUSE-LABEL: @foo( ; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; REUSE-NEXT: tail call void @_Z10sideeffectv() -; REUSE-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; REUSE: codeRepl: +; REUSE-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; REUSE: [[CODEREPL]]: ; REUSE-NEXT: call void @foo.cold.1() #[[ATTR2:[0-9]+]] ; REUSE-NEXT: ret void -; REUSE: exit: +; REUSE: [[EXIT]]: ; REUSE-NEXT: ret void ; ; ; REUSE-LABEL: @bar( ; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; REUSE-NEXT: tail call void @_Z10sideeffectv() -; REUSE-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; REUSE: codeRepl: +; REUSE-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; REUSE: [[CODEREPL]]: ; REUSE-NEXT: call void @bar.cold.1() #[[ATTR2]] ; REUSE-NEXT: ret void -; REUSE: exit: +; REUSE: [[EXIT]]: ; REUSE-NEXT: ret void ; ; ; REUSE-LABEL: @foo.cold.1( -; REUSE-NEXT: newFuncRoot: -; REUSE-NEXT: br label [[SINK:%.*]] -; REUSE: sink: +; REUSE-NEXT: [[NEWFUNCROOT:.*]]: +; REUSE-NEXT: br label %[[SINK:.*]] +; REUSE: [[SINK]]: ; REUSE-NEXT: tail call void @_Z10sideeffectv() ; REUSE-NEXT: call void @llvm.trap() ; REUSE-NEXT: unreachable ; ; ; REUSE-LABEL: @bar.cold.1( -; REUSE-NEXT: newFuncRoot: -; REUSE-NEXT: br label [[SINK:%.*]] -; REUSE: sink: +; REUSE-NEXT: [[NEWFUNCROOT:.*]]: +; REUSE-NEXT: br label %[[SINK:.*]] +; REUSE: [[SINK]]: ; REUSE-NEXT: tail call void @_Z10sideeffectv() ; REUSE-NEXT: call void @llvm.trap() ; REUSE-NEXT: unreachable diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.generated.globals.expected @@ -42,38 +42,38 @@ ; REUSE-LABEL: @foo( ; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; REUSE-NEXT: tail call void @_Z10sideeffectv() -; REUSE-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; REUSE: codeRepl: +; REUSE-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; REUSE: [[CODEREPL]]: ; REUSE-NEXT: call void @foo.cold.1() #[[ATTR2:[0-9]+]] ; REUSE-NEXT: ret void -; REUSE: exit: +; REUSE: [[EXIT]]: ; REUSE-NEXT: ret void ; ; ; REUSE-LABEL: @bar( ; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; REUSE-NEXT: tail call void @_Z10sideeffectv() -; REUSE-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; REUSE: codeRepl: +; REUSE-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; REUSE: [[CODEREPL]]: ; REUSE-NEXT: call void @bar.cold.1() #[[ATTR2]] ; REUSE-NEXT: ret void -; REUSE: exit: +; REUSE: [[EXIT]]: ; REUSE-NEXT: ret void ; ; ; REUSE-LABEL: @foo.cold.1( -; REUSE-NEXT: newFuncRoot: -; REUSE-NEXT: br label [[SINK:%.*]] -; REUSE: sink: +; REUSE-NEXT: [[NEWFUNCROOT:.*]]: +; REUSE-NEXT: br label %[[SINK:.*]] +; REUSE: [[SINK]]: ; REUSE-NEXT: tail call void @_Z10sideeffectv() ; REUSE-NEXT: call void @llvm.trap() ; REUSE-NEXT: unreachable ; ; ; REUSE-LABEL: @bar.cold.1( -; REUSE-NEXT: newFuncRoot: -; REUSE-NEXT: br label [[SINK:%.*]] -; REUSE: sink: +; REUSE-NEXT: [[NEWFUNCROOT:.*]]: +; REUSE-NEXT: br label %[[SINK:.*]] +; REUSE: [[SINK]]: ; REUSE-NEXT: tail call void @_Z10sideeffectv() ; REUSE-NEXT: call void @llvm.trap() ; REUSE-NEXT: unreachable diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.expected @@ -10,11 +10,11 @@ ; REUSE-LABEL: @foo( ; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; REUSE-NEXT: tail call void @_Z10sideeffectv() -; REUSE-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; REUSE: codeRepl: +; REUSE-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; REUSE: [[CODEREPL]]: ; REUSE-NEXT: call void @foo.cold.1() #[[ATTR2:[0-9]+]] ; REUSE-NEXT: ret void -; REUSE: exit: +; REUSE: [[EXIT]]: ; REUSE-NEXT: ret void ; %2 = icmp eq i32 %0, 0 @@ -34,11 +34,11 @@ ; REUSE-LABEL: @bar( ; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; REUSE-NEXT: tail call void @_Z10sideeffectv() -; REUSE-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; REUSE: codeRepl: +; REUSE-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; REUSE: [[CODEREPL]]: ; REUSE-NEXT: call void @bar.cold.1() #[[ATTR2]] ; REUSE-NEXT: ret void -; REUSE: exit: +; REUSE: [[EXIT]]: ; REUSE-NEXT: ret void ; %2 = icmp eq i32 %0, 0 diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/generated_funcs_prefix_reuse.ll.nogenerated.globals.expected @@ -13,11 +13,11 @@ ; REUSE-LABEL: @foo( ; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; REUSE-NEXT: tail call void @_Z10sideeffectv() -; REUSE-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; REUSE: codeRepl: +; REUSE-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; REUSE: [[CODEREPL]]: ; REUSE-NEXT: call void @foo.cold.1() #[[ATTR2:[0-9]+]] ; REUSE-NEXT: ret void -; REUSE: exit: +; REUSE: [[EXIT]]: ; REUSE-NEXT: ret void ; %2 = icmp eq i32 %0, 0 @@ -37,11 +37,11 @@ ; REUSE-LABEL: @bar( ; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0 ; REUSE-NEXT: tail call void @_Z10sideeffectv() -; REUSE-NEXT: br i1 [[TMP2]], label [[CODEREPL:%.*]], label [[EXIT:%.*]] -; REUSE: codeRepl: +; REUSE-NEXT: br i1 [[TMP2]], label %[[CODEREPL:.*]], label %[[EXIT:.*]] +; REUSE: [[CODEREPL]]: ; REUSE-NEXT: call void @bar.cold.1() #[[ATTR2]] ; REUSE-NEXT: ret void -; REUSE: exit: +; REUSE: [[EXIT]]: ; REUSE-NEXT: ret void ; %2 = icmp eq i32 %0, 0 diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/phi-labels.ll b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/phi-labels.ll new file mode 100644 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/phi-labels.ll @@ -0,0 +1,27 @@ +; RUN: opt < %s -S | FileCheck %s + +define i32 @phi_after_label(i1 %cc) { +entry: + br i1 %cc, label %then, label %end + +then: + br label %end + +end: + %r = phi i32 [ 0, %entry ], [ 1, %then ] + ret i32 %r +} + +define void @phi_before_label(i32 %bound) { +entry: + br label %loop + +loop: + %ctr = phi i32 [ 0, %entry ], [ %ctr.next, %loop ] + %ctr.next = add i32 %ctr, 1 + %cc = icmp ult i32 %ctr.next, %bound + br i1 %cc, label %loop, label %end + +end: + ret void +} diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/phi-labels.ll.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/phi-labels.ll.expected new file mode 100644 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/phi-labels.ll.expected @@ -0,0 +1,48 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -S | FileCheck %s + +define i32 @phi_after_label(i1 %cc) { +; CHECK-LABEL: @phi_after_label( +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br i1 [[CC:%.*]], label %[[THEN:.*]], label %[[END:.*]] +; CHECK: [[THEN]]: +; CHECK-NEXT: br label %[[END]] +; CHECK: [[END]]: +; CHECK-NEXT: [[R:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ 1, %[[THEN]] ] +; CHECK-NEXT: ret i32 [[R]] +; +entry: + br i1 %cc, label %then, label %end + +then: + br label %end + +end: + %r = phi i32 [ 0, %entry ], [ 1, %then ] + ret i32 %r +} + +define void @phi_before_label(i32 %bound) { +; CHECK-LABEL: @phi_before_label( +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br label %[[LOOP:.*]] +; CHECK: [[LOOP]]: +; CHECK-NEXT: [[CTR:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[CTR_NEXT:%.*]], %[[LOOP]] ] +; CHECK-NEXT: [[CTR_NEXT]] = add i32 [[CTR]], 1 +; CHECK-NEXT: [[CC:%.*]] = icmp ult i32 [[CTR_NEXT]], [[BOUND:%.*]] +; CHECK-NEXT: br i1 [[CC]], label %[[LOOP]], label %[[END:.*]] +; CHECK: [[END]]: +; CHECK-NEXT: ret void +; +entry: + br label %loop + +loop: + %ctr = phi i32 [ 0, %entry ], [ %ctr.next, %loop ] + %ctr.next = add i32 %ctr, 1 + %cc = icmp ult i32 %ctr.next, %bound + br i1 %cc, label %loop, label %end + +end: + ret void +} diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/pre-process.ll.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/pre-process.ll.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/pre-process.ll.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/pre-process.ll.expected @@ -15,22 +15,22 @@ define ptr addrspace(200) @test_zerogep_in_different_as(ptr addrspace(200) %arg) addrspace(200) nounwind { ; CHECK-AS200-LABEL: define {{[^@]+}}@test_zerogep_in_different_as ; CHECK-AS200-SAME: (ptr addrspace(200) [[ARG:%.*]]) addrspace(200) #[[ATTR0:[0-9]+]] { -; CHECK-AS200-NEXT: entry: +; CHECK-AS200-NEXT: [[ENTRY:.*]]: ; CHECK-AS200-NEXT: ret ptr addrspace(200) [[ARG]] ; ; CHECK-AS0-LABEL: define {{[^@]+}}@test_zerogep_in_different_as ; CHECK-AS0-SAME: (ptr [[ARG:%.*]]) #[[ATTR0:[0-9]+]] { -; CHECK-AS0-NEXT: entry: +; CHECK-AS0-NEXT: [[ENTRY:.*]]: ; CHECK-AS0-NEXT: ret ptr [[ARG]] ; ; CHECK-AS1-LABEL: define {{[^@]+}}@test_zerogep_in_different_as ; CHECK-AS1-SAME: (ptr addrspace(1) [[ARG:%.*]]) addrspace(1) #[[ATTR0:[0-9]+]] { -; CHECK-AS1-NEXT: entry: +; CHECK-AS1-NEXT: [[ENTRY:.*]]: ; CHECK-AS1-NEXT: ret ptr addrspace(1) [[ARG]] ; ; CHECK-AS200-NOOP-PRE-PROCESS-LABEL: define {{[^@]+}}@test_zerogep_in_different_as ; CHECK-AS200-NOOP-PRE-PROCESS-SAME: (ptr addrspace(200) [[ARG:%.*]]) addrspace(200) #[[ATTR0:[0-9]+]] { -; CHECK-AS200-NOOP-PRE-PROCESS-NEXT: entry: +; CHECK-AS200-NOOP-PRE-PROCESS-NEXT: [[ENTRY:.*]]: ; CHECK-AS200-NOOP-PRE-PROCESS-NEXT: ret ptr addrspace(200) [[ARG]] ; entry: diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.expected @@ -10,7 +10,7 @@ ; Function Attrs: nounwind uwtable define dso_local void @foo(ptr %A) #0 !dbg !7 { ; CHECK-LABEL: @foo( -; CHECK-NEXT: entry: +; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, !DIAssignID [[DIASSIGNID16:![0-9]+]] ; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 ; CHECK-NEXT: call void @llvm.dbg.assign(metadata i1 undef, metadata [[META13:![0-9]+]], metadata !DIExpression(), metadata [[DIASSIGNID16]], metadata ptr [[A_ADDR]], metadata !DIExpression()), !dbg [[DBG17:![0-9]+]] @@ -19,29 +19,29 @@ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3:[0-9]+]], !dbg [[DBG22:![0-9]+]] ; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META14:![0-9]+]], metadata !DIExpression()), !dbg [[DBG23:![0-9]+]] ; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG23]], !tbaa [[TBAA24:![0-9]+]] -; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG22]] -; CHECK: for.cond: +; CHECK-NEXT: br label %[[FOR_COND:.*]], !dbg [[DBG22]] +; CHECK: [[FOR_COND]]: ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG26:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG28:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG29:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG30:![0-9]+]] -; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG31:![0-9]+]], !prof [[PROF32:![0-9]+]] -; CHECK: for.cond.cleanup: +; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]], !dbg [[DBG31:![0-9]+]], !prof [[PROF32:![0-9]+]] +; CHECK: [[FOR_COND_CLEANUP]]: ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG33:![0-9]+]] -; CHECK-NEXT: br label [[FOR_END:%.*]] -; CHECK: for.body: +; CHECK-NEXT: br label %[[FOR_END:.*]] +; CHECK: [[FOR_BODY]]: ; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG34:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG35:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG34]] ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG34]] ; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG36:![0-9]+]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG34]] -; CHECK: for.inc: +; CHECK-NEXT: br label %[[FOR_INC:.*]], !dbg [[DBG34]] +; CHECK: [[FOR_INC]]: ; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG37:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG37]] ; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG37]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG33]], !llvm.loop [[LOOP38:![0-9]+]] -; CHECK: for.end: +; CHECK-NEXT: br label %[[FOR_COND]], !dbg [[DBG33]], !llvm.loop [[LOOP38:![0-9]+]] +; CHECK: [[FOR_END]]: ; CHECK-NEXT: ret void, !dbg [[DBG40:![0-9]+]] ; entry: @@ -96,7 +96,7 @@ ; Function Attrs: nounwind uwtable define dso_local void @bar(ptr %A) #0 !dbg !39 { ; CHECK-LABEL: @bar( -; CHECK-NEXT: entry: +; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 ; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 ; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18]] @@ -104,29 +104,29 @@ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG47:![0-9]+]] ; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META44:![0-9]+]], metadata !DIExpression()), !dbg [[DBG48:![0-9]+]] ; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG48]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG47]] -; CHECK: for.cond: +; CHECK-NEXT: br label %[[FOR_COND:.*]], !dbg [[DBG47]] +; CHECK: [[FOR_COND]]: ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG49:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG51:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG52:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG53:![0-9]+]] -; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG54:![0-9]+]] -; CHECK: for.cond.cleanup: +; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]], !dbg [[DBG54:![0-9]+]] +; CHECK: [[FOR_COND_CLEANUP]]: ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG55:![0-9]+]] -; CHECK-NEXT: br label [[FOR_END:%.*]] -; CHECK: for.body: +; CHECK-NEXT: br label %[[FOR_END:.*]] +; CHECK: [[FOR_BODY]]: ; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG56:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG57:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG56]] ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG56]] ; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG58:![0-9]+]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG56]] -; CHECK: for.inc: +; CHECK-NEXT: br label %[[FOR_INC:.*]], !dbg [[DBG56]] +; CHECK: [[FOR_INC]]: ; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG59:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG59]] ; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG59]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG55]], !llvm.loop [[LOOP60:![0-9]+]] -; CHECK: for.end: +; CHECK-NEXT: br label %[[FOR_COND]], !dbg [[DBG55]], !llvm.loop [[LOOP60:![0-9]+]] +; CHECK: [[FOR_END]]: ; CHECK-NEXT: ret void, !dbg [[DBG62:![0-9]+]] ; entry: diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.expected @@ -11,7 +11,7 @@ define dso_local void @foo(ptr %A) #0 !dbg !7 { ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] !dbg [[DBG7:![0-9]+]] { -; CHECK-NEXT: entry: +; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, !DIAssignID [[DIASSIGNID16:![0-9]+]] ; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 ; CHECK-NEXT: call void @llvm.dbg.assign(metadata i1 undef, metadata [[META13:![0-9]+]], metadata !DIExpression(), metadata [[DIASSIGNID16]], metadata ptr [[A_ADDR]], metadata !DIExpression()), !dbg [[DBG17:![0-9]+]] @@ -20,29 +20,29 @@ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3:[0-9]+]], !dbg [[DBG22:![0-9]+]] ; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META14:![0-9]+]], metadata !DIExpression()), !dbg [[DBG23:![0-9]+]] ; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG23]], !tbaa [[TBAA24:![0-9]+]] -; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG22]] -; CHECK: for.cond: +; CHECK-NEXT: br label %[[FOR_COND:.*]], !dbg [[DBG22]] +; CHECK: [[FOR_COND]]: ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG26:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG28:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG29:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG30:![0-9]+]] -; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG31:![0-9]+]], !prof [[PROF32:![0-9]+]] -; CHECK: for.cond.cleanup: +; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]], !dbg [[DBG31:![0-9]+]], !prof [[PROF32:![0-9]+]] +; CHECK: [[FOR_COND_CLEANUP]]: ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG33:![0-9]+]] -; CHECK-NEXT: br label [[FOR_END:%.*]] -; CHECK: for.body: +; CHECK-NEXT: br label %[[FOR_END:.*]] +; CHECK: [[FOR_BODY]]: ; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG34:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG35:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG34]] ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG34]] ; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG36:![0-9]+]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG34]] -; CHECK: for.inc: +; CHECK-NEXT: br label %[[FOR_INC:.*]], !dbg [[DBG34]] +; CHECK: [[FOR_INC]]: ; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG37:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG37]] ; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG37]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG33]], !llvm.loop [[LOOP38:![0-9]+]] -; CHECK: for.end: +; CHECK-NEXT: br label %[[FOR_COND]], !dbg [[DBG33]], !llvm.loop [[LOOP38:![0-9]+]] +; CHECK: [[FOR_END]]: ; CHECK-NEXT: ret void, !dbg [[DBG40:![0-9]+]] ; entry: @@ -98,7 +98,7 @@ define dso_local void @bar(ptr %A) #0 !dbg !39 { ; CHECK-LABEL: define {{[^@]+}}@bar ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] !dbg [[DBG41:![0-9]+]] { -; CHECK-NEXT: entry: +; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 ; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 ; CHECK-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18]] @@ -106,29 +106,29 @@ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG47:![0-9]+]] ; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META44:![0-9]+]], metadata !DIExpression()), !dbg [[DBG48:![0-9]+]] ; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG48]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG47]] -; CHECK: for.cond: +; CHECK-NEXT: br label %[[FOR_COND:.*]], !dbg [[DBG47]] +; CHECK: [[FOR_COND]]: ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG49:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG51:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG52:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG53:![0-9]+]] -; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG54:![0-9]+]] -; CHECK: for.cond.cleanup: +; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]], !dbg [[DBG54:![0-9]+]] +; CHECK: [[FOR_COND_CLEANUP]]: ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG55:![0-9]+]] -; CHECK-NEXT: br label [[FOR_END:%.*]] -; CHECK: for.body: +; CHECK-NEXT: br label %[[FOR_END:.*]] +; CHECK: [[FOR_BODY]]: ; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG56:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG57:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG56]] ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG56]] ; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG58:![0-9]+]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG56]] -; CHECK: for.inc: +; CHECK-NEXT: br label %[[FOR_INC:.*]], !dbg [[DBG56]] +; CHECK: [[FOR_INC]]: ; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG59:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG59]] ; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG59]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG55]], !llvm.loop [[LOOP60:![0-9]+]] -; CHECK: for.end: +; CHECK-NEXT: br label %[[FOR_COND]], !dbg [[DBG55]], !llvm.loop [[LOOP60:![0-9]+]] +; CHECK: [[FOR_END]]: ; CHECK-NEXT: ret void, !dbg [[DBG62:![0-9]+]] ; entry: diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.globals.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.globals.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.globals.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/various_ir_values.ll.funcsig.globals.expected @@ -11,7 +11,7 @@ define dso_local void @foo(ptr %A) #0 !dbg !7 { ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] !dbg [[DBG7:![0-9]+]] { -; CHECK-NEXT: entry: +; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, !DIAssignID [[DIASSIGNID16:![0-9]+]] ; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 ; CHECK-NEXT: call void @llvm.dbg.assign(metadata i1 undef, metadata [[META13:![0-9]+]], metadata !DIExpression(), metadata [[DIASSIGNID16]], metadata ptr [[A_ADDR]], metadata !DIExpression()), !dbg [[DBG17:![0-9]+]] @@ -20,29 +20,29 @@ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3:[0-9]+]], !dbg [[DBG22:![0-9]+]] ; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META14:![0-9]+]], metadata !DIExpression()), !dbg [[DBG23:![0-9]+]] ; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG23]], !tbaa [[TBAA24:![0-9]+]] -; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG22]] -; CHECK: for.cond: +; CHECK-NEXT: br label %[[FOR_COND:.*]], !dbg [[DBG22]] +; CHECK: [[FOR_COND]]: ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG26:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG28:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG29:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG30:![0-9]+]] -; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG31:![0-9]+]], !prof [[PROF32:![0-9]+]] -; CHECK: for.cond.cleanup: +; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]], !dbg [[DBG31:![0-9]+]], !prof [[PROF32:![0-9]+]] +; CHECK: [[FOR_COND_CLEANUP]]: ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG33:![0-9]+]] -; CHECK-NEXT: br label [[FOR_END:%.*]] -; CHECK: for.body: +; CHECK-NEXT: br label %[[FOR_END:.*]] +; CHECK: [[FOR_BODY]]: ; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG34:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG35:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG34]] ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG34]] ; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG36:![0-9]+]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG34]] -; CHECK: for.inc: +; CHECK-NEXT: br label %[[FOR_INC:.*]], !dbg [[DBG34]] +; CHECK: [[FOR_INC]]: ; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG37:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG37]] ; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG37]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG33]], !llvm.loop [[LOOP38:![0-9]+]] -; CHECK: for.end: +; CHECK-NEXT: br label %[[FOR_COND]], !dbg [[DBG33]], !llvm.loop [[LOOP38:![0-9]+]] +; CHECK: [[FOR_END]]: ; CHECK-NEXT: ret void, !dbg [[DBG40:![0-9]+]] ; entry: @@ -98,7 +98,7 @@ define dso_local void @bar(ptr %A) #0 !dbg !39 { ; CHECK-LABEL: define {{[^@]+}}@bar ; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0]] !dbg [[DBG41:![0-9]+]] { -; CHECK-NEXT: entry: +; CHECK-NEXT: [[ENTRY:.*]]: ; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 ; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 ; CHECK-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18]] @@ -106,29 +106,29 @@ ; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG47:![0-9]+]] ; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META44:![0-9]+]], metadata !DIExpression()), !dbg [[DBG48:![0-9]+]] ; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG48]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG47]] -; CHECK: for.cond: +; CHECK-NEXT: br label %[[FOR_COND:.*]], !dbg [[DBG47]] +; CHECK: [[FOR_COND]]: ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG49:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG51:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG52:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG53:![0-9]+]] -; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG54:![0-9]+]] -; CHECK: for.cond.cleanup: +; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY:.*]], label %[[FOR_COND_CLEANUP:.*]], !dbg [[DBG54:![0-9]+]] +; CHECK: [[FOR_COND_CLEANUP]]: ; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG55:![0-9]+]] -; CHECK-NEXT: br label [[FOR_END:%.*]] -; CHECK: for.body: +; CHECK-NEXT: br label %[[FOR_END:.*]] +; CHECK: [[FOR_BODY]]: ; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG56:![0-9]+]], !tbaa [[TBAA18]] ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG57:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG56]] ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG56]] ; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG58:![0-9]+]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG56]] -; CHECK: for.inc: +; CHECK-NEXT: br label %[[FOR_INC:.*]], !dbg [[DBG56]] +; CHECK: [[FOR_INC]]: ; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG59:![0-9]+]], !tbaa [[TBAA24]] ; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG59]] ; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG59]], !tbaa [[TBAA24]] -; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG55]], !llvm.loop [[LOOP60:![0-9]+]] -; CHECK: for.end: +; CHECK-NEXT: br label %[[FOR_COND]], !dbg [[DBG55]], !llvm.loop [[LOOP60:![0-9]+]] +; CHECK: [[FOR_END]]: ; CHECK-NEXT: ret void, !dbg [[DBG62:![0-9]+]] ; entry: diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/basic.test b/llvm/test/tools/UpdateTestChecks/update_test_checks/basic.test --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/basic.test +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/basic.test @@ -1,4 +1,3 @@ -# REQUIRES: x86-registered-target ## Basic test checking that update_test_checks.py works correctly # RUN: cp -f %S/Inputs/basic.ll %t.ll && %update_test_checks %t.ll # RUN: diff -u %t.ll %S/Inputs/basic.ll.expected diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/function-name.test b/llvm/test/tools/UpdateTestChecks/update_test_checks/function-name.test --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/function-name.test +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/function-name.test @@ -1,4 +1,3 @@ -# REQUIRES: x86-registered-target ## Basic test checking that update_test_checks.py works correctly # RUN: cp -f %S/Inputs/function_name.ll %t.ll && %update_test_checks %t.ll # RUN: diff -u %t.ll %S/Inputs/function_name.ll.expected diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/phi-labels.test b/llvm/test/tools/UpdateTestChecks/update_test_checks/phi-labels.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/phi-labels.test @@ -0,0 +1,6 @@ +## Test that basic block references in phi nodes are generalized correctly +# RUN: cp -f %S/Inputs/phi-labels.ll %t.ll && %update_test_checks %t.ll +# RUN: diff -u %t.ll %S/Inputs/phi-labels.ll.expected +## Check that running the script again does not change the result: +# RUN: %update_test_checks %t.ll +# RUN: diff -u %t.ll %S/Inputs/phi-labels.ll.expected diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -645,14 +645,16 @@ class NamelessValue: def __init__(self, check_prefix, check_key, ir_prefix, ir_regexp, global_ir_rhs_regexp, *, is_before_functions=False, is_number=False, - replace_number_with_counter=False): + replace_number_with_counter=False, test_prefix=None, ir_suffix=None): self.check_prefix = check_prefix self.check_key = check_key self.ir_prefix = ir_prefix self.ir_regexp = ir_regexp + self.ir_suffix = ir_suffix self.global_ir_rhs_regexp = global_ir_rhs_regexp self.is_before_functions = is_before_functions self.is_number = is_number + self.test_prefix = test_prefix # Some variable numbers (e.g. MCINST1234) will change based on unrelated # modifications to LLVM, replace those with an incrementing counter. self.replace_number_with_counter = replace_number_with_counter @@ -660,11 +662,7 @@ # Return true if this kind of IR value is "local", basically if it matches '%{{.*}}'. def is_local_def_ir_value_match(self, match): - return self.ir_prefix == '%' - - # Return true if this kind of IR value is "global", basically if it matches '#{{.*}}'. - def is_global_scope_ir_value_match(self, match): - return self.global_ir_rhs_regexp is not None + return self.check_key == '%' # Return the IR prefix and check prefix we use for this kind or IR value, # e.g., (%, TMP) for locals. @@ -674,8 +672,10 @@ # Return the IR regexp we use for this kind or IR value, e.g., [\w.-]+? for locals def get_ir_regex_from_ir_value_re_match(self, match): # for backwards compatibility we check locals with '.*' - if self.is_local_def_ir_value_match(match): + if self.check_key == '%': return '.*' + if self.is_number: + return '' # always capture a number in the default format return self.ir_regexp # Create a FileCheck variable name based on an IR name. @@ -701,36 +701,13 @@ var = var.replace('-', '_') return var.upper() - # Create a FileCheck variable from regex. - def get_value_definition(self, var, match): - # for backwards compatibility we check locals with '.*' - varname = self.get_value_name(var, self.check_prefix) - prefix = self.get_ir_prefix_from_ir_value_match(match)[0] - if self.is_number: - regex = '' # always capture a number in the default format - capture_start = '[[#' - else: - regex = self.get_ir_regex_from_ir_value_re_match(match) - capture_start = '[[' - if self.is_local_def_ir_value_match(match): - return capture_start + varname + ':' + prefix + regex + ']]' - return prefix + capture_start + varname + ':' + regex + ']]' - - # Use a FileCheck variable. - def get_value_use(self, var, match, var_prefix=None): - if var_prefix is None: - var_prefix = self.check_prefix - capture_start = '[[#' if self.is_number else '[[' - if self.is_local_def_ir_value_match(match): - return capture_start + self.get_value_name(var, var_prefix) + ']]' - prefix = self.get_ir_prefix_from_ir_value_match(match)[0] - return prefix + capture_start + self.get_value_name(var, var_prefix) + ']]' - # Description of the different "unnamed" values we match in the IR, e.g., # (local) ssa values, (debug) metadata, etc. ir_nameless_values = [ # check_prefix check_key ir_prefix ir_regexp global_ir_rhs_regexp - NamelessValue(r'TMP' , '%' , r'%' , r'[\w$.-]+?' , None ) , + NamelessValue(r'LABEL' , '%' , r'label %' , r'[\w$.-]+?' , None ) , + NamelessValue(r'LABEL' , '%' , r'^' , r'[\w$.-]+?' , None , ir_suffix=r':') , + NamelessValue(r'TMP' , '%' , r'%' , r'[\w$.-]+?' , None , test_prefix=r'%') , NamelessValue(r'ATTR' , '#' , r'#' , r'[0-9]+' , None ) , NamelessValue(r'ATTR' , '#' , r'attributes #' , r'[0-9]+' , r'{[^}]*}' ) , NamelessValue(r'GLOB' , '@' , r'@' , r'[0-9]+' , None ) , @@ -759,8 +736,13 @@ return old return old + '|' + new -def createPrefixMatch(prefix_str, prefix_re): - return '(?:' + prefix_str + '(' + prefix_re + '))' +def createPrefixMatch(prefix_str, name_re, suffix_str): + re = '(?:' + prefix_str + '(' + name_re + if suffix_str is None: + re += '))' + else: + re += ')' + suffix_str + ')' + return re # Build the regexp that matches an "IR value". This can be a local variable, # argument, global, or metadata, anything that is "named". It is important that @@ -769,7 +751,7 @@ IR_VALUE_REGEXP_PREFIX = r'(\s*)' IR_VALUE_REGEXP_STRING = r'' for nameless_value in ir_nameless_values: - match = createPrefixMatch(nameless_value.ir_prefix, nameless_value.ir_regexp) + match = createPrefixMatch(nameless_value.ir_prefix, nameless_value.ir_regexp, nameless_value.ir_suffix) if nameless_value.global_ir_rhs_regexp is not None: match = '^' + match IR_VALUE_REGEXP_STRING = createOrRegexp(IR_VALUE_REGEXP_STRING, match) @@ -779,7 +761,7 @@ # Build the regexp that matches an "ASM value" (currently only for --asm-show-inst comments). ASM_VALUE_REGEXP_STRING = '' for nameless_value in asm_nameless_values: - match = createPrefixMatch(nameless_value.ir_prefix, nameless_value.ir_regexp) + match = createPrefixMatch(nameless_value.ir_prefix, nameless_value.ir_regexp, nameless_value.ir_suffix) ASM_VALUE_REGEXP_STRING = createOrRegexp(ASM_VALUE_REGEXP_STRING, match) ASM_VALUE_REGEXP_SUFFIX = r'([>\s]|\Z)' ASM_VALUE_RE = re.compile(r'((?:#|//)\s*)' + '(' + ASM_VALUE_REGEXP_STRING + ')' + ASM_VALUE_REGEXP_SUFFIX) @@ -805,6 +787,9 @@ def get_name_from_ir_value_match(match): return match.group(get_idx_from_ir_value_match(match) + first_nameless_group_in_ir_value_match) +def get_range_from_ir_value_match(match): + return match.span(get_idx_from_ir_value_match(match) + first_nameless_group_in_ir_value_match) + def get_nameless_value_from_match(match, nameless_values) -> NamelessValue: return nameless_values[get_idx_from_ir_value_match(match)] @@ -812,42 +797,40 @@ def may_clash_with_default_check_prefix_name(check_prefix, var): return check_prefix and re.match(r'^' + check_prefix + r'[0-9]+?$', var, re.IGNORECASE) +class TestVar: + def __init__(self, test_name: str, test_regexp: str, test_prefix): + # Name of the FileCheck variable. + self.test_name = test_name + + # Bulk regexp for matching the variable. + self.test_regexp = test_regexp + + # Prefix that is added to the match if possible (i.e., '%') + self.test_prefix = test_prefix + + def seen(self, test_prefix): + if self.test_prefix is not None: + if self.test_prefix != test_prefix: + self.test_prefix = None + + def get_def(self): + if self.test_regexp: + return '[[' + self.test_name + ':' + (self.test_prefix or '') + self.test_regexp + ']]' + assert not self.test_prefix + return '[[#' + self.test_name + ':]]' + + def get_use(self): + if self.test_regexp: + return '[[' + self.test_name + ']]' + return '[[#' + self.test_name + ']]' + def generalize_check_lines_common(lines, is_analyze, vars_seen, global_vars_seen, nameless_values, nameless_value_regex, is_asm): - # This gets called for each match that occurs in - # a line. We transform variables we haven't seen - # into defs, and variables we have seen into uses. - def transform_line_vars(match): - var = get_name_from_ir_value_match(match) - nameless_value = get_nameless_value_from_match(match, nameless_values) - if may_clash_with_default_check_prefix_name(nameless_value.check_prefix, var): - warn("Change IR value name '%s' or use --prefix-filecheck-ir-name to prevent possible conflict" - " with scripted FileCheck name." % (var,)) - key = (var, nameless_value.check_key) - is_local_def = nameless_value.is_local_def_ir_value_match(match) - if is_local_def and key in vars_seen: - rv = nameless_value.get_value_use(var, match) - elif not is_local_def and key in global_vars_seen: - # We could have seen a different prefix for the global variables first, - # ensure we use that one instead of the prefix for the current match. - rv = nameless_value.get_value_use(var, match, global_vars_seen[key]) - else: - if is_local_def: - vars_seen.add(key) - else: - global_vars_seen[key] = nameless_value.check_prefix - rv = nameless_value.get_value_definition(var, match) - # re.sub replaces the entire regex match - # with whatever you return, so we have - # to make sure to hand it back everything - # including the commas and spaces. - return match.group(1) + rv + match.group(match.lastindex) - lines_with_def = [] - for i, line in enumerate(lines): - if not is_asm: + if not is_asm: + for i, line in enumerate(lines): # An IR variable named '%.' matches the FileCheck regex string. line = line.replace('%.', '%dot') for regex in _global_hex_value_regex: @@ -859,14 +842,75 @@ # Ignore any comments, since the check lines will too. scrubbed_line = SCRUB_IR_COMMENT_RE.sub(r'', line) lines[i] = scrubbed_line - if is_asm or not is_analyze: + + if is_asm or not is_analyze: + # First pass: find local definitions and determine the appropriate test + # prefix + defs = set() + for line in lines: + for match in nameless_value_regex.finditer(line): + var = get_name_from_ir_value_match(match) + nameless_value = get_nameless_value_from_match(match, nameless_values) + if may_clash_with_default_check_prefix_name(nameless_value.check_prefix, var): + warn("Change IR value name '%s' or use --prefix-filecheck-ir-name to prevent possible conflict" + " with scripted FileCheck name." % (var,)) + + key = (var, nameless_value.check_key) + is_local_def = nameless_value.is_local_def_ir_value_match(match) + + if is_local_def: + vars_dict = vars_seen + else: + vars_dict = global_vars_seen + + if key in vars_dict: + vars_dict[key].seen(nameless_value.test_prefix) + else: + regexp = nameless_value.get_ir_regex_from_ir_value_re_match(match) + vars_dict[key] = TestVar(nameless_value.get_value_name(var, nameless_value.check_prefix), + regexp, nameless_value.test_prefix) + defs.add(key) + + + # Second pass: Transform the lines + for i, line in enumerate(lines): # It can happen that two matches are back-to-back and for some reason sub # will not replace both of them. For now we work around this by # substituting until there is no more match. - changed = True - while changed: - (lines[i], changed) = nameless_value_regex.subn(transform_line_vars, - lines[i], count=1) + transformed = [] + pos = 0 + + for match in nameless_value_regex.finditer(line): + var = get_name_from_ir_value_match(match) + nameless_value = get_nameless_value_from_match(match, nameless_values) + (start, end) = get_range_from_ir_value_match(match) + + key = (var, nameless_value.check_key) + is_local_def = nameless_value.is_local_def_ir_value_match(match) + + if is_local_def: + vars_dict = vars_seen + else: + vars_dict = global_vars_seen + + test_var = vars_dict[key] + if test_var.test_prefix is not None: + start -= len(test_var.test_prefix) + + if key in defs: + sub = test_var.get_def() + defs.remove(key) + else: + sub = test_var.get_use() + + transformed.append(line[pos:start]) + transformed.append(sub) + pos = end + + if pos != 0: + transformed.append(line[pos:]) + lines[i] = ''.join(transformed) + return lines # Replace IR value defs and uses with FileCheck variables. @@ -924,7 +968,7 @@ global_vars_seen_before = [key for key in global_vars_seen.keys()] - vars_seen = set() + vars_seen = {} printed_prefixes.append(checkprefix) attrs = str(func_dict[checkprefix][func_name].attrs) attrs = '' if attrs == 'None' else attrs