[PATCH] D27169: [x86] Fix getAddressFromInstr

Michael LeMay via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 7 08:23:04 PST 2017


mlemay-intel updated this revision to Diff 87452.
mlemay-intel added a comment.

Added test.


https://reviews.llvm.org/D27169

Files:
  lib/Target/X86/X86InstrBuilder.h
  test/CodeGen/X86/safestack-bounds-checking-combiner.mir


Index: test/CodeGen/X86/safestack-bounds-checking-combiner.mir
===================================================================
--- test/CodeGen/X86/safestack-bounds-checking-combiner.mir
+++ test/CodeGen/X86/safestack-bounds-checking-combiner.mir
@@ -28,11 +28,33 @@
     ret void
   }
 
+  %struct.glob_s = type { i32, i32 }
+
+  @x = external local_unnamed_addr global [1 x %struct.glob_s], align 4
+
+  ; Function Attrs: nounwind safestack uwtable
+  define void @glob_access(i32 %i) local_unnamed_addr #0 {
+  entry:
+    %idxprom = sext i32 %i to i64
+    %y = getelementptr inbounds [1 x %struct.glob_s], [1 x %struct.glob_s]* @x, i64 0, i64 %idxprom, i32 0
+    %0 = bitcast i32* %y to i8*
+    %1 = getelementptr i8, i8* %0, i64 4
+    call void asm "bndcu $0, %bnd0", "*m"(i8* %1)
+    store i32 0, i32* %y, align 4
+    %z = getelementptr inbounds [1 x %struct.glob_s], [1 x %struct.glob_s]* @x, i64 0, i64 %idxprom, i32 1
+    %2 = bitcast i32* %z to i8*
+    %3 = getelementptr i8, i8* %2, i64 4
+    call void asm "bndcu $0, %bnd0", "*m"(i8* %3)
+    store i32 0, i32* %z, align 4
+    ret void
+  }
+
   attributes #0 = { nounwind safestack uwtable "target-features"="+mpx,+separate-stack-seg" }
 
 ...
 ---
 name:            overflow_gep_store
+# CHECK-LABEL: name:            overflow_gep_store
 alignment:       4
 exposesReturnsTwice: false
 legalized:       false
@@ -70,3 +92,42 @@
     RETQ
 
 ...
+---
+name:            glob_access
+# CHECK-LABEL: glob_access
+alignment:       4
+exposesReturnsTwice: false
+legalized:       false
+regBankSelected: false
+selected:        false
+tracksRegLiveness: true
+liveins:
+  - { reg: '%edi' }
+frameInfo:
+  isFrameAddressTaken: false
+  isReturnAddressTaken: false
+  hasStackMap:     false
+  hasPatchPoint:   false
+  stackSize:       0
+  offsetAdjustment: 0
+  maxAlignment:    0
+  adjustsStack:    false
+  hasCalls:        false
+  maxCallFrameSize: 0
+  hasOpaqueSPAdjustment: false
+  hasVAStart:      false
+  hasMustTailInVarArgFunc: false
+body:             |
+  bb.0.entry:
+    liveins: %edi
+
+    %rax = MOVSX64rr32 killed %edi
+    INLINEASM $"bndcu $0, %bnd0", 8, 196654, _, 8, %rax, @x + 4, _
+    ; CHECK: INLINEASM $"bndcu $0, %bnd0", 8, 196654, _, 8, %rax, @x + 8, _
+    MOV32mi _, 8, %rax, @x, _, 0
+    INLINEASM $"bndcu $0, %bnd0", 8, 196654, _, 8, %rax, @x + 8, _
+    ; CHECK-NOT: INLINEASM $"bndcu $0, %bnd0", 8, 196654, _, 8, %rax, @x + 8, _
+    MOV32mi _, 8, killed %rax, @x + 4, _, 0
+    RETQ
+
+...
Index: lib/Target/X86/X86InstrBuilder.h
===================================================================
--- lib/Target/X86/X86InstrBuilder.h
+++ lib/Target/X86/X86InstrBuilder.h
@@ -109,9 +109,11 @@
   AM.IndexReg = Op2.getReg();
 
   const MachineOperand &Op3 = MI->getOperand(Operand + 3);
-  if (Op3.isGlobal())
+  // FIXME: Handle additional types of memory references below.
+  if (Op3.isGlobal()) {
     AM.GV = Op3.getGlobal();
-  else
+    AM.Disp = Op3.getOffset();
+  } else
     AM.Disp = Op3.getImm();
 
   return AM;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27169.87452.patch
Type: text/x-patch
Size: 3038 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170207/31e95078/attachment.bin>


More information about the llvm-commits mailing list