Skip to content
  1. Feb 07, 2017
  2. Feb 06, 2017
    • Jonathan Coe's avatar
      [clang-tidy] safety-no-assembler · 3032d3c3
      Jonathan Coe authored
      Summary:
      Add a new clang-tidy module for safety-critical checks.
      
      Include a check for inline assembler.
      
      Reviewers: Prazek, dtarditi, malcolm.parsons, alexfh, aaron.ballman, idlecode
      
      Reviewed By: idlecode
      
      Subscribers: idlecode, JonasToth, Eugene.Zelenko, mgorny, JDevlieghere, cfe-commits
      
      Tags: #clang-tools-extra
      
      Differential Revision: https://reviews.llvm.org/D29267
      
      llvm-svn: 294255
      3032d3c3
    • Simon Pilgrim's avatar
      [X86][SSE] Tests showing the lowering of float/double complex multiplications... · a93c7738
      Simon Pilgrim authored
      [X86][SSE] Tests showing the lowering of float/double complex multiplications with fastmath (PR31866)
      
      llvm-svn: 294254
      a93c7738
    • Rui Ueyama's avatar
      Change the return type of getImplicitAddend to signed integer. · 640724c1
      Rui Ueyama authored
      If relocations don't have addends, addends are embedded in operands.
      getImplicitAddend is a function to read addends. Addends can be
      negative numbers, so the return type of the function should be a
      signed integer type.
      
      llvm-svn: 294253
      640724c1
    • Rafael Espindola's avatar
      Handle symbol assignments before the first section switch. · 06f4743a
      Rafael Espindola authored
      We now create a dummy section with index 1 before processing the
      linker script.
      
      Thanks to George Rimar for finding the bug and providing the initial
      testcase.
      
      llvm-svn: 294252
      06f4743a
    • Paul Robinson's avatar
      Merge DebugLoc on combined stores; in this case, when combining stores · 383c5c22
      Paul Robinson authored
      from the end of two blocks, merge instead of arbitrarily picking one.
      
      Differential Revision: http://reviews.llvm.org/D29504
      
      llvm-svn: 294251
      383c5c22
    • Taewook Oh's avatar
      [GVNHoist] Merge DebugLoc metadata on hoisted instructions · 44a856f7
      Taewook Oh authored
      Summary:
      When instructions are hoisted, current implementation keeps DebugLoc metadata of the instruction that chosen as Repl (and its GEP operand if Repl is a load or a store). However, DebugLoc metadata should be updated to the 'merged' location across all hoisted instructions. See the following example code:
      
      
      ```
        1:  typedef struct {
        2:    int a[10];
        3:  } S1;
        4: 
        5:  extern S1 *s1[10];
        6: 
        7:  void foo(int x, int y, int i) {
        8:    if (y)
        9:      s1[i]->a[i] = x + y;
       10:    else
       11:      s1[i]->a[i] = x;
       12:  }
      ```
      
      Below is LLVM IR representation of the program before gvn-hoist:
      
      
      ```
      %struct.S1 = type { [10 x i32] }
      @s1 = external local_unnamed_addr global [10 x %struct.S1*], align 16
      
      define void @foo(i32 %x, i32 %y, i32 %i) !dbg !4 {
      entry:
        %tobool = icmp ne i32 %y, 0, !dbg !8
        br i1 %tobool, label %if.then, label %if.else, !dbg !10
      
      if.then:                                          ; preds = %entry
        %add = add nsw i32 %x, %y, !dbg !11
        %idxprom = sext i32 %i to i64, !dbg !12
        %arrayidx = getelementptr inbounds [10 x %struct.S1*], [10 x %struct.S1*]* @s1, i64 0, i64 %idxprom, !dbg !12
        %0 = load %struct.S1*, %struct.S1** %arrayidx, align 8, !dbg !12, !tbaa !13
        %a = getelementptr inbounds %struct.S1, %struct.S1* %0, i32 0, i32 0, !dbg !17
        br label %if.end, !dbg !12
      
      if.else:                                          ; preds = %entry
        %idxprom3 = sext i32 %i to i64, !dbg !18
        %arrayidx4 = getelementptr inbounds [10 x %struct.S1*], [10 x %struct.S1*]* @s1, i64 0, i64 %idxprom3, !dbg !18
        %1 = load %struct.S1*, %struct.S1** %arrayidx4, align 8, !dbg !18, !tbaa !13
        %a5 = getelementptr inbounds %struct.S1, %struct.S1* %1, i32 0, i32 0, !dbg !19
        br label %if.end
      
      if.end:                                           ; preds = %if.else, %if.then
        %a5.sink = phi [10 x i32]* [ %a5, %if.else ], [ %a, %if.then ]
        %.sink = phi i32 [ %x, %if.else ], [ %add, %if.then ]
        %idxprom6 = sext i32 %i to i64
        %arrayidx7 = getelementptr inbounds [10 x i32], [10 x i32]* %a5.sink, i64 0, i64 %idxprom6
        store i32 %.sink, i32* %arrayidx7, align 4, !tbaa !20
        ret void, !dbg !22
      }
      
      ```
      where
      
      
      ```
      !11 = !DILocation(line: 9, column: 18, scope: !9)
      !12 = !DILocation(line: 9, column: 5, scope: !9)
      !18 = !DILocation(line: 11, column: 5, scope: !9)
      !19 = !DILocation(line: 11, column: 9, scope: !9)
      ```
      
      . And below is after gvn-hoist:
      
      
      ```
      define void @foo(i32 %x, i32 %y, i32 %i) !dbg !4 {
      entry:
        %tobool = icmp ne i32 %y, 0, !dbg !8
        %idxprom = sext i32 %i to i64, !dbg !10
        %0 = getelementptr inbounds [10 x %struct.S1*], [10 x %struct.S1*]* @s1, i64 0, i64 %idxprom, !dbg !10
        %1 = load %struct.S1*, %struct.S1** %0, align 8, !dbg !10, !tbaa !11
        br i1 %tobool, label %if.then, label %if.else, !dbg !15
      
      if.then:                                          ; preds = %entry
        %add = add nsw i32 %x, %y, !dbg !16
        %arrayidx = getelementptr inbounds [10 x %struct.S1*], [10 x %struct.S1*]* @s1, i64 0, i64 %idxprom, !dbg !10
        %a = getelementptr inbounds %struct.S1, %struct.S1* %1, i32 0, i32 0, !dbg !17
        br label %if.end, !dbg !10
      
      if.else:                                          ; preds = %entry
        %arrayidx4 = getelementptr inbounds [10 x %struct.S1*], [10 x %struct.S1*]* @s1, i64 0, i64 %idxprom, !dbg !18
        %a5 = getelementptr inbounds %struct.S1, %struct.S1* %1, i32 0, i32 0, !dbg !19
        br label %if.end
      
      if.end:                                           ; preds = %if.else, %if.then
        %a5.sink = phi [10 x i32]* [ %a5, %if.else ], [ %a, %if.then ]
        %.sink = phi i32 [ %x, %if.else ], [ %add, %if.then ]
        %arrayidx7 = getelementptr inbounds [10 x i32], [10 x i32]* %a5.sink, i64 0, i64 %idxprom
        store i32 %.sink, i32* %arrayidx7, align 4, !tbaa !20
        ret void, !dbg !22
      }
      
      ```
      As you see, loads and their GEPs have been hosited from if.then/if.else block to entry block. However, DebugLoc metadata of these new instructions are still same as the instructions in if.then block, as they are moved/cloned from if.then block. This may result incorrect stepping and imprecise sample profile result.
      
      Reviewers: majnemer, pcc, sebpop
      
      Reviewed By: sebpop
      
      Subscribers: llvm-commits
      
      Differential Revision: https://reviews.llvm.org/D29377
      
      llvm-svn: 294250
      44a856f7
    • Tim Northover's avatar
      GlobalISel: fall back gracefully when we can't map an operand's size. · 6f2db57d
      Tim Northover authored
      AArch64 was asserting when it was asked to provide a register-bank of a size it
      couldn't deal with (in this case an s128 IMPLICIT_DEF). But we want a robust
      fallback path so this isn't allowed.
      
      llvm-svn: 294248
      6f2db57d
    • Tim Northover's avatar
      GlobalISel: legalize G_INSERT instructions · 0e6afbdd
      Tim Northover authored
      We don't handle all cases yet (see arm64-fallback.ll for an example), but this
      is enough to cover most common C++ code so it's a good place to start.
      
      llvm-svn: 294247
      0e6afbdd
Loading