[PATCH] D145321: [clang-tidy] altera-id-dependent-backward-branch: fix assignment notes

2023-03-05 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh added inline comments.



Comment at: 
clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp:126
   IdDepFieldsMap[Field] = IdDependencyRecord(
   Field, Statement->getBeginLoc(),
   Twine("assignment of ID-dependent field ") + Field->getNameAsString());

This line was already correct prior to this patch.



Comment at: 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp:42
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to variable reference to 'ThreadIDAssigned' and may cause 
performance degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-4]]:3: note: assignment of ID-dependent variable 
ThreadIDAssigned
+accumulator++;

It previously pointed at `int ThreadIDAssigned = 0`, not `ThreadIDAssigned = 
get_local_id(0) * 2`.



Comment at: 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp:61-63
-  for (int i = 0; i < ThreadID2; i++) {
-// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to variable reference to 'ThreadID2' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-// CHECK-NOTES: :[[@LINE-4]]:3: note: inferred assignment of ID-dependent 
value from ID-dependent variable ThreadID

This became `ThreadIDVarFromVar`, see above.



Comment at: 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp:180-210
+  int NotThreadIDVarFromVar = NotThreadID * 2;
+  for (int i = 0; i < NotThreadIDVarFromVar; i++) {
+accumulator++;
+  }
+
+  int NotThreadIDVarAssignFromVar;
+  NotThreadIDVarAssignFromVar = NotThreadID * 2;

I mirror all id-dependent tests with non-id-dependent to make sure 
https://github.com/llvm/llvm-project/issues/52790 does not creep back.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145321/new/

https://reviews.llvm.org/D145321

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D145321: [clang-tidy] altera-id-dependent-backward-branch: fix direct assignment notes

2023-03-05 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh updated this revision to Diff 502447.
yeputons-gh added a comment.

Test inferred assignments and fix notes for them as well.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145321/new/

https://reviews.llvm.org/D145321

Files:
  clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
  
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
@@ -34,6 +34,15 @@
   // CHECK-NOTES: :[[@LINE-1]]:12: warning: backward branch (do loop) is ID-dependent due to variable reference to 'ThreadID' and may cause performance degradation [altera-id-dependent-backward-branch]
   // CHECK-NOTES: :[[@LINE-12]]:3: note: assignment of ID-dependent variable ThreadID
 
+  int ThreadIDAssigned = 0;
+  ThreadIDAssigned = get_local_id(0) * 2;
+
+  for (int i = 0; i < ThreadIDAssigned; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is ID-dependent due to variable reference to 'ThreadIDAssigned' and may cause performance degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-4]]:3: note: assignment of ID-dependent variable ThreadIDAssigned
+accumulator++;
+  }
+
   struct { int IDDepField; } Example;
   Example.IDDepField = get_local_id(0);
 
@@ -56,11 +65,49 @@
   // CHECK-NOTES: :[[@LINE-18]]:3: note: assignment of ID-dependent field IDDepField
 
   //  Inferred Assignments 
-  int ThreadID2 = ThreadID * 2;
+  int ThreadIDVarFromVar = ThreadID * 2;
+  for (int i = 0; i < ThreadIDVarFromVar; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is ID-dependent due to variable reference to 'ThreadIDVarFromVar' and may cause performance degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-3]]:28: note: inferred assignment of ID-dependent value from ID-dependent variable ThreadID
+accumulator++;
+  }
+
+  int ThreadIDVarAssignFromVar;
+  ThreadIDVarAssignFromVar = ThreadID * 2;
+  for (int i = 0; i < ThreadIDVarAssignFromVar; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is ID-dependent due to variable reference to 'ThreadIDVarAssignFromVar' and may cause performance degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-3]]:30: note: inferred assignment of ID-dependent value from ID-dependent variable ThreadID
+accumulator++;
+  }
+
+  int ThreadIDVarFromMember = Example.IDDepField * 2;
+  for (int i = 0; i < ThreadIDVarFromMember; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is ID-dependent due to variable reference to 'ThreadIDVarFromMember' and may cause performance degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-3]]:31: note: inferred assignment of ID-dependent value from ID-dependent member IDDepField
+accumulator++;
+  }
+
+  int ThreadIDVarAssignFromMember;
+  ThreadIDVarAssignFromMember = Example.IDDepField * 2;
+  for (int i = 0; i < ThreadIDVarAssignFromMember; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is ID-dependent due to variable reference to 'ThreadIDVarAssignFromMember' and may cause performance degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-3]]:33: note: inferred assignment of ID-dependent value from ID-dependent member IDDepField
+accumulator++;
+  }
+
+  struct { int IDDepFieldFromVar; } ExampleFromVar;
+  ExampleFromVar.IDDepFieldFromVar = ThreadID * 2;
+  for (int i = 0; i < ExampleFromVar.IDDepFieldFromVar; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is ID-dependent due to member reference to 'IDDepFieldFromVar' and may cause performance degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-3]]:38: note: inferred assignment of ID-dependent member from ID-dependent variable ThreadID
+accumulator++;
+  }
 
