Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(44)

Unified Diff: tests_lit/llvm2ice_tests/balloc.ll

Issue 490333003: Subzero: Fix address mode optimization involving phi temporaries. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Clean up and better document the test Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/IceTargetLoweringX8632.cpp ('K') | « src/llvm2ice.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests_lit/llvm2ice_tests/balloc.ll
diff --git a/tests_lit/llvm2ice_tests/balloc.ll b/tests_lit/llvm2ice_tests/balloc.ll
new file mode 100644
index 0000000000000000000000000000000000000000..5d288f427a5006cfbcad639fc1f10a8ed5d7629d
--- /dev/null
+++ b/tests_lit/llvm2ice_tests/balloc.ll
@@ -0,0 +1,102 @@
+; This is a real function that led to a bug in the address mode
+; optimization code. It followed assignment chains through non-SSA
+; temporaries created from Phi instruction lowering.
+;
+; This test depends to some degree on the stability of "--verbose
+; addropt" output format.
+
+; RUN: %llvm2ice -O2 --verbose addropt %s | FileCheck %s
jvoung (off chromium) 2014/08/27 16:21:08 It would probably be better to name the file after
Jim Stichnoth 2014/08/27 20:23:15 Done.
+
+declare i32 @_calloc_r(i32, i32, i32)
+
+define internal i32 @_Balloc(i32 %ptr, i32 %k) {
+entry:
+ %gep = add i32 %ptr, 76
+ %gep.asptr = inttoptr i32 %gep to i32*
+ %0 = load i32* %gep.asptr, align 1
+ %cmp = icmp eq i32 %0, 0
+ br i1 %cmp, label %if.then, label %if.end5
+
+if.then: ; preds = %entry
+ %call = tail call i32 @_calloc_r(i32 %ptr, i32 4, i32 33)
+ %gep.asptr2 = inttoptr i32 %gep to i32*
+ store i32 %call, i32* %gep.asptr2, align 1
+ %cmp3 = icmp eq i32 %call, 0
+ br i1 %cmp3, label %return, label %if.end5
+
+if.end5: ; preds = %if.then, %entry
+ %1 = phi i32 [ %call, %if.then ], [ %0, %entry ]
+ %gep_array = mul i32 %k, 4
+ %gep2 = add i32 %1, %gep_array
+ %gep2.asptr = inttoptr i32 %gep2 to i32*
+ %2 = load i32* %gep2.asptr, align 1
+; The above load instruction is a good target for address mode
+; optimization. Correct analysis would lead to dump output like:
+; Starting computeAddressOpt for instruction:
+; [ 15] %__13 = load i32* %gep2.asptr, align 1
+; Instruction: [ 14] %gep2.asptr = i32 %gep2
+; results in Base=%gep2, Index=<null>, Shift=0, Offset=0
+; Instruction: [ 13] %gep2 = add i32 %__9, %gep_array
+; results in Base=%__9, Index=%gep_array, Shift=0, Offset=0
+; Instruction: [ 46] %__9 = i32 %__9_phi
+; results in Base=%__9_phi, Index=%gep_array, Shift=0, Offset=0
+; Instruction: [ 12] %gep_array = mul i32 %k, 4
+; results in Base=%__9_phi, Index=%k, Shift=2, Offset=0
+;
+; Incorrect, overly-aggressive analysis would lead to output like:
+; Starting computeAddressOpt for instruction:
+; [ 15] %__13 = load i32* %gep2.asptr, align 1
+; Instruction: [ 14] %gep2.asptr = i32 %gep2
+; results in Base=%gep2, Index=<null>, Shift=0, Offset=0
+; Instruction: [ 13] %gep2 = add i32 %__9, %gep_array
+; results in Base=%__9, Index=%gep_array, Shift=0, Offset=0
+; Instruction: [ 46] %__9 = i32 %__9_phi
+; results in Base=%__9_phi, Index=%gep_array, Shift=0, Offset=0
+; Instruction: [ 49] %__9_phi = i32 %__4
+; results in Base=%__4, Index=%gep_array, Shift=0, Offset=0
+; Instruction: [ 12] %gep_array = mul i32 %k, 4
+; results in Base=%__4, Index=%k, Shift=2, Offset=0
+;
+; CHECK-NOT: results in Base=%__4,
+;
+ %cmp7 = icmp eq i32 %2, 0
+ br i1 %cmp7, label %if.else, label %if.then8
+
+if.then8: ; preds = %if.end5
+ %.asptr = inttoptr i32 %2 to i32*
jvoung (off chromium) 2014/08/27 16:21:08 Does the rest of this test matter, or can it just
Jim Stichnoth 2014/08/27 20:23:15 Done.
+ %3 = load i32* %.asptr, align 1
+ %gep2.asptr3 = inttoptr i32 %gep2 to i32*
+ store i32 %3, i32* %gep2.asptr3, align 1
+ br label %if.end15
+
+if.else: ; preds = %if.end5
+ %shl = shl i32 1, %k
+ %sub = shl i32 %shl, 2
+ %add = add i32 %sub, 20
+ %call11 = tail call i32 @_calloc_r(i32 %ptr, i32 1, i32 %add)
+ %cmp12 = icmp eq i32 %call11, 0
+ br i1 %cmp12, label %return, label %if.end14
+
+if.end14: ; preds = %if.else
+ %gep5 = add i32 %call11, 4
+ %gep5.asptr = inttoptr i32 %gep5 to i32*
+ store i32 %k, i32* %gep5.asptr, align 1
+ %gep7 = add i32 %call11, 8
+ %gep7.asptr = inttoptr i32 %gep7 to i32*
+ store i32 %shl, i32* %gep7.asptr, align 1
+ br label %if.end15
+
+if.end15: ; preds = %if.end14, %if.then8
+ %rv.0 = phi i32 [ %2, %if.then8 ], [ %call11, %if.end14 ]
+ %gep9 = add i32 %rv.0, 16
+ %gep9.asptr = inttoptr i32 %gep9 to i32*
+ store i32 0, i32* %gep9.asptr, align 1
+ %gep11 = add i32 %rv.0, 12
+ %gep11.asptr = inttoptr i32 %gep11 to i32*
+ store i32 0, i32* %gep11.asptr, align 1
+ br label %return
+
+return: ; preds = %if.end15, %if.else, %if.then
+ %retval.0 = phi i32 [ %rv.0, %if.end15 ], [ 0, %if.then ], [ 0, %if.else ]
+ ret i32 %retval.0
+}
« src/IceTargetLoweringX8632.cpp ('K') | « src/llvm2ice.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698