-  for (int i = 0; i < ThreadID2; i++) {
-// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is ID-dependent due to variable reference to 'ThreadID2' and may cause performance degradation [altera-id-dependent-backward-branch]
-// CHECK-NOTES: :[[@LINE-4]]:3: note: inferred assignment of ID-dependent value from ID-dependent variable ThreadID
+  struct { int IDDepFieldFromMember; } ExampleFromMember;
+  ExampleFromMember.IDDepFieldFromMember = Example.IDDepField * 2;
+  for (int i = 0; i < ExampleFromMember.IDDepFieldFromMember; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is ID-dependent due to member reference to 

[PATCH] D145321: [clang-tidy] altera-id-dependent-backward-branch: fix direct assignment notes

2023-03-05 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh created this revision.
Herald added subscribers: carlosgalvezp, xazax.hun.
Herald added a reviewer: njames93.
Herald added a project: All.
yeputons-gh requested review of this revision.
Herald added a project: clang-tools-extra.
Herald added a subscriber: cfe-commits.

Previously a note was always issued on a variable declaration itself. Now it
points to the actual assignment of `get_local_id` to the variable, like with
fields.

Depends on D145305 


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D145321

Files:
  clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
  
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp


Index: 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
+++ 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
@@ -34,6 +34,15 @@
   // CHECK-NOTES: :[[@LINE-1]]:12: warning: backward branch (do loop) is 
ID-dependent due to variable reference to 'ThreadID' and may cause performance 
degradation [altera-id-dependent-backward-branch]
   // CHECK-NOTES: :[[@LINE-12]]:3: note: assignment of ID-dependent variable 
ThreadID
 
+  int ThreadIDAssigned = 0;
+  ThreadIDAssigned = get_local_id(0) * 2;
+
+  for (int i = 0; i < ThreadIDAssigned; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to variable reference to 'ThreadIDAssigned' and may cause 
performance degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-4]]:3: note: assignment of ID-dependent variable 
ThreadIDAssigned
+accumulator++;
+  }
+
   struct { int IDDepField; } Example;
   Example.IDDepField = get_local_id(0);
 
@@ -107,6 +116,13 @@
 accumulator++;
   } while (j < NotThreadID);
 
+  int NotThreadIDAssigned = 0;
+  NotThreadIDAssigned = foo(0) * 2;
+
+  for (int i = 0; i < NotThreadIDAssigned; i++) {
+accumulator++;
+  }
+
   struct { int NotIDDepField; } Example;
   Example.NotIDDepField = foo(0);
 
Index: clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
===
--- clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
+++ clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
@@ -114,7 +114,7 @@
   const VarDecl *Variable) {
   // Record that this variable is thread-dependent.
   IdDepVarsMap[Variable] =
-  IdDependencyRecord(Variable, Variable->getBeginLoc(),
+  IdDependencyRecord(Variable, Statement->getBeginLoc(),
  Twine("assignment of ID-dependent variable ") +
  Variable->getNameAsString());
 }


Index: clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
@@ -34,6 +34,15 @@
   // CHECK-NOTES: :[[@LINE-1]]:12: warning: backward branch (do loop) is ID-dependent due to variable reference to 'ThreadID' and may cause performance degradation [altera-id-dependent-backward-branch]
   // CHECK-NOTES: :[[@LINE-12]]:3: note: assignment of ID-dependent variable ThreadID
 
+  int ThreadIDAssigned = 0;
+  ThreadIDAssigned = get_local_id(0) * 2;
+
+  for (int i = 0; i < ThreadIDAssigned; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is ID-dependent due to variable reference to 'ThreadIDAssigned' and may cause performance degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-4]]:3: note: assignment of ID-dependent variable ThreadIDAssigned
+accumulator++;
+  }
+
   struct { int IDDepField; } Example;
   Example.IDDepField = get_local_id(0);
 
@@ -107,6 +116,13 @@
 accumulator++;
   } while (j < NotThreadID);
 
+  int NotThreadIDAssigned = 0;
+  NotThreadIDAssigned = foo(0) * 2;
+
+  for (int i = 0; i < NotThreadIDAssigned; i++) {
+accumulator++;
+  }
+
   struct { int NotIDDepField; } Example;
   Example.NotIDDepField = foo(0);
 
Index: clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
===
--- clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
+++ clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
@@ -114,7 +114,7 @@
   const VarDecl *Variable) {
   // Record that this variable is thread-dependent.
   IdDepVarsMap[Variable] =
-  IdDependencyRecord(Variable, Variable->getBeginLoc(),
+

[PATCH] D145305: [clang-tidy] altera-id-dependent-backward-branch: do not mark all variables

2023-03-05 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh updated this revision to Diff 502445.
yeputons-gh added a comment.

Rebased on top of the recent `main`.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145305/new/

https://reviews.llvm.org/D145305

Files:
  clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
  clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
  
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
@@ -71,6 +71,8 @@
   UnusedStruct.IDDepField = ThreadID * 2; // OK: not used in any loops
 }
 
+int foo(int);
+
 void success() {
   int accumulator = 0;
 
@@ -79,4 +81,57 @@
   accumulator++;
 }
   }
+
+  //  Conditional Expressions 
+  for (int i = 0; i < foo(0); i++) {
+accumulator++;
+  }
+
+  int j = 0;
+  while (j < foo(0)) {
+accumulator++;
+  }
+
+  do {
+accumulator++;
+  } while (j < foo(0));
+
+  //  Assignments 
+  int NotThreadID = foo(0);
+
+  while (j < NotThreadID) {
+accumulator++;
+  }
+
+  do {
+accumulator++;
+  } while (j < NotThreadID);
+
+  struct { int NotIDDepField; } Example;
+  Example.NotIDDepField = foo(0);
+
+  for (int i = 0; i < Example.NotIDDepField; i++) {
+accumulator++;
+  }
+
+  while (j < Example.NotIDDepField) {
+accumulator++;
+  }
+
+  do {
+accumulator++;
+  } while (j < Example.NotIDDepField);
+
+  //  Inferred Assignments 
+  int NotThreadID2 = NotThreadID * 2;
+
+  for (int i = 0; i < NotThreadID2; i++) {
+accumulator++;
+  }
+
+  //  Unused Inferred Assignments 
+  int UnusedNotThreadID = Example.NotIDDepField;
+
+  struct { int NotIDDepField; } UnusedStruct;
+  UnusedStruct.NotIDDepField = NotThreadID * 2;
 }
Index: clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
===
--- clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
+++ clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
@@ -56,14 +56,14 @@
   void saveIdDepField(const Stmt *Statement, const FieldDecl *Field);
   /// Stores the location an ID-dependent variable is created from a reference
   /// to another ID-dependent variable or field in IdDepVarsMap.
-  void saveIdDepVarFromReference(const DeclRefExpr *RefExpr,
- const MemberExpr *MemExpr,
- const VarDecl *PotentialVar);
+  void saveIdDepVarFromPotentialReference(const DeclRefExpr *RefExpr,
+  const MemberExpr *MemExpr,
+  const VarDecl *PotentialVar);
   /// Stores the location an ID-dependent field is created from a reference to
   /// another ID-dependent variable or field in IdDepFieldsMap.
-  void saveIdDepFieldFromReference(const DeclRefExpr *RefExpr,
-   const MemberExpr *MemExpr,
-   const FieldDecl *PotentialField);
+  void saveIdDepFieldFromPotentialReference(const DeclRefExpr *RefExpr,
+const MemberExpr *MemExpr,
+const FieldDecl *PotentialField);
   /// Returns the loop type.
   LoopType getLoopType(const Stmt *Loop);
 
Index: clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
===
--- clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
+++ clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
@@ -127,7 +127,7 @@
   Twine("assignment of ID-dependent field ") + Field->getNameAsString());
 }
 
-void IdDependentBackwardBranchCheck::saveIdDepVarFromReference(
+void IdDependentBackwardBranchCheck::saveIdDepVarFromPotentialReference(
 const DeclRefExpr *RefExpr, const MemberExpr *MemExpr,
 const VarDecl *PotentialVar) {
   // If the variable is already in IdDepVarsMap, ignore it.
@@ -140,20 +140,26 @@
   if (RefExpr) {
 const auto *RefVar = dyn_cast(RefExpr->getDecl());
 // If variable isn't ID-dependent, but RefVar is.
-if (IdDepVarsMap.find(RefVar) != IdDepVarsMap.end())
+if (IdDepVarsMap.find(RefVar) != IdDepVarsMap.end()) {
   StringStream << "variable " << RefVar->getNameAsString();
+  IdDepVarsMap[PotentialVar] = IdDependencyRecord(
+  PotentialVar, PotentialVar->getBeginLoc(), Message);
+  return; // Optional, as we only match only one of `RefExpr` or `MemExpr`
+}
   }
   if (MemExpr) {
 const auto *RefField = dyn_cast(MemExpr->getMemberDecl());
 // If variable isn't 

[PATCH] D145304: [clang-tidy] altera-id-dependent-backward-branch: refactor test

2023-03-05 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh updated this revision to Diff 502442.
yeputons-gh added a comment.

Rebased on top of the recent 'main'.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145304/new/

https://reviews.llvm.org/D145304

Files:
  
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp


Index: 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
+++ 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
@@ -1,9 +1,5 @@
 // RUN: %check_clang_tidy %s altera-id-dependent-backward-branch %t -- 
-header-filter=.* "--" -cl-std=CL1.2 -c
 
-typedef struct ExampleStruct {
-  int IDDepField;
-} ExampleStruct;
-
 void error() {
   //  Conditional Expressions 
   int accumulator = 0;
@@ -32,39 +28,24 @@
 accumulator++;
   }
 
-  ExampleStruct Example;
-  Example.IDDepField = get_local_id(0);
-
-  //  Inferred Assignments 
-  int ThreadID2 = ThreadID * get_local_size(0);
-
-  int ThreadID3 = Example.IDDepField; // OK: not used in any loops
-
-  ExampleStruct UnusedStruct = {
-  ThreadID * 2 // OK: not used in any loops
-  };
-
-  for (int i = 0; i < ThreadID2; i++) {
-// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to variable reference to 'ThreadID2' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-// CHECK-NOTES: :[[@LINE-10]]:3: note: inferred assignment of ID-dependent 
value from ID-dependent variable ThreadID
-accumulator++;
-  }
-
   do {
 accumulator++;
   } while (j < ThreadID);
   // CHECK-NOTES: :[[@LINE-1]]:12: warning: backward branch (do loop) is 
ID-dependent due to variable reference to 'ThreadID' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-  // CHECK-NOTES: :[[@LINE-30]]:3: note: assignment of ID-dependent variable 
ThreadID
+  // CHECK-NOTES: :[[@LINE-12]]:3: note: assignment of ID-dependent variable 
ThreadID
+
+  struct { int IDDepField; } Example;
+  Example.IDDepField = get_local_id(0);
 
   for (int i = 0; i < Example.IDDepField; i++) {
 // CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-// CHECK-NOTES: :[[@LINE-25]]:3: note: assignment of ID-dependent field 
IDDepField
+// CHECK-NOTES: :[[@LINE-4]]:3: note: assignment of ID-dependent field 
IDDepField
 accumulator++;
   }
 
   while (j < Example.IDDepField) {
 // CHECK-NOTES: :[[@LINE-1]]:10: warning: backward branch (while loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-// CHECK-NOTES: :[[@LINE-31]]:3: note: assignment of ID-dependent field 
IDDepField
+// CHECK-NOTES: :[[@LINE-10]]:3: note: assignment of ID-dependent field 
IDDepField
 accumulator++;
   }
 
@@ -72,7 +53,22 @@
 accumulator++;
   } while (j < Example.IDDepField);
   // CHECK-NOTES: :[[@LINE-1]]:12: warning: backward branch (do loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-  // CHECK-NOTES: :[[@LINE-39]]:3: note: assignment of ID-dependent field 
IDDepField
+  // CHECK-NOTES: :[[@LINE-18]]:3: note: assignment of ID-dependent field 
IDDepField
+
+  //  Inferred Assignments 
+  int ThreadID2 = ThreadID * 2;
+
+  for (int i = 0; i < ThreadID2; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to variable reference to 'ThreadID2' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-4]]:3: note: inferred assignment of ID-dependent 
value from ID-dependent variable ThreadID
+accumulator++;
+  }
+
+  //  Unused Inferred Assignments 
+  int UnusedThreadID = Example.IDDepField; // OK: not used in any loops
+
+  struct { int IDDepField; } UnusedStruct;
+  UnusedStruct.IDDepField = ThreadID * 2; // OK: not used in any loops
 }
 
 void success() {


Index: clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
@@ -1,9 +1,5 @@
 // RUN: %check_clang_tidy %s altera-id-dependent-backward-branch %t -- -header-filter=.* "--" -cl-std=CL1.2 -c
 
-typedef struct ExampleStruct {
-  int IDDepField;
-} ExampleStruct;
-
 void error() {
   //  Conditional Expressions 
   int accumulator = 0;
@@ -32,39 +28,24 @@
 

[PATCH] D145304: [clang-tidy] altera-id-dependent-backward-branch: refactor test

2023-03-05 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh added a comment.

Absolutely, give we few minutes. Maybe it conflicts with the previous revision 
that has already landed?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145304/new/

https://reviews.llvm.org/D145304

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D145303: clang-tidy altera-id-dependent-backward-branch: print notes after warning

2023-03-05 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh added a comment.

Hi, @carlosgalvezp ! I don't have any commit rights for the LLVM project, so I 
probably need help. My GitHub handle is `yeputons` 
(https://github.com/yeputons/), my email for attribution is 
`egor.suvo...@gmail.com` (that's my first name, last name)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145303/new/

https://reviews.llvm.org/D145303

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D145305: clang-tidy altera-id-dependent-backward-branch: fix #52790

2023-03-04 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh added inline comments.



Comment at: 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp:128
+
+  for (int i = 0; i < NotThreadID2; i++) {
+accumulator++;

This line previously yielded a false positive. Now it does not. More tests are 
created in upcoming patches.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145305/new/

https://reviews.llvm.org/D145305

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D145305: clang-tidy altera-id-dependent-backward-branch: fix #52790

2023-03-04 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh updated this revision to Diff 502372.
yeputons-gh added a comment.

Applied clang-format to the header as well


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145305/new/

https://reviews.llvm.org/D145305

Files:
  clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
  clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
  
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
@@ -71,6 +71,8 @@
   UnusedStruct.IDDepField = ThreadID * 2; // OK: not used in any loops
 }
 
+int foo(int);
+
 void success() {
   int accumulator = 0;
 
@@ -79,4 +81,57 @@
   accumulator++;
 }
   }
+
+  //  Conditional Expressions 
+  for (int i = 0; i < foo(0); i++) {
+accumulator++;
+  }
+
+  int j = 0;
+  while (j < foo(0)) {
+accumulator++;
+  }
+
+  do {
+accumulator++;
+  } while (j < foo(0));
+
+  //  Assignments 
+  int NotThreadID = foo(0);
+
+  while (j < NotThreadID) {
+accumulator++;
+  }
+
+  do {
+accumulator++;
+  } while (j < NotThreadID);
+
+  struct { int NotIDDepField; } Example;
+  Example.NotIDDepField = foo(0);
+
+  for (int i = 0; i < Example.NotIDDepField; i++) {
+accumulator++;
+  }
+
+  while (j < Example.NotIDDepField) {
+accumulator++;
+  }
+
+  do {
+accumulator++;
+  } while (j < Example.NotIDDepField);
+
+  //  Inferred Assignments 
+  int NotThreadID2 = NotThreadID * 2;
+
+  for (int i = 0; i < NotThreadID2; i++) {
+accumulator++;
+  }
+
+  //  Unused Inferred Assignments 
+  int UnusedNotThreadID = Example.NotIDDepField;
+
+  struct { int NotIDDepField; } UnusedStruct;
+  UnusedStruct.NotIDDepField = NotThreadID * 2;
 }
Index: clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
===
--- clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
+++ clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
@@ -56,14 +56,14 @@
   void saveIdDepField(const Stmt *Statement, const FieldDecl *Field);
   /// Stores the location an ID-dependent variable is created from a reference
   /// to another ID-dependent variable or field in IdDepVarsMap.
-  void saveIdDepVarFromReference(const DeclRefExpr *RefExpr,
- const MemberExpr *MemExpr,
- const VarDecl *PotentialVar);
+  void saveIdDepVarFromPotentialReference(const DeclRefExpr *RefExpr,
+  const MemberExpr *MemExpr,
+  const VarDecl *PotentialVar);
   /// Stores the location an ID-dependent field is created from a reference to
   /// another ID-dependent variable or field in IdDepFieldsMap.
-  void saveIdDepFieldFromReference(const DeclRefExpr *RefExpr,
-   const MemberExpr *MemExpr,
-   const FieldDecl *PotentialField);
+  void saveIdDepFieldFromPotentialReference(const DeclRefExpr *RefExpr,
+const MemberExpr *MemExpr,
+const FieldDecl *PotentialField);
   /// Returns the loop type.
   LoopType getLoopType(const Stmt *Loop);
 
Index: clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
===
--- clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
+++ clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
@@ -127,7 +127,7 @@
   Twine("assignment of ID-dependent field ") + Field->getNameAsString());
 }
 
-void IdDependentBackwardBranchCheck::saveIdDepVarFromReference(
+void IdDependentBackwardBranchCheck::saveIdDepVarFromPotentialReference(
 const DeclRefExpr *RefExpr, const MemberExpr *MemExpr,
 const VarDecl *PotentialVar) {
   // If the variable is already in IdDepVarsMap, ignore it.
@@ -140,20 +140,26 @@
   if (RefExpr) {
 const auto *RefVar = dyn_cast(RefExpr->getDecl());
 // If variable isn't ID-dependent, but RefVar is.
-if (IdDepVarsMap.find(RefVar) != IdDepVarsMap.end())
+if (IdDepVarsMap.find(RefVar) != IdDepVarsMap.end()) {
   StringStream << "variable " << RefVar->getNameAsString();
+  IdDepVarsMap[PotentialVar] = IdDependencyRecord(
+  PotentialVar, PotentialVar->getBeginLoc(), Message);
+  return; // Optional, as we only match only one of `RefExpr` or `MemExpr`
+}
   }
   if (MemExpr) {
 const auto *RefField = dyn_cast(MemExpr->getMemberDecl());
 // If variable 

[PATCH] D145305: clang-tidy altera-id-dependent-backward-branch: fix #52790

2023-03-04 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh created this revision.
Herald added a subscriber: carlosgalvezp.
Herald added a reviewer: njames93.
Herald added a project: All.
yeputons-gh requested review of this revision.
Herald added a project: clang-tools-extra.
Herald added a subscriber: cfe-commits.

Mark variables/fields as ID-dependent when initializing from ID-dependent
expressions only, not any expressions.

Depends on D145304 


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D145305

Files:
  clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
  clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
  
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
@@ -71,6 +71,8 @@
   UnusedStruct.IDDepField = ThreadID * 2; // OK: not used in any loops
 }
 
+int foo(int);
+
 void success() {
   int accumulator = 0;
 
@@ -79,4 +81,57 @@
   accumulator++;
 }
   }
+
+  //  Conditional Expressions 
+  for (int i = 0; i < foo(0); i++) {
+accumulator++;
+  }
+
+  int j = 0;
+  while (j < foo(0)) {
+accumulator++;
+  }
+
+  do {
+accumulator++;
+  } while (j < foo(0));
+
+  //  Assignments 
+  int NotThreadID = foo(0);
+
+  while (j < NotThreadID) {
+accumulator++;
+  }
+
+  do {
+accumulator++;
+  } while (j < NotThreadID);
+
+  struct { int NotIDDepField; } Example;
+  Example.NotIDDepField = foo(0);
+
+  for (int i = 0; i < Example.NotIDDepField; i++) {
+accumulator++;
+  }
+
+  while (j < Example.NotIDDepField) {
+accumulator++;
+  }
+
+  do {
+accumulator++;
+  } while (j < Example.NotIDDepField);
+
+  //  Inferred Assignments 
+  int NotThreadID2 = NotThreadID * 2;
+
+  for (int i = 0; i < NotThreadID2; i++) {
+accumulator++;
+  }
+
+  //  Unused Inferred Assignments 
+  int UnusedNotThreadID = Example.NotIDDepField;
+
+  struct { int NotIDDepField; } UnusedStruct;
+  UnusedStruct.NotIDDepField = NotThreadID * 2;
 }
Index: clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
===
--- clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
+++ clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.h
@@ -56,12 +56,12 @@
   void saveIdDepField(const Stmt *Statement, const FieldDecl *Field);
   /// Stores the location an ID-dependent variable is created from a reference
   /// to another ID-dependent variable or field in IdDepVarsMap.
-  void saveIdDepVarFromReference(const DeclRefExpr *RefExpr,
+  void saveIdDepVarFromPotentialReference(const DeclRefExpr *RefExpr,
  const MemberExpr *MemExpr,
  const VarDecl *PotentialVar);
   /// Stores the location an ID-dependent field is created from a reference to
   /// another ID-dependent variable or field in IdDepFieldsMap.
-  void saveIdDepFieldFromReference(const DeclRefExpr *RefExpr,
+  void saveIdDepFieldFromPotentialReference(const DeclRefExpr *RefExpr,
const MemberExpr *MemExpr,
const FieldDecl *PotentialField);
   /// Returns the loop type.
Index: clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
===
--- clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
+++ clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
@@ -127,7 +127,7 @@
   Twine("assignment of ID-dependent field ") + Field->getNameAsString());
 }
 
-void IdDependentBackwardBranchCheck::saveIdDepVarFromReference(
+void IdDependentBackwardBranchCheck::saveIdDepVarFromPotentialReference(
 const DeclRefExpr *RefExpr, const MemberExpr *MemExpr,
 const VarDecl *PotentialVar) {
   // If the variable is already in IdDepVarsMap, ignore it.
@@ -140,20 +140,26 @@
   if (RefExpr) {
 const auto *RefVar = dyn_cast(RefExpr->getDecl());
 // If variable isn't ID-dependent, but RefVar is.
-if (IdDepVarsMap.find(RefVar) != IdDepVarsMap.end())
+if (IdDepVarsMap.find(RefVar) != IdDepVarsMap.end()) {
   StringStream << "variable " << RefVar->getNameAsString();
+  IdDepVarsMap[PotentialVar] = IdDependencyRecord(
+  PotentialVar, PotentialVar->getBeginLoc(), Message);
+  return; // Optional, as we only match only one of `RefExpr` or `MemExpr`
+}
   }
   if (MemExpr) {
 const auto *RefField = dyn_cast(MemExpr->getMemberDecl());
 // If variable isn't ID-dependent, but RefField is.
-if (IdDepFieldsMap.find(RefField) != 

[PATCH] D145304: clang-tidy altera-id-dependent-backward-branch: refactor test

2023-03-04 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh created this revision.
Herald added a project: All.
yeputons-gh requested review of this revision.
Herald added a project: clang-tools-extra.
Herald added a subscriber: cfe-commits.

- Put all "Inferred Assignments" testing at the end
- Group together ID-dependent variable/member testing
- Group together unused inferred assignments
- Use a literal instead of `get_local_size` which may have special meaning
- Create a new `struct` for each variable because analysis is done per field, 
not per field per instance.

Depends on D145303 


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D145304

Files:
  
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp


Index: 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
+++ 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
@@ -1,9 +1,5 @@
 // RUN: %check_clang_tidy %s altera-id-dependent-backward-branch %t -- 
-header-filter=.* "--" -cl-std=CL1.2 -c
 
-typedef struct ExampleStruct {
-  int IDDepField;
-} ExampleStruct;
-
 void error() {
   //  Conditional Expressions 
   int accumulator = 0;
@@ -32,39 +28,24 @@
 accumulator++;
   }
 
-  ExampleStruct Example;
-  Example.IDDepField = get_local_id(0);
-
-  //  Inferred Assignments 
-  int ThreadID2 = ThreadID * get_local_size(0);
-
-  int ThreadID3 = Example.IDDepField; // OK: not used in any loops
-
-  ExampleStruct UnusedStruct = {
-  ThreadID * 2 // OK: not used in any loops
-  };
-
-  for (int i = 0; i < ThreadID2; i++) {
-// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to variable reference to 'ThreadID2' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-// CHECK-NOTES: :[[@LINE-10]]:3: note: inferred assignment of ID-dependent 
value from ID-dependent variable ThreadID
-accumulator++;
-  }
-
   do {
 accumulator++;
   } while (j < ThreadID);
   // CHECK-NOTES: :[[@LINE-1]]:12: warning: backward branch (do loop) is 
ID-dependent due to variable reference to 'ThreadID' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-  // CHECK-NOTES: :[[@LINE-30]]:3: note: assignment of ID-dependent variable 
ThreadID
+  // CHECK-NOTES: :[[@LINE-12]]:3: note: assignment of ID-dependent variable 
ThreadID
+
+  struct { int IDDepField; } Example;
+  Example.IDDepField = get_local_id(0);
 
   for (int i = 0; i < Example.IDDepField; i++) {
 // CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-// CHECK-NOTES: :[[@LINE-25]]:3: note: assignment of ID-dependent field 
IDDepField
+// CHECK-NOTES: :[[@LINE-4]]:3: note: assignment of ID-dependent field 
IDDepField
 accumulator++;
   }
 
   while (j < Example.IDDepField) {
 // CHECK-NOTES: :[[@LINE-1]]:10: warning: backward branch (while loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-// CHECK-NOTES: :[[@LINE-31]]:3: note: assignment of ID-dependent field 
IDDepField
+// CHECK-NOTES: :[[@LINE-10]]:3: note: assignment of ID-dependent field 
IDDepField
 accumulator++;
   }
 
@@ -72,7 +53,22 @@
 accumulator++;
   } while (j < Example.IDDepField);
   // CHECK-NOTES: :[[@LINE-1]]:12: warning: backward branch (do loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
-  // CHECK-NOTES: :[[@LINE-39]]:3: note: assignment of ID-dependent field 
IDDepField
+  // CHECK-NOTES: :[[@LINE-18]]:3: note: assignment of ID-dependent field 
IDDepField
+
+  //  Inferred Assignments 
+  int ThreadID2 = ThreadID * 2;
+
+  for (int i = 0; i < ThreadID2; i++) {
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to variable reference to 'ThreadID2' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-4]]:3: note: inferred assignment of ID-dependent 
value from ID-dependent variable ThreadID
+accumulator++;
+  }
+
+  //  Unused Inferred Assignments 
+  int UnusedThreadID = Example.IDDepField; // OK: not used in any loops
+
+  struct { int IDDepField; } UnusedStruct;
+  UnusedStruct.IDDepField = ThreadID * 2; // OK: not used in any loops
 }
 
 void success() {


Index: clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- 

[PATCH] D145303: clang-tidy altera-id-dependent-backward-branch: print notes after warning

2023-03-04 Thread Egor Suvorov via Phabricator via cfe-commits
yeputons-gh created this revision.
Herald added a subscriber: carlosgalvezp.
Herald added a reviewer: njames93.
Herald added a project: All.
yeputons-gh requested review of this revision.
Herald added a project: clang-tools-extra.
Herald added a subscriber: cfe-commits.

In Clang notes are typically printed after a corresponding warning, not before.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D145303

Files:
  clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp
  
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp


Index: 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
===
--- 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
+++ 
clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp
@@ -27,8 +27,8 @@
   int ThreadID = get_local_id(0);
 
   while (j < ThreadID) {
-// CHECK-NOTES: :[[@LINE-3]]:3: note: assignment of ID-dependent variable 
ThreadID
-// CHECK-NOTES: :[[@LINE-2]]:10: warning: backward branch (while loop) is 
ID-dependent due to variable reference to 'ThreadID' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-1]]:10: warning: backward branch (while loop) is 
ID-dependent due to variable reference to 'ThreadID' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-4]]:3: note: assignment of ID-dependent variable 
ThreadID
 accumulator++;
   }
 
@@ -45,34 +45,34 @@
   };
 
   for (int i = 0; i < ThreadID2; i++) {
-// CHECK-NOTES: :[[@LINE-9]]:3: note: inferred assignment of ID-dependent 
value from ID-dependent variable ThreadID
-// CHECK-NOTES: :[[@LINE-2]]:19: warning: backward branch (for loop) is 
ID-dependent due to variable reference to 'ThreadID2' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to variable reference to 'ThreadID2' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-10]]:3: note: inferred assignment of ID-dependent 
value from ID-dependent variable ThreadID
 accumulator++;
   }
 
   do {
 accumulator++;
   } while (j < ThreadID);
-  // CHECK-NOTES: :[[@LINE-29]]:3: note: assignment of ID-dependent variable 
ThreadID
-  // CHECK-NOTES: :[[@LINE-2]]:12: warning: backward branch (do loop) is 
ID-dependent due to variable reference to 'ThreadID' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+  // CHECK-NOTES: :[[@LINE-1]]:12: warning: backward branch (do loop) is 
ID-dependent due to variable reference to 'ThreadID' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+  // CHECK-NOTES: :[[@LINE-30]]:3: note: assignment of ID-dependent variable 
ThreadID
 
   for (int i = 0; i < Example.IDDepField; i++) {
-// CHECK-NOTES: :[[@LINE-24]]:3: note: assignment of ID-dependent field 
IDDepField
-// CHECK-NOTES: :[[@LINE-2]]:19: warning: backward branch (for loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-1]]:19: warning: backward branch (for loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-25]]:3: note: assignment of ID-dependent field 
IDDepField
 accumulator++;
   }
 
   while (j < Example.IDDepField) {
-// CHECK-NOTES: :[[@LINE-30]]:3: note: assignment of ID-dependent field 
IDDepField
-// CHECK-NOTES: :[[@LINE-2]]:10: warning: backward branch (while loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-1]]:10: warning: backward branch (while loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+// CHECK-NOTES: :[[@LINE-31]]:3: note: assignment of ID-dependent field 
IDDepField
 accumulator++;
   }
 
   do {
 accumulator++;
   } while (j < Example.IDDepField);
-  // CHECK-NOTES: :[[@LINE-38]]:3: note: assignment of ID-dependent field 
IDDepField
-  // CHECK-NOTES: :[[@LINE-2]]:12: warning: backward branch (do loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+  // CHECK-NOTES: :[[@LINE-1]]:12: warning: backward branch (do loop) is 
ID-dependent due to member reference to 'IDDepField' and may cause performance 
degradation [altera-id-dependent-backward-branch]
+  // CHECK-NOTES: :[[@LINE-39]]:3: note: assignment